我自已编写了一个DLL,内有下列函数:
extern "C" LPCTSTR WINAPI Convert(LPCTSTR Name)
{
LPCTSTR ret;
....
....//进行相应的操作(省略)
....
return ret; //返回结果字符串值
}
在VC中测试结果正确,但在VB中调用的时候无论如何调用都返回一个空的字符串。VB中声明如下:
Private Declare Function Convert Lib "Convert.dll" (ByVal Name As String) As String简单的调用如下:
...
Dim s As String
s = String(100, Chr$(0))
s = IpConvert(Text1.Text)
Label1.Caption = s
...
不知为何都是一个空的字符串,小弟用VC时间不长,还望各位大哥多指点。
extern "C" LPCTSTR WINAPI Convert(LPCTSTR Name)
{
LPCTSTR ret;
....
....//进行相应的操作(省略)
....
return ret; //返回结果字符串值
}
在VC中测试结果正确,但在VB中调用的时候无论如何调用都返回一个空的字符串。VB中声明如下:
Private Declare Function Convert Lib "Convert.dll" (ByVal Name As String) As String简单的调用如下:
...
Dim s As String
s = String(100, Chr$(0))
s = IpConvert(Text1.Text)
Label1.Caption = s
...
不知为何都是一个空的字符串,小弟用VC时间不长,还望各位大哥多指点。
....
....//进行相应的操作(省略)
....
return ret; //返回结果字符串值ret是局部变量,除了这个函数内存就被释放了。
你单步调试,在函数体内怎么都是对的,一旦出了函数体值就不对了。我一般都是从参数中以指针的形式返回结果Convert(LPCTSTR Name, LPTSTR lptRet)
"0x77eb1014"指令引用的"0x001b1000"内存.该内存不能为"read".
要终止程序,请单击"确定".
要调方程序,请单击"取消".
VC Dll动态链接库中:
需包含afxsock.h
extern "C" BSTR WINAPI IpConvert(LPCTSTR HostName)
{
BSTR ret;hostent *lp=NULL;
if (!AfxSocketInit()) /*初始化WinSocket*/
{
ret=BSTR(""); /*初始化SOCKET失败*/
}lp=gethostbyname(HostName);
if (lp==NULL)
{
ret=BSTR(""); /*无法连接主机*/
}
else
{
ret=(BSTR)inet_ntoa(*((struct in_addr *)lp->h_addr));/*连接成功,已获取IP地址*/
}
return ret;
}VB中全部代码:
Option Explicit
Private Declare Function IpConvert Lib "IpConvert.dll" (ByVal HostName As String) As StringPrivate Sub Command1_Click()
If Text1.Text = "" Then
Label1.Caption = "主机名不能为空"
Else
Dim s As String
s = String(100, Chr$(0))
s = IpConvert(Text1.Text)
Label1.Caption = s
End IfIf s = "" Then Label1.Caption = "未获取到IP地址"
End Sub
TO jszj(老板说mis部不是赚钱的部门,中国软件):换成char *也是一样的结果。
BSTR Convert(BSTR bstrName, BSTR bstrRet)
{
.......
}VB里面
Dim s1 As String
Dim s2 As String
Dim s3 As Strings3 = Convert(s1,s2)
然后用字符串给它赋值
返回dll再导出一个函数用来释放这段内存
1、函数声明定义时用__stdcall函数调用规则
2、函数定义时用连接交换指定符extern "C"来解决名字匹配
3、def文件用指定别名,从而使编译器输出的符号符合pascal规定
如:
void __stdcall MyFunc(int i,int j);extern "C" void __stdcall MyFunc(int i,int j)
{
.
.
.
}MyFunc = _MyFunc@8注释:
“=”后面是编译器输出符号,"@"后面是参数栈大小(两个int为8)
对于返回值: 你用ByVal或者ByRef更改一下, try!
有几个问题存在疑问
1、__stdcall和WINAPI到底是什么区别呢??
2、下列句子:
_________________________________________________________
.......
MyFunc = _MyFunc@8
“=”后面是编译器输出符号,"@"后面是参数栈大小(两个int为8)
__________________________________________________________
问:我传入的是两个字符串,长度是未定的该如何事先知道呢??
哪位大哥愿意帮我,我可以发全部代码过来。
extern "C" __declsoec(dllexport) __stdcall 不要直接返回字符串,使用一个按地址传入的参数作为返回值,你可以仔细看看 WIN32 API ,几乎没有一个返回 string 的
extern "C" int WINAPI Convert(LPCTSTR Name,LPCTSTR Out)
{
//把原来返回的字符串COPY到OUT中去,就行拉
}VB中声明如下:
Private Declare Function Convert Lib "Convert.dll" (ByVal Name As String,ByVal Out As String) As Intger