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 展开
串的写法:
-------------------------------
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 展开
2个回答
展开全部
在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
你上面的代码除了这个问题之外,还有以下问题:
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
展开全部
建议你把字符串结果数据放到函数的参数里返回
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询