Форум: "KOL";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Внизпроблема с передачей параметров Найти похожие ветки
← →
DeimosX7 © (2005-03-27 23:16) [0]Суть проблемы.. Из программы написанной на Ассемблере вызывается DLL написанная с исп-ем KOL, ей в кач-ве параметра передаётся указатель на строку (LPCTSTR). нужно эту строку получить и обработать внутри dll..
Ничего не выходит. Самое смешное.. если dll написать на Ассемблере то всё путём.. параметр получается и обрабатывается нормально.. Где грабли?
вот код dll (упростил до последнего.. лишь бы проверить факт получения параметра.. и всё-равно ничего не выходит)
//------------------------------
library test;
uses
windows,
kol;
procedure decode(source:LPCTSTR);export;
begin
showMessage(source^);
end;
exports
decode name "DECODE";
begin
end;
//------------------------------
← →
mdw © (2005-03-28 11:21) [1]А параметр из программы как передаешь? Для приведенного кода кода source должен быть в регистре AX. И зачем директива export?
← →
SPeller © (2005-03-28 13:32) [2]МОжет stdcall спасет?
← →
DeimosX7 © (2005-03-28 14:41) [3]для проверки написал вот такую прогу(MASM):
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
LibName db "jd.dll",0
FunctionName db "DECODE",0
DllNotFound db "Не могу найти нужную DLL",0
FunctionNotFound db "Функция не найдена",0
text db "some текст",0
.data?
hLib dd ? ; хэндл библиотеки (DLL)
DecodeAddr dd ? ; адpес функции
.code
start:
invoke LoadLibrary,addr LibName
.if eax==NULL
invoke MessageBox,NULL,addr DllNotFound,NULL,MB_OK
.else
mov hLib,eax
invoke GetProcAddress,hLib,addr FunctionName
.if eax==NULL
invoke MessageBox,NULL,addr
FunctionNotFound,NULL,MB_OK
.else
mov DecodeAddr,eax
push offset text
call[DecodeAddr]
.endif
invoke FreeLibrary,hLib
.endif
invoke ExitProcess,NULL
end start
экспорт остался от оригинальной библиотеки , он впринципе мешать не должен..
самый смех: вот код библиотеки на MASM - она нормально работает, хотя делает то-же
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
MsgBoxCaption db "ОК",0
.data?
Text db ?
.code
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE
ret
DllEntry Endp
DECODE proc source:LPCTSTR
invoke MessageBox, NULL,source,addr MsgBoxCaption, MB_OK
ret
DECODE endp
End DllEntry
как это на KOL состряпать..?
может я делаю что-то не так.?
← →
mdw © (2005-03-28 15:41) [4]В Delphi, по умолчанию, передача параметров происходит через регистры EAX, EDX, ECX далее используется стек. Поэтому при вызове procedure decode, source:LPCTSTR нужно помещать в EAX, а не в стек. Или явно указать используемую модель:
procedure decode(source:LPCTSTR); StdCall;
begin
showMessage(source^);
end;
← →
Владимир Кладов (2005-03-28 15:53) [5]опять stdcall.
← →
DeimosX7 © (2005-03-28 17:14) [6]а как получить всю строку ?
почему-то таким способом получается только перый символ..
← →
mdw © (2005-03-28 17:19) [7]procedure decode(source:LPCTSTR);export;
begin
showMessage(String(source));
end;
← →
SPeller © (2005-03-28 18:08) [8]Ептить:
procedure decode(source:LPCTSTR);export; stdcall;
← →
DeimosX7 © (2005-03-28 20:45) [9]благодарю .. разгрёбся
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.051 c