On-line: PSP, tnsr2, гостей 0. Всего: 2 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 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 из си-программы ?



Спасибо: 0 
Профиль
Ответов - 2 [только новые]





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 13.12.05 07:43. Заголовок: Re:


Маленькое извинение : пока писал письмо экспериментировал и изменил
содержимое myDll.dll. Сечас там конечно же нету ни _HB_FUN_GETNAME1
ни ___CPPdebugHook, а только _HB_FUN_PRINTNAME1 и _HB_FUN_GETNAME2.
Все остальное по тексту.


Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 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\

Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 84
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет