VB调用DELPHI dll问题

delphi6.0写的一个简单的dll,主要为了测试vb调用delphi写的dll传字符串参数和返回值为字符串的写法:--------------------------... delphi6.0写的一个简单的dll,主要为了测试vb调用delphi写的dll传字符串参数和返回值为字符
串的写法:
-------------------------------
delphi的dll源码如下:

library Project1;
uses
SysUtils,
Classes;

function myfunc(m_name:PChar;m_age:integer):PChar;stdcall;export;
begin
m_name:= 'fuck ';
m_age:=11;
Result:= m_name;
end;

function TestDll(i:integer):integer;stdcall;export;
begin
Result:=i;
end;

exports
myfunc;
exports
TestDll;

begin
end.

------------------------------
vb6.0调用:

vb6.0的工程中加入一个模块, modules中声明:

Option Explicit

Public Declare Function myfunc Lib "C:\project1.dll " (ByVal m_name As String, ByVal m_age As Integer) As String
Public Declare Function TestDll Lib "C:\project1.dll " (ByVal i As Long) As Long

在VB6.0的form上放一text,和两个button

Private Sub Command1_Click() ///这个出现内存不能为read
Text1.Text = myfunc( "abc ", 11)
End Sub

Private Sub Command2_Click() ///这个正常
Text1.Text = TestDll(2)
End Sub
展开
 我来答
madfish73
2011-04-24 · 超过26用户采纳过TA的回答
知道答主
回答量:54
采纳率:100%
帮助的人:32.6万
展开全部
在DLL函数返回值中返回字符串不是一个好习惯。因为你无法控制字符串内存的使用情况。你看所有的Widows API 函数都没有返回值是字符串的情况。编写DLL的一个好的习惯或者原则是“内存由谁分配则由谁释放”。
你上面的代码除了这个问题之外,还有以下问题:
1、VB的String类型在Delphi DLL中是没有直接对应的类型。
2、你在VB的声明 Function myfunc (...) As String 其实和Delphi中的声明function myfunc(...):PChar 是不匹配的。
3、与Delphi 函数 function myfunc(...):PChar 对应的VB声明应该是:Function myfunc (...) As Long,返回值是一个指针。你可以使用这个指针再通过内存拷贝函数获取字符串内容,不过与其这么麻烦,为何不直接在参数里提供一个字符串空间呢:
-----Delphi -----
procedure myfunc(m_name:PChar;m_age:integer; pResult: PChar);stdcall;export;
begin
m_name:= 'fuck ';
m_age:=11;
Move(m_name^, pResult, StrLen(m_name));
end;

----- VB -----
Public Declare Sub myfunc Lib "C:\project1.dll " (ByVal m_name As String, ByVal m_age As Integer, ByVal pResult As String)

调用
Private Sub Command1_Click()
dim sResult as String
'分配100个字节空间
sResult = String(100, " ")
call myfunc( "abc ", 11, sResult )
Text1.Text = Trim(sResult)
End Sub
追问
madfish73 谢谢你提供那么宝贵意见,但是我运行你的程序没有值,希望你帮我看下
Move(m_name^, pResult, StrLen(m_name)); 是不是要改成
Move(m_name^, pResult^, StrLen(m_name));
追答
对,你修正了我的一个错误。Move的参数不应该是指针。
匿名用户
2011-04-23
展开全部
建议你把字符串结果数据放到函数的参数里返回
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式