Автор | Сообщение |
|
| постоянный участник
|
Пост N: 1
Зарегистрирован: 25.12.07
|
|
Отправлено: 25.12.07 17:41. Заголовок: C чего начать? Есть ли С-API? И т. д.
Здравствуйте. Хотелось бы услышать советы и рекомендации, во-первых, "откуда качать, что ставить и т.п.". И второе, это информация по С-API. Объясню свою ситуацию. Я не клипперист (дельфист), однако, получилось, что плотно познакомился с Clipper и Alaska Xbase++. Для Alaska Xbase написал дельфи-оболочку над С-API и полностью портировал FastReport (генератор отчетов) для этого языка, продукт продается и т.д (см. http://www.hotsoft.ru/ALASKA/frax_eng.htm). Но вот стал получать много писем из Испании Призывают тоже самое сделать для Harbour/xHarbour/FiveWin и т. д.. Так как ничего до этого про Harbour не знал (слышал краем уха только), то хочется и услышать советы по поводу "с чего начать, на что обратить внимание", да и вообще советы по поводу "а стоит ли заморачиваться, есть ли здесь рынок и т.д." Спасибо. Спирин Сергей.
|
|
|
Ответов - 201
, стр:
1
2
3
4
5
6
7
8
9
10
11
All
[только новые]
|
|
|
| Администратор
|
Пост N: 679
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.07 14:49. Заголовок: dbSkip() может наход..
dbSkip() может находится как в основной exe, так и в harbour.dll. Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно, из harbour.dll - без проблем, если при создании frsyst.dll линковать ее вместе с Harbour.dll Поскольку для Харбора допустимы оба режима: как с dll, так и без, а большинство пользователей с dll не заморачиваются, будем считать, что напрямую из frsyst вызвать dbSkip нельзя Значит, надо dbSkip() вызывать из интерфейсной lib, которая будет прилинковываться к харбор-программе независимо от ее режима, и взаимодействовать с frsyst.dll
|
|
|
|
| постоянный участник
|
Пост N: 332
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 15:01. Заголовок: C-API Harbour hbvm.h..
C-API [x]Harbour hbvm.h extern HB_EXPORT void hb_vmDo( USHORT uiParams ); /* invoke the virtual machine */ extern HB_EXPORT void hb_vmFunction( USHORT uiParams ); /* executes a function */ extern HB_EXPORT void hb_vmSend( USHORT uiParams ); /* sends a message to an object */ extern HB_EXPORT PHB_ITEM hb_vmEvalBlock( PHB_ITEM pBlockItem ); /* executes passed codeblock with no arguments */ /* executes passed codeblock with variable number of arguments */ extern HB_EXPORT PHB_ITEM hb_vmEvalBlockV( PHB_ITEM pBlockItem, ULONG ulArgCount, ... ); extern HB_EXPORT PHB_ITEM hb_vmEvalBlockOrMacro( PHB_ITEM pItem ); /* executes codeblock or macro pointed by given item */ extern HB_EXPORT void hb_vmDestroyBlockOrMacro( PHB_ITEM pItem ); /* destroy codeblock or macro in given item */ Маленький пример, в [x]Harbour (prg level) определена функция _ONTIMEREVENTS VOID CALLBACK TTimerProc( HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { if ( ! pSymbolEvents ) pSymbolEvents = hb_dynsymSymbol( hb_dynsymGet( "_ONTIMEREVENTS" ) ); // есть такая функция или нет if ( pSymbolEvents ) // если есть { hb_vmPushSymbol( pSymbolEvents ); //перед выполнением помещаем p-code функции в стек hb_vmPushNil(); // обязательно hb_vmPushLong( ( LONG ) hWnd ); //передаем первый параметр числовой в данном случае hb_vmPushLong( uMsg ); // передаем второй параметр hb_vmPushLong( idEvent ); // передаем третий hb_vmPushLong( dwTime ); // передаем 4- параметр hb_vmDo( 4 ); // виртуальная машина [x]Harbour выполняет код помещенный в стек - что значит 4 обьяснять смысла нет к результату выполнения можно достучаться hb_param( -1, HB_IT_LONG) или проще hb_parnl( -1 ) } }
|
|
|
|
| Администратор
|
Пост N: 680
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.07 15:02. Заголовок: Кстати, к слову Мне ..
Кстати, к слову Мне кажется, что сейчас пользователей у Харбора куда больше, чем у Alaska xBase
|
|
|
|
| постоянный участник
|
Пост N: 333
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 15:06. Заголовок: Pasha пишет: Из осн..
Pasha пишет: цитата: | Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно |
| Довольно спорное утверждение
|
|
|
|
| постоянный участник
|
Пост N: 10
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 15:07. Заголовок: Pasha пишет: Из осн..
Pasha пишет: цитата: | Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно |
| Здесь не факт, хотя нюансы могут быть. Почему не передать указатель на dbSkip(), а в dll присвоить прототипу... Но действительно, больше интересно: цитата: | Значит, надо dbSkip() вызывать из интерфейсной lib, которая будет прилинковываться к харбор-программе независимо от ее режима, и взаимодействовать с frsyst.dll |
| Отсюда вопрос: Как будет выглядеть функция на С, вызывающая любую харбур-функцию. Типа: CallAnyHarbourFunc(cFuncName, xListOfParametrs) возврат xValue ?
|
|
|
|
| постоянный участник
|
Пост N: 334
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 15:13. Заголовок: Pasha пишет: Мне ка..
Pasha пишет: цитата: | Мне кажется, что сейчас пользователей у Харбора куда больше, чем у Alaska xBase |
| Мне тоже, но часть этих пользователей пользуется не коммерческими, а GPL разработками и заставить их что-то купить - это значит оскорбить их религиозные чувства
|
|
|
|
| постоянный участник
|
Пост N: 11
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 15:19. Заголовок: Петр пишет: Мне тож..
Петр пишет: цитата: | Мне тоже, но часть этих пользователей пользуется не коммерческими, а GPL разработками и заставить их что-то купить - это значит оскорбить их религиозные чувства |
| В переписке с испанцами, я переспрашивал их. Говорят купим Но честно говоря, я колебался (и сейчас колеблюсь) именно из-за этого...
|
|
|
|
| Администратор
|
Пост N: 681
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.07 15:20. Заголовок: Чтобы напрямую испол..
Чтобы напрямую использовать из frsyst harbour vm, надо ее по крайней мере прилинковать А это значит, что vm будет содержаться и в основном exe, и в frsyst.dll, что не есть хорошо, а наоборот, очень плохо. А пример вызова харбор-функции Петр дал. Педед вызовом в стек харбора надо затолкать параметры функции. Но может быть стоит вызывать не харбор-функцию, а ее аналог на C, к примеру, средства rdd Что касается dbSkip, это может выглядеть так: #include "hbapi.h" #include "hbapirdd.h" ... AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer(); long lRecToSkip = ...; if( pArea ) SELF_SKIP( pArea, lRecToSkip );
|
|
|
|
| Администратор
|
Пост N: 682
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.07 15:23. Заголовок: Петр пишет: Pasha п..
Петр пишет: цитата: | Pasha пишет: цитата: Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно Довольно спорное утверждение |
| Я имел в виду вызов из внешней dll (frsyst) функции, находящейся в основном exe-модуле программы Как это сделать, я не представляю
|
|
|
|
| постоянный участник
|
Пост N: 12
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 16:03. Заголовок: Pasha пишет: Я имел..
Pasha пишет: цитата: | Я имел в виду вызов из внешней dll (frsyst) функции, находящейся в основном exe-модуле программы Как это сделать, я не представляю |
| Чисто теоретически это просто. Я не буду "мучится" и писать пример на С (я все-таки дельфист ). Поэтому пример на Паскале, он язык читабельный: EXE: type TCallBack = procedure (P: Pointer); stdcall; procedure MMsg(P: PChar); begin ShowMessage(StrPas(P)); end; procedure TForm1.Button1Click(Sender: TObject); var CallBack: TCallBack; H: THandle; begin H := LoadLibrary('Project2.dll'); @CallBack := GetProcAddress(H, 'CallBack'); CallBack(@MMsg); <----------------------------передаем адрес процедуры MMsg FreeLibrary(H); end; ------------------------- DLL: type TMsgProc = procedure (P: PChar); procedure CallBack(P: Pointer); stdcall; export; var MsgProc: TMsgProc; begin @MsgProc := P; <-------------------------------------------- присваиваем адрес MsgProc(PChar('Это dll вызвала процедуру в exe !!!!')); <-------- и вызываем end; exports CallBack name 'CallBack'; -------------------------------------------------------------------- Ну вот, только что проверил в Delphi, все OK. Оттого, что EXE будет С-ишное, это ничего не поменяет. То есть, в MMsg можно по моей задумке поместить: CallAnyHarbourFunc(cFuncName, xListOfParametrs) -> xValue ... Понятно, что не все так просто, параметры и т. д. , но если прототип заработает, то это уже.. неплохо будет.... Спирин Сергей.
|
|
|
|
| постоянный участник
|
Пост N: 13
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 16:40. Заголовок: Меня все-таки интере..
Меня все-таки интересуют возможные подходы реализации функции: CallAnyHarbourFunc(cFuncName, xListOfParametrs) -> xValue ... Возможно, реализация этой функции может быть чисто на Харбуре, плюс какая-то С-оболочка к ней , адрес этой оболочки и будет передаваться в Fast? Хотя, в Аляске есть просто С-API функция - _conCallPa(). Может что-то подобное есть и Харбуре? Спирин Сергей.
|
|
|
|
|
| постоянный участник
|
Пост N: 335
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 16:44. Заголовок: Чем не устраивает то..
Чем не устраивает то, что я написал?
|
|
|
|
| Администратор
|
Пост N: 683
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.07 16:45. Заголовок: Такой способ по-види..
Такой способ по-видимому будет работать В этом случае я советую обратить внимание на то, что из-за трансляции средствами препроцессора (#define) настоящее имя функции может быть другим Надо внимательно смотреть на описание каждой функции в *.h
|
|
|
|
| постоянный участник
|
Пост N: 336
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 16:53. Заголовок: Sergey Spirin пишет:..
|
|
|
|
| постоянный участник
|
Пост N: 14
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 17:10. Заголовок: Петр пишет: Чем не ..
Петр пишет: цитата: | Чем не устраивает то, что я написал? |
| Почему не устраивает? Спасибо. Кстати, если можно еще раз "выжимку" про VM. Почему это плохо использовать (по словам Pasha)? И, это будет работать только с harbour.dll? Или в "монолитном" exe тоже? Простите, я действительно пока здесь новичек. Спирин Сергей.
|
|
|
|
| постоянный участник
|
Пост N: 15
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 17:17. Заголовок: Петр пишет: Поэтому..
Петр пишет: Честно говоря, тоже не понял Вашу ссылку, мне для примера на Паскале быстрее набросать просто, да и проверить... Но все-равно, спасибо, увидел, что в Харбуре загружать dll намного удобнее чем в той же Аляске
|
|
|
|
| Администратор
|
Пост N: 684
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.07 17:21. Заголовок: Sergey Spirin пишет:..
Sergey Spirin пишет: цитата: | Кстати, если можно еще раз "выжимку" про VM. Почему это плохо использовать (по словам Pasha)? И, это будет работать только с harbour.dll? Или в "монолитном" exe тоже? |
| Плохо иметь две vm. В этом случает одна из них работать не будет А если vm будет содержаться в харбор-программе (exe), и будет механизм вызова функций vm из сторонней dll, то ничего в этом плохого нет
|
|
|
|
| постоянный участник
|
Пост N: 16
Зарегистрирован: 25.12.07
|
|
Отправлено: 26.12.07 17:31. Заголовок: Pasha пишет: А если..
Pasha пишет: цитата: | А если vm будет содержаться в харбор-программе (exe), и будет механизм вызова функций vm из сторонней dll, то ничего в этом плохого нет |
| OK. Тогда это действительно хороший вариант. В семействе hb_vmXXX - функций, наверное, есть и для работы с переменными, массивами, объектами? Если так, то пожалуй, это то что мне надо
|
|
|
|
| постоянный участник
|
Пост N: 337
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 17:43. Заголовок: Sergey Spirin пишет:..
Sergey Spirin пишет: цитата: | Почему это плохо использовать (по словам Pasha)? И, это будет работать только с harbour.dll? Или в "монолитном" exe тоже? |
| Пример который я привел корректно работает в "монолитном" exe. Я не знаю, что имел ввиду Pasha, собственно он использует для работы xHarbour,- я Harbour. Могу лишь добавить, что по планам разработчиков Harbour, функции можно будет вызывать и использовать не только из dll, но и из другого exe файла, также можно будет использовать библиотеки hrb, но это будет в Harbour 2.0. Я Pascal не очень, понял лишь, что это вызов функции из dll, и подумал, что Вам будет интересно узнать об использовании dll в Harbour (в xHarbour функции немного иначе называются), .
|
|
|
|
| постоянный участник
|
Пост N: 338
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.12.07 17:55. Заголовок: Pasha пишет: Плохо ..
Pasha пишет: цитата: | Плохо иметь две vm. В этом случает одна из них работать не будет |
| Это в лучшем случае, скорее всего программа просто вылетит с GPF. Sergey Spirin пишет: цитата: | В семействе hb_vmXXX - функций, наверное, есть и для работы с переменными, массивами, объектами? Если так, то пожалуй, это то что мне надо |
| Это все конечно есть но не только в hb_vm, а и в hb_item*, что которые собственно и являются аналогами _con* в Alaska.
|
|
|
Ответов - 201
, стр:
1
2
3
4
5
6
7
8
9
10
11
All
[только новые]
|
|