Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

проблема с передачей параметров   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
14-1130065131
nk
2005-10-23 14:58
2005.11.20
Ищу фильм, но не уверен в правильности названия...


2-1130428006
Bogdan1024
2005-10-27 19:46
2005.11.20
ООПрограммирование


14-1130473846
-=XxX=-
2005-10-28 08:30
2005.11.20
Рождаемость в России !!!


9-1120637163
Зм1й
2005-07-06 12:06
2005.11.20
OpenAL


3-1129108339
msguns
2005-10-12 13:12
2005.11.20
ADO+Access. Как в параметре задать NULL