一个变量生命周期的问题

起因

前两天群里有人问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
多人接受答案了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月巴月巴白勺合鸟月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值