首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

DLL调用有关问题.

2012-02-17 
DLL调用问题.急!!!动态库test.dll用C语言编写,支持各种编程语言调用。函数原型:voidfun(constchar*in,char*

DLL调用问题.急!!!
动态库test.dll
用C语言编写,支持各种编程语言调用。

函数原型:
void   fun(const   char   *in,   char**   out)  

    in:   传入参数,为加密后的密文字符串。
    out:传出参数,为解密后的返回明文字符串。


调用方法:
    char**   out
    fun( 'ABCDEF ',out)


以上是DLL说明;
我在程序中做如下调用
procedure   discryptpassword   (const   instr   :   PChar     ;   var   outstr   :   PPchar)   ;stdcall;external 'stkey.dll ';
.
.
.
.
var
      instr   ,   outstr   :   string;
      pin   :   PChar;
      pout   :   PChar;
      ppout   :   PPChar;
begin
        instr   :=   pwdlist[ComboBox1.ItemIndex];       //取加密的字符串
        pin   :=   Pchar(instr);

        pout   :=   Pchar(outstr);
        ppout   :=   @pout   ;

        showmessage(instr);
        discryptpassword(pin   ,   ppout);       //解密
        showmessage(outstr)   ;
end;

但是调用后的outstr   还是个空串,没有得到对应的明文.


[解决办法]
理论上这样调用是没有问题的

var
s:string;
outstr : PPchar;
begin
s:= '212121 ';
discryptpassword (PChar(s) ,outStr );
end;
[解决办法]
是不是delphi和dll里的调用约定不一样

[解决办法]
var
s:string;
outstr : PChar;
begin
try
outstr:=stralloc(1024);
s:= '212121 ';
discryptpassword (PChar(s) ,outStr );
finally
strdispose(outstr);
end;
end;
[解决办法]
没有给OUT开辟空间。
[解决办法]
可以分静态和动态调用,上面说的都是静态调用,下面的是动态调用你可以试试
procedure TForm1.Button1Click(Sender: TObject);
type
TAddNumber=function(Num1,Num2:Integer):Integer;stdcall;
Var
aptr:TFarproc;
Lhnd:THandle;
s,t,d:integer;
begin
s:=1;
t:=3;
Lhnd:=Loadlibrary( 'AddNum.dll ');
aptr:=GetprocAddress(lhnd, 'AddNumber ');
d:=TAddNumber(aptr)(s,t);
Edit1.Text:=IntToStr(d);
FreeLibrary(Lhnd);
end;

热点排行