起因
前两天群里有人问dll返回pchar的问题。俺就想起许多年前俺回答过这个问题。
另外 俺的回答只是一种方法,正规的方法是主动传buff参数。
林志玲说过:
一字一语爱是千种姿态
无挂无碍到现在才明白
方法有很多很多种,俺只是用一种举例。
一个变量生命周期的问题
问题:从DLL返回字符串的问题,搞了好几天了,都没解决,请各位高手来指点一下. ( 积分:100, 回复:9, 阅读:43) 来自:wyjpg, 时间:2008-12-16 13:10, ID:3935776 |
下面是DLL中的一个函数. function DecryptPW(InStr: Pchar): Pchar;stdcall; var I: Integer; j: Integer; vInStr,vOutStr:String; vKey:Integer; begin vKey:=PasswordKey; vInStr:=InStr; vOutStr:=''; for i:=1 to (length(vInStr) div 2) do begin j:=(Integer(vInStr[2*i-1])-65)*26; j:=j+(Integer(vInStr[2*i])-65); vOutStr:=vOutStr + Char(j); end; vInStr:=vOutStr; for I := 1 to Length(vInStr) do begin vOutStr[I] := char(byte(vInStr[I]) xor (vKey shr 8)); vKey := (byte(vInStr[I]) + vKey) * C1 + C2; end; showmessage('outstr='+voutstr); Result:=Pchar(vOutStr); end; |
来自:wyjpg, 时间:2008-12-16 13:11, ID:3935777 |
下面是主程序调用. function DecryptPW(InStr:String;Var OutStr:String):Boolean; type PublicDll=function ( InStr: Pchar): Pchar;stdcall; var DllHandle:THandle; Dllfarproc:Tfarproc; begin Result:=False; DllHandle:=LoadLibrary('PubFun.dll'); if DllHandle>32 then begin try Dllfarproc:=GetProcAddress(DllHandle,'DecryptPW'); if DllfarProc<>Nil then begin OutStr:=PublicDll(Dllfarproc)(Pchar(InStr)); Result:=True; end; except FreeLibrary(DllHandle); end; end else MessageBox(Application.Handle,'调用动态库失败!','提示',MB_IconInformation+MB_Ok); end; 为什么在主程序调用解密时,有时能返回正确的密码,有时不能? |
来自:hfghfghfg, 时间:2008-12-16 13:23, ID:3935783 |
把你dll的 vOutStr 改成全局变量 你现在是局部变量 |
to hfghfghfg 谢谢你,你的方法有效!能否解释一下,为什么局部变量不行,而全局变量则行? |
来自:hfghfghfg, 时间:2008-12-16 15:28, ID:3935813 |
因为 Result:=Pchar(vOutStr); 当这个 函数 执行完 局部变量 vOutStr 可能销毁 那么 Result 指向 的vOutStr 在内存中的残骸 有可能是 原来的 vOutStr 也有可能 是其他啥的 |
来自:wyjpg, 时间:2008-12-16 15:37, ID:3935816 |
哦,难怪返回的结果怪怪的.谢谢了! |
来自:wyjpg, 时间:2008-12-16 15:38, ID:3935817 |
多人接受答案了。 |