调用DLL函数返回字符串出错

blueprogrammer 2003-10-09 12:56:01
下面是我写的Dll里面的函数:
===============================
Function GetSoftInfo(Kind: String):String;stdCall
var
strKind: String;
Begin
strKind := Kind;
If strKind='Version' Then
Result := '系统1。0'
Else IF strKind='Corporation' Then
Result := '有限公司'
Else If strKind='Author' Then
Result :='设计制作';
End;



下面是库的调用
========================================
procedure TfrmMain.FormShow(Sender: TObject);
Type TGetSoftInfo = function(Kind:String):String;StdCall;
var
LibHandle: THandle;
SoftInfo: TGetSoftInfo;
begin
LibHandle := LoadLibrary('SoftInfo.dll');
If LibHandle = 0 Then
Begin
Application.MessageBox('部分程序已毁坏,请重新安装','网站更新程序',MB_OK+MB_ICONERROR);
Application.Terminate;
End
Else
Begin
@SoftInfo := GetProcAddress(LibHandle,'GetSoftInfo');
If @SoftInfo=nil then
Application.MessageBox('程序信息库出现错误,请立即联系供应商','网站更新程序',MB_OK+MB_ICONERROR)
Else
Begin
frmMain.Caption := SoftInfo('Version');//出错行
lblVersion.Caption := SoftInfo('Version');//出错行
lblCorp.Caption := softInfo('Corporation');//出错行
End;
FreeLibrary(LibHandle);
End;
end;


错误提示:
=========
Access violation at address 004042D6 in module 'WebUpdate.exe'. Read of address 01030C0C.


急需帮助,万分感激!
...全文
57 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangwangz 2003-10-09
  • 打赏
  • 举报
回复
对!如果你的dll是给delphi调用,用shortstring也可以的,如果给vc++等的话,用
Windows兼容类型PChar比较好的!
Function GetSoftInfo(Kind: shortString):shortString;stdCall
var
strKind: shortString;
Begin
strKind := Kind;
If strKind='Version' Then
Result := '系统1。0'
Else IF strKind='Corporation' Then
Result := '有限公司'
Else If strKind='Author' Then
Result :='设计制作';
End;
// 用pchar 类型的改写:
Function GetSoftInfo(Kind: shortString):pchar;stdCall
var
strKind: shortString;
Begin
strKind := Kind;
If strKind='Version' Then
Result := '系统1。0'
Else IF strKind='Corporation' Then
Result := '有限公司'
Else If strKind='Author' Then
Result :='设计制作';
End;
delphi_xizhousheng 2003-10-09
  • 打赏
  • 举报
回复
深有感触,Dll的函数返回值用Windows兼容类型PChar
outer2000 2003-10-09
  • 打赏
  • 举报
回复
唉,这个问题都回答不知道多少遍了;
方法1,用PCHAR不要用STRING;
方法2,用STRING要在你的USES第一个加SHAREMEM单元,注意,DLL和调用DLL的
UNIT文件都需要;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧