背景使用VBS脚本调用VC编译出来的DLL,传入实时大量数据。当前传入的LONG,DOUBLE等类型的数值都可以正常接收,但是当VBS向DLL函数传入String类型的数据时,VC端读出来都是乱码。代码说明//VC DLLDATAPROXY_API bool  __stdcall SetData(WCHAR* szTimeStamp, float flAskPrice) 
{
  OutputDebugStringW(szTimeStamp);    //这里出错
  return false;
}'VBSDim TimeStamp
Dim PriceTimeStamp = "2010-10-5 9:03:28"
Price = 5628.00SetData(TimeStamp, Price)          '指望这里能传送完整数据,但只有Price正常收到
值得讨论的几个问题我查了大量的VB和VC混合编程的资料,大体上理解了解决思路。VBS使用的是UNICODE编码的数据,上面的TimeStamp在被定义时就是UNICODE格式的。如果是发送给VB的函数,VB接收之后会自动转化成ANSI格式,但是传回的值仍会自动转化成UNICODE。问题是,当VB调用VC的DLL接口时,这个值肯定是UNICODE格式的,VC的函数不会自动转化。1. VB的String类型,实际上是BSTR,也就是一个指针,指向带有长度标识头的宽字符串内存区,这种说法对不对?
2. 当VB调用VC的DLL接口时,可以有两种方式,传值或传引用。但是我不明白的是VBS在调用VC的DLL时,用的是哪种方式?3. 虽然经过大量实验,但是仍然无法得出正确的结果。尝试了VC的Unicode向Ansi转化的函数,解析出来的值很奇怪,变成了2010-1-1 9:00:00,这是 什么?
4. 其它的转化方式,目前还没有尝试通过。特别是使用 _bstr_t 的方法,不知道如何加入comsupp.lib,很是苦恼。请VC和VB的高手解答!

解决方案 »

  1.   

    我刚好在做类似的project,给你贴一个我传递string的code,p_pay是传递的字符串,pp_matrix是数字数组。int __stdcall  trans_matrix(BSTR  p_pay,SAFEARRAY **pp_matrix)
    {
        
        int *pint;
        int imonth;
        SafeArrayAccessData(*pp_matrix,(void **)&pint);
        char *tmpstr = const_cast<char*>(LPCSTR(p_pay));
        imonth=strlen(tmpstr);
        int index[13];
        getindex(tmpstr,index);
        getmatrix(pint,index,imonth);
        return 1;}
    vb声明部分Option Explicit
    Declare Function trans_matrix Lib "c:\vba\trans_matrix.dll" (ByVal paystr As String, ByRef pmatrix() As Long) As Long希望能对你有所帮助。
      

  2.   

    DATAPROXY_API bool __stdcall SetData(char* szTimeStamp, float flAskPrice)
      

  3.   

    这是指纯win32 dll码?
    先一下
      

  4.   

    VARIANT变体变量吧
    VBS应该支持的吧