Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.12.05 16:20. Заголовок: Проблема с вызвом из DLL функции, написанной на xharbour
Работаю в Windows XP. Пишу myDll.prg : procedure printName1() ? "Ivan 1" return function getName2() return "Ivan 2" Собираю : C:\xharbour\bin\harbour.exe myDll.prg /D__EXPORT__ /n /q0 /gc /w0 bcc32.exe -c /D__EXPORT__ -O2 -d -IC:\xharbour\include myDll.c ilink32.exe -aa -Gn -Gi -Tpd @myDll.lnk Содержимое myDll.lnk : myDll.obj DllEntryPoint.obj,myDll.dll,,cw32.lib C:\xharbour\lib\harbour.lib import32.lib uuid.lib DllEntryPoint.obj получен так : tasm32.exe DllEntryPoint.asm Содержимое DllEntryPoint.asm : ;----------------------------------------------------------------------------- ; Модуль точки входа для DLL 32-х битных библиотек ;----------------------------------------------------------------------------- .386 ; Использование команд процессора не выше 80x386 .MODEL flat, stdcall ; Плоская модель памяти, стандартный вызов .CODE ; Секция констант программы ;----------------------------------------------------------------------------- align 4 ; Выравнивание по 4-х байтовой границе DllMain proc mov eax, 1 ; Возвращать TRUE ret 12 ; Восстанавливать 3 параметра типа DWORD DllMain endp ;----------------------------------------------------------------------------- END DllMain Получил myDll.obj, myDll.lib и myDll.dll, причем в последнем видим следующее : myDll.dll _HB_FUN_GETNAME1 ___CPPdebugHook Если пишу myPrg.prg : procedure main() ? "Начало программы" printName1() ? "Середина программы" ? getName2() ? "Конец программы" inkey(3) return и компилирую : C:\xharbour\bin\harbour.exe myPrg.prg /n /q0 /gc /w0 bcc32.exe -O2 -d -IC:\xharbour\include -LC:\xharbour\lib myPrg.c ct.lib what32.lib libnf.lib whoo.lib harbour.lib common.lib debug.lib vm.lib rtl.lib gtwin.lib lang.lib rdd.lib macro.lib pp.lib dbfdbt.lib dbffpt.lib dbfntx.lib dbfcdx.lib samples.lib hbzip.lib myDll.lib , то программа сообщает : Начало программы Ivan1 Середина программы Ivan2 Конец программы , что и требовалось. Теперь, если я пишу : #include <stdio.h> #define EXPORT extern __stdcall EXPORT void _HB_FUN_PRINTNAME1(void); //extern void HB_FUN_PRINTNAME1(void); char *s1 = "Начало программы."; main() { puts(s1); _HB_FUN_PRINTNAME1(); return 0; } и компилирую : C:\bcc55\bin\bcc32.exe -O2 -d myC.c myDll.lib , то программа сообщает : Начало программы и вываливается. Вариант с extern тоже не прошел. В чем моя ошибка ? Неверно содержимое DllEntryPoint.asm ? Как заставить работать фунции xharbour из си-программы ?
|
|
|
Ответов - 2
[только новые]
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 13.12.05 07:43. Заголовок: Re:
Маленькое извинение : пока писал письмо экспериментировал и изменил содержимое myDll.dll. Сечас там конечно же нету ни _HB_FUN_GETNAME1 ни ___CPPdebugHook, а только _HB_FUN_PRINTNAME1 и _HB_FUN_GETNAME2. Все остальное по тексту.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 15.12.05 18:46. Заголовок: увы, все сложнее...
обсуждения тут news://xharbour.org:119/brnaal$svq$1@www.fivetech.net news://xharbour.org:119/417eb1e3$1@bekz-be. news://xharbour.org:119/424a1c36@bekz-be. пример - только в Harbour Harbour\contrib\delphi\hbdll\
|
|
|
|