我想实现这样一个效果:
我用VC编写了个DLL ,VB 调用里面的一个函数,返回给VB一个字符串,
目前要不就是乱码,要不就是崩溃!我查了网上很多资料,都没有成功 !
请大虾们99999我啊 !
例子如下:
VC:
SQLCE3_DRIVER_API BSTR TestString(LPCTSTR   InStr)
{             CString   Buf;   
          Buf   =   "测试用例";   
          return   Buf.AllocSysString();  
    
}
VB:
Private Declare Function TestString Lib "Sqlce3_Driver.dll" Alias "?TestString@@YAPA_WPB_W@Z" (ByVal strS As String) As String
        Dim a As String
        a = TestString("这个参数没有意义")

解决方案 »

  1.   

    输入一个已经初始化好的字符串缓冲区地址,及其长度.然后DLL里向那个缓冲区写入内容,并返回实际写入的长度.参考GetComputerName的用法.
      

  2.   

    SQLCE3_DRIVER_API 是什么?VC我不熟.但一般是声明为WINAPI,VB只支持stdCall.把例子里的Buf内容复制到输入的InStr指针里.再加个参数,大约如下:WINAPI INT TestString(LPCTSTR InStr,int StrLength)
    { CString Buf;   
      Buf = "测试用例";  
      memcpy instr,&buf,sizeof(buf);     '这里要复制,语法不知道对不对
      return sizeof(buf); 
    }
    VB里面:Private Declare Function TestString Lib "Sqlce3_Driver.dll" (ByVal strS As String,byval strLength as long) As long
      Dim a As String,lRet as long  a=space(255)     '分配255个字符的空间,再传这个变量的地址进去
      lret = TestString(a,255)  'lRet里是复制的字节数,上面函数里返回的.A里面就是复制的字符串,根据返回的字节数来取回有用的部分即可.
      

  3.   

    一看你的参数InStr是LP开头的,不能直接传入这个字符串“这个参数没有意义”,要传入这个字符串的地址。先定义变量:sTest="这个参数没有意义",然后传入sTest的地址。
      

  4.   

      Dim a As String
      a = Space(9)    '变量需要实例化
      a = TestString("这个参数没有意义")
      

  5.   

    仔细查看BSTR、LPCSTR和LPSTR的区别,在VB中,String类型都是BSTR类,并且传入的是类地址指针!
    所以这个LZ的问题跟应该传入参数无关,可能是返回值的问题
      

  6.   

    同意3楼老马的建议,举个简单例子:
    VC中:void __stdcall fnTeststrdll2(LPSTR InStr)
    {   
    int l=strlen(InStr);
    strcpy(InStr,"测试用例"); 
    }
    VB中:Option Explicit
    Private Declare Sub fnTeststrdll2 Lib "D:\VCCode\teststrdll2\Debug\teststrdll2.dll" (ByVal s As String)Private Sub Command1_Click()
    Dim s As String * 32
    Call fnTeststrdll2(s)
    MsgBox s
    End Sub
      

  7.   

    ...c++中那个int l变量没啥用,忘删了。
      

  8.   

    感谢xuggzu及楼上的各位大虾。我按照xuggzu的代码可以运行成功,并弹出窗口,但是有个问题:
    MsgBox出来的是乱码,方块状的东西,不是想要的结果"测试用例"
      

  9.   

    你好,还有个情况 :
    我是吧这段代码放在WINCE终端上运行的。其他的跟PC上一样
      

  10.   

    ...wince啊,那肯定不对,wince用的是unicode码,所有和字符串有关的都必须改成双字类型变量或操作。
    把dll编码中:
    strcpy(InStr,"测试用例");
    改成:
    strcpy(InStr,_T("测试用例"));
    试下。
      

  11.   

    错误 163 error C2664: 'strcpy' : cannot convert parameter 2 from 'const wchar_t [5]' to 'const char *' ,直接提示这个错误 
      

  12.   

    dll如果只是在wince下使用的话,建议lz用vc++.net编制需要的dll,选择使用unicode编码,这样所有函数、变量等都是双字节相关,不用像vc6.0下编制dll要考虑很多字符串编码问题。字符串编码处理是很麻烦的事情,如果必须使用vc6.0的话,还是多到google、百度或者本论坛vc版块查查相关资料吧。
      

  13.   

    我现在就是在VS2005里面编写的,项目属性也是用UNICODE编码 ,但是就是在WINCE是乱码。
      

  14.   

    再修改为:
    CString s=_T("调试测试!");
    int l=s.GetLength();
    memcpy(Instr,s,l);
    试下。不过可能还有问题,现在因为不会出现崩溃,只需要调试此dll即可,编码之间的转换有很多方法,慢慢整
    还有,wince下不知道lz的dll用什么测试程序调用?貌似vb6的exe不能在ce下运行吧?
      

  15.   

    记得貌似有EVB,嵌入式VB........
      

  16.   

    目前我在WINCE下还不能调试DLL 呢。郁闷中 。
    我们项目统一使用VS来开发的,所以。
    现在我感觉就是编码的问题,在WINCE下,从VC的DLL提出来的字符串到VB就成乱码了,ANIS到UNICODE,现在正在试
      

  17.   

    xuggzu,谢谢你的帮助 !
    使用你的代码
    CString s=_T("调试测试!");
    int l=s.GetLength();
    memcpy(InStr,s,l);。目前在WINCE 下运行能出现
    的字符有 : 调试K 。前面几个字符对了 。后面的还是乱码,这又是怎么回事呢
      

  18.   

    你好!xuggzu,已经出结果了,在length应*2,就OK拉 ,宽字符,可以结贴 了,再次谢谢CSDN上的大虾们