关于dll问题。。。在线等 调用dll时,使用了它的两个函数,为什么执行第二个时提示错误:'Invalid pointer operation'? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 无效的指针操作,估计你调用函数时方法有错误;一种可能就是函数的参数你弄错了,或者你的dll没有注册。 *个人意见,仅供参考* 错! 错! 错!原因出在下面这一句: Result := StrResult;即在返回时返回一个字符串, 在动态库中不能这么做.原因很简单: 返回的字符串是在 Dll 中分配的, 在退出程序时, 主线程自动去释放字符串占用的内存空间, 而字符串的内存空间是属于 Dll 的, 这样就产生了地址越界释放的异常.应该如此改:// 增加一个释放字符串指针的函数procedure DeleteStrPointer(AValue: PChar); stdcall;begin if Assigned(AValue) then try StrDispose(AValue); except end;end;function EncryStrHex(Str, Key: PChar): PChar; stdcall;begin // ... ... // 返回动态分配的字符串 result := StrNew(PChar(strResult));end;procedure TForm1.Button1Click(Sender: TObject);var pchResult: PChar;begin pchResult := EncryStrHex(PChar(Edit1.Text), PChar(Edit1.Text)); Edit4.Text := StrPas(pchResult); // 别忘了调用释放字符串指针 DeleteStrPointer(pchResult);end; http://expert.csdn.net/Expert/topic/2266/2266900.xml?temp=.1576044 getclientthread如何调用,以取得对应线程? 没有钱用了 散分 当下载文件时,用windows的另存为下载时,我没法取到--下载到: d:\winrar.exe 中的d:\winrara.exe ,怎么回事?? 请教,退出编辑状态后,如何自动进入 简单问题-如何实现IE历史栏效果,在窗口内可以点X关闭 登录的问题! 控件的安装方法!急等! 大问题,小麻烦,帮忙解决一下? 怎样实现这个用DELPHI2就能实现的功能,大家帮忙拉 怎样得到一个工程中的所有已创建的窗口,并根据需要显示出来。 怎样向word文档中写入数据,并能达到点的控制 关于字符串数组的问题
*个人意见,仅供参考*
Result := StrResult;
即在返回时返回一个字符串, 在动态库中不能这么做.原因很简单: 返回的字符串是在 Dll 中分配的, 在退出程序时, 主线程自动去释放字符串占用的内存空间, 而字符串的内存空间是属于 Dll 的, 这样就产生了地址越界释放的异常.应该如此改:// 增加一个释放字符串指针的函数
procedure DeleteStrPointer(AValue: PChar); stdcall;
begin
if Assigned(AValue) then
try
StrDispose(AValue);
except
end;
end;function EncryStrHex(Str, Key: PChar): PChar; stdcall;
begin
// ... ... // 返回动态分配的字符串
result := StrNew(PChar(strResult));
end;procedure TForm1.Button1Click(Sender: TObject);
var
pchResult: PChar;
begin
pchResult := EncryStrHex(PChar(Edit1.Text), PChar(Edit1.Text));
Edit4.Text := StrPas(pchResult); // 别忘了调用释放字符串指针
DeleteStrPointer(pchResult);
end;