dll的调用方式(300分)

  • 主题发起人 主题发起人 seeip
  • 开始时间 开始时间
S

seeip

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个VC++的DLL,
myfunc(char* szPlantext,int iLen_in,char* szKey, int iLen_out, char* szCiphertext)
第一个参数是明文字符串的地址指针,第二个参数是要加密的明文的长度,第三个是密钥字符串的地址指针,第四个是密文的长度,第五个参数是保存加密后的字符串的缓冲区地址。

. 8D85 EEF7FFFF lea eax, [ebp-812]
. 50 push eax ;空内容;存放结果
. 56 push esi ;EAX长度
. 8D85 EDF3FFFF lea eax, [ebp-C13] :ASCII'ABCD1234',这里是密钥;
. 50 push eax
. 57 push edi ;EAX长度
. 8D85 EFFBFFFF lea eax, [ebp-411] ;ASCII'123456789'明文
. 50 push eax
. E8 8604FFFF call <jmp.&dll.myfunc> 这里是调用了DLL


在DELPHI下,调用过程如下:
function myfunc(min:pchar; mi:integer;key:pchar; ki:integer; s:pchar):pchar ;stdcall; external 'mydll.dll'

现在的问题是,并不能给出正确的密文.
反汇编后是下面的形式.
|. 50 push eax
|. 8B45 F0 mov eax, [ebp-10]
|. 50 push eax
|. 56 push esi
|. 57 push edi
|. 53 push ebx

问题:1)怎么会出现调用时,一个是PUSH 时,都是EAX ,我重新写的怎么都会一个接一个的PUSH呢?
问题:2)下面的这两句的区别?
function myfunc(min:pchar; .............
function myfunc(VAR min:pchar;..........
问题3)如果是在DELPHI中嵌入汇编如何实现以上调用.
 
问题(2)不带var的,在函数中修改其值,输出时保持其原来的值。而带var的相反。
 
根据你的说明,那个VC的MyFunc的参数表已经非常的完备了,根本就没有返回值。而你的
Delphi声明将它变成了一个返回值为PChar的Function。我以为应该声明为 Procedure 才是
正确的做法。试试看?
 
试试:
Procedure myfunc(szPlantext:AnsiString; iLen_in: integer; szKey:AnsiString; iLen_out:integer; szCiphertext:AnsiString); stdcall; external 'mydll.dll';

调用时先 Setlength(szCiphertext,合理的长度)
 
delphi和vc++的调用惯例有冲突,
 
如果VC++中没有声明WINAPI,最好用cdecl方式调用。试试
function myfunc(min:pchar; mi:integer;key:pchar; ki:integer; s:pchar):pchar ;cdecl; external 'mydll.dll'; //cdecl

PChar是指针,不需要加 Var
 
后退
顶部