我自已编写了一个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时间不长,还望各位大哥多指点。

解决方案 »

  1.   

    LPCTSTR ret; 
     ....
     ....//进行相应的操作(省略)
     ....
    return ret;   //返回结果字符串值ret是局部变量,除了这个函数内存就被释放了。
    你单步调试,在函数体内怎么都是对的,一旦出了函数体值就不对了。我一般都是从参数中以指针的形式返回结果Convert(LPCTSTR Name, LPTSTR lptRet)
      

  2.   

    还是不可以,而且改了之后在VB中调用会出错,出错信息为:
    "0x77eb1014"指令引用的"0x001b1000"内存.该内存不能为"read".
    要终止程序,请单击"确定".
    要调方程序,请单击"取消".
      

  3.   

    指针肯定是不行,因为在VB中没有指针的你改为char*试一试
      

  4.   

    现贴上所有相关的代码,各位大哥帮我看看吧。
    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
      

  5.   

    解释一下DLL中那个函数的目的:传入一个网址,返回它的IP地址。比如传入www.csdn.net,将返回61.186.252.133.函数的实现部份没有问题,我另外做了一个MFC程序调用了它是正确的。问题就出在VB的调用上。
    TO jszj(老板说mis部不是赚钱的部门,中国软件):换成char *也是一样的结果。
      

  6.   

    试试这样
    BSTR Convert(BSTR bstrName, BSTR bstrRet)
    {
    .......
    }VB里面
    Dim s1 As String
    Dim s2 As String
    Dim s3 As Strings3 = Convert(s1,s2)
      

  7.   

    vc和vb的字符串传递可能有问题
      

  8.   

    那该怎么解决这个问题呢??哪位大哥帮帮忙吧。我已经改出不少于10个版本的DLL出来了,可是没有一个行的。郁闷啊。
      

  9.   

    在dll的函数里面new一段内存出来
    然后用字符串给它赋值
    返回dll再导出一个函数用来释放这段内存
      

  10.   

    VC写的DLL供VB等语言调用,要注意以下三点:
    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)
      

  11.   

    当然对于第三个规则,你也可以在VB里面Declare Function 语句指定别名,具体参照MSDN.
      

  12.   

    你这个问题是按值传递和按地址传递的问题了...
    对于返回值: 你用ByVal或者ByRef更改一下, try!
      

  13.   

    在DLL程序中也不需要更改成BSTR或者的类型.
      

  14.   

    To allenq(沧海一声笑):ByVal和ByRef均试过,不行。
      

  15.   

    TO subtop(风歌):
    有几个问题存在疑问
    1、__stdcall和WINAPI到底是什么区别呢??
    2、下列句子:
     _________________________________________________________
     .......  
     MyFunc = _MyFunc@8
    “=”后面是编译器输出符号,"@"后面是参数栈大小(两个int为8)
     __________________________________________________________
    问:我传入的是两个字符串,长度是未定的该如何事先知道呢??
      

  16.   

    我的QQ:119007440,MSN:[email protected]
    哪位大哥愿意帮我,我可以发全部代码过来。
      

  17.   

    要想写  pb.vb 等语言都可以调用的 dll,建议
    extern "C" __declsoec(dllexport) __stdcall 不要直接返回字符串,使用一个按地址传入的参数作为返回值,你可以仔细看看 WIN32 API ,几乎没有一个返回 string 的
      

  18.   

    在VC中你可以这么定义
    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