我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;
}懂的帮忙看下该如何做,给出代码看一下
_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;
}懂的帮忙看下该如何做,给出代码看一下
解决方案 »
- 高分求教:GuiToolkit库使用 win7下菜单问题
- AfxBeginThread的线程入口函数问题
- strncpy_s((char *)p->Signature, 8, "SCSIDISK", 8);出错问题。在线等
- 求助有关ListControl的删除
- 为何不能实现多客户访问!我加了线程?/ 内有代码。
- 怎么样在循环中检测是否有另一个按钮点击事件??
- 为什么用PostMessage(WN_CTLCOLOR)不会出错,而SendMessage(WM_CTLCOLOR)会出错
- 在哪有installshield内部库函数和介绍installshield的书下载?
- VC串口异步和同步通信方式问题
- mschart数据输入问题,在线等!急
- 记事本程序如何 通过服务启动!
- 在线等待!!VC使用Update()更新数据库失败!
{
PrinterFun m_Printer5;
char *buf =_com_util::ConvertBSTRToString (buf1);
*pVal5 = SysAllocString(L"你要返回的字符串");
return S_OK;
}
如果要用LPSTR作为参数,推荐2楼的方法;
总之CString是不能用的
虽然你返回的时候无措
你试试打印出这个CString的内容看看.
_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;
}
BSTR转TCHAR,再转CString,用atl,
#include<atlbase.h>
BSTR y;TCHAR*x = W2T(y);
改为
*pVal = SysAllocString(fun.SerialNum());//注意到fun.SerialNum()返回的是char*,看看SysAllocString有没有接受这样参数的构造函数,如果没有,你找一个转换的方法。ps:自己一定要把原理弄懂,否则只能抓瞎!
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)
================================================
这样写肯定是有问题的。
1,应该先把fun.SerialNum()返回的CSting转换成BSTR。
2,pVal没有初始化的,要分配一个空间啊,你那样做即使编译没有问题,运行也是有问题的。建议,声明一个CSting strTemp;strTemp = fun.SerialNum();为pVal分配空间,第一次调用用WideCharToMultiByte可以获得应该要分配的大小,第二次调用WideCharToMultiByte就可以把strTemp的值赋给pVal了啊。
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;
}
Unicode如何转换成ASCII码!~
麻烦知道的告诉下吧,马上就要出来了