我DLL是这样定义的:
_declspec(dllexport) CString PrinterFun::SerialNum ()我建立COM接口调用这个DLL
发现返回值不能是CString,我用ConvertBSTRToString转换也没用
STDMETHODIMP CIFun::CallDllSerialNum (BSTR buf1, BSTR *pVal5)
{
PrinterFun m_Printer5;
char *buf =_com_util::ConvertBSTRToString (buf1);
*pVal5 = m_Printer5.SerialNum(buf);
return S_OK;
}懂的帮忙看下该如何做,给出代码看一下

解决方案 »

  1.   

    你的m_Printer5.SerialNum(buf)返回什么类型?返回BSTR需要用SysAllocString(L"你要返回的字符串")来分配空间STDMETHODIMP CIFun::CallDllSerialNum (BSTR buf1, BSTR *pVal5) 

        PrinterFun m_Printer5; 
        char *buf =_com_util::ConvertBSTRToString (buf1); 
        *pVal5 = SysAllocString(L"你要返回的字符串");
        return S_OK; 
      

  2.   

    直接返回指针不好的,你可以先分配好一个buffer,然后把buffer传入dll,PrinterFun::SerialNum里边把字符串填写到传进去的buffer中。
      

  3.   

    如果要用BSTR作为参数,推荐1楼的方法;
    如果要用LPSTR作为参数,推荐2楼的方法;
    总之CString是不能用的
      

  4.   

    我的问题不是出在DLL里就是出在COM里,一共就三句话,转换的我头大了,最近我师傅可能忙也没时间,哪位能帮忙看一下问题出在哪,加下QQ515281
      

  5.   

    不要在dll的导出函数中返回CString通常会有无法解决的错误
    虽然你返回的时候无措
    你试试打印出这个CString的内容看看.
      

  6.   

    按照vocanicy的方法,我是返回了字符串,可这个字符串并不是我调用DLL返回的
    _declspec(dllexport) char* DFun::SerialNum(char* buf)
    {

    m_pidInfo = NULL;
    m_printerNum = 0;
    m_curPrnIdx = 0;
    m_prnInfo = 0; CPUXInit();
    // BSTR str;
    DWORD infoSize = 0, sizeNeeded = 0;
    // BSTR str = idInfo.serialNo;
    // 取得连接打印机台数 
    DWORD dwErr = CPUXSearchPrinters( NULL, infoSize, &sizeNeeded, &m_printerNum );
    if (m_printerNum > 0)
    {
    // if (IsCP9k(idInfo.printerID))
    // {

    ZeroMemory( buf, sizeof(buf) );
    strncpy(buf, idInfo.serialNo, sizeof(idInfo.serialNo));
    // return *buf;
    // }
    }
    // buf=_com_util::ConvertBSTRToString(str);
    return buf;
    // return 0;
    }COM里
    STDMETHODIMP CIFun::CallSerialNum (BSTR buf1,BSTR *pVal)
    {
    DFun fun;
    char *buf =_com_util::ConvertBSTRToString (buf1); 
        *pVal = SysAllocString(L"fun.SerialNum()");// *pVal = fun.SerialNum();
    return S_OK;
    }
      

  7.   

    CString转BSTR,用WideCharToMultiByte,请看MSDN
    BSTR转TCHAR,再转CString,用atl,
    #include<atlbase.h>
    BSTR y;TCHAR*x = W2T(y);
      

  8.   

    *pVal = SysAllocString(L"fun.SerialNum()");//你这样写能返回对才怪。
    改为
    *pVal = SysAllocString(fun.SerialNum());//注意到fun.SerialNum()返回的是char*,看看SysAllocString有没有接受这样参数的构造函数,如果没有,你找一个转换的方法。ps:自己一定要把原理弄懂,否则只能抓瞎!
      

  9.   

    不要将CString用于COM,可以使用BSTR,或OleVariant类型作为传出参数
      

  10.   

    按照yawer说的我改了,但提示错误
    E:\TestCom\IFun.cpp(15) : error C2664: 'SysAllocString' : cannot convert parameter 1 from 'char *' to 'const unsigned short *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    Error executing cl.exe.TestCom.dll - 1 error(s), 0 warning(s)
      

  11.   

    *pVal = SysAllocString(fun.SerialNum());
    ================================================
    这样写肯定是有问题的。
    1,应该先把fun.SerialNum()返回的CSting转换成BSTR。
    2,pVal没有初始化的,要分配一个空间啊,你那样做即使编译没有问题,运行也是有问题的。建议,声明一个CSting strTemp;strTemp = fun.SerialNum();为pVal分配空间,第一次调用用WideCharToMultiByte可以获得应该要分配的大小,第二次调用WideCharToMultiByte就可以把strTemp的值赋给pVal了啊。
      

  12.   

    我转了很久我确实转不过来,高手帮忙转一下吧!麻烦了,头太大了
    DLL代码如下:测试是正确的,我要返回的buf值,用COM调用这个DLL
    _declspec(dllexport) char* DFun::SerialNum()//char* buf)
    {
    CPDIDinfo  idInfo;
    TCHAR buf[8];
    m_pidInfo = NULL;
    m_printerNum = 0;
    m_curPrnIdx = 0;
    m_prnInfo = 0; CPUXInit();
    DWORD infoSize = 0, sizeNeeded = 0;
    // 取得连接打印机台数 
    DWORD dwErr = CPUXSearchPrinters( NULL, infoSize, &sizeNeeded, &m_printerNum );
    if (m_printerNum > 0)
    {
    m_pidInfo = new CPDIDinfo[m_printerNum];

    ZeroMemory( m_pidInfo, sizeof(CPDIDinfo) * m_printerNum );
    infoSize = sizeof(CPDIDinfo) * m_printerNum;
    sizeNeeded = 0;
    dwErr = CPUXSearchPrinters(m_pidInfo, infoSize, &sizeNeeded, &m_printerNum );
    CPDIDinfo idInfo = m_pidInfo[0];


    ZeroMemory( buf, sizeof(buf) );
    strncpy(buf, idInfo.serialNo, sizeof(idInfo.serialNo));


    }
    return buf;
    }
      

  13.   

    我在COM里调用的值出来了,可是个乱码,带我DLL获取的值是正确的
    Unicode如何转换成ASCII码!~
    麻烦知道的告诉下吧,马上就要出来了
      

  14.   

    问题我自己解决了!~用malloc解决了,谢谢大家,感谢师傅laiyiling