描述:
现有如下需求:
知道对象IDispatch接口,要求执行里面的相应的函数。
我们知道可以使用IDispatch::invoke,不使用多线程的时候没有什么问题
但是为什么我在多线程中调用IDispatch::invoke的时候会报错,没有错误原因。
请高手指点。部分原代码如下:
this->Lock();
hr=::CLSIDFromProgID(L"MyObject",&clsid);
if(FAILED(hr)){
::MessageBox(NULL, "获取clsid失败!","Error", 0x10010);
_exit(0);
}
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IDispatch, (void **)&pWinccOjbect);
if(FAILED(hr)){
::MessageBox(NULL, "创建实例失败 !","Error", 0x10010);
_exit(0);
}
dispidNamed = DISPID_PROPERTYPUT;
ptName = L"GetValue";
// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
// Get DISPID for name passed...
hr = pWinccOjbect->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT,
&dispID);
if(FAILED(hr)) {
sprintf(buf,
"IDispatch::GetIDsOfNames(\"%s\") failed w/err0x%08lx",
szName, hr);
MessageBox(NULL, buf, "AutoWrap()", 0x10010);
_exit(0);
}
char * rlValue = "";
//初始化输入变量x
VARIANT result;//输出变量
VariantInit(&result);
VARIANT x;
x.vt = VT_BSTR;
x.bstrVal =(unsigned short*)_com_util::ConvertStringToBSTR(key); //bstr字符类型
//
//
DISPPARAMS dp = { NULL, NULL, 0, 0 };
VARIANT *pArgs = new VARIANT[2];
pArgs[0]=x;
dp.cArgs = 1;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(DISPATCH_METHOD & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
EXCEPINFO excep;
UINT err;
// Make the call!
hr = pWinccOjbect->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
&dp, &result, &excep, &err);
if(FAILED(hr)) {
sprintf(buf,
"IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx",
szName, dispID, hr);
//
MessageBox(NULL, buf, "AutoWrap()", 0x10010);
_exit(0);
}
/*
typedef struct FARSTRUCT tagEXCEPINFO {
unsigned short wCode; // An error code describing the error.
Unsigned short wReserved;
BSTR bstrSource; // Source of the exception.
BSTR bstrDescription; // Textual description of the error.
BSTR bstrHelpFile; // Help file path.
Unsigned long dwHelpContext; // Help context ID.
Void FAR* pvReserved;
// Pointer to function that fills in Help and description info.
HRESULT (STDAPICALLTYPE FAR* pfnDeferredFillIn)
(struct tagEXCEPINFO FAR*);
RETURN VALUE return value; // A return value describing the error.
} EXCEPINFO, FAR* LPEXCEPINFO;
*///_com_util::ConvertBSTRToString(result.bstrVal)
/*char* error = new char[1024];
sprintf(error,"%d",excep.wCode);
MessageBox(NULL,error,"wCode",0);
sprintf(error,"%d",excep.wReserved);
MessageBox(NULL,error,"wReserved",0);
error = _com_util::ConvertBSTRToString(excep.bstrSource);
MessageBox(NULL,error,"bstrSource",0);
error = _com_util::ConvertBSTRToString(excep.bstrDescription);
MessageBox(NULL,error,"bstrDescription",0);
error = _com_util::ConvertBSTRToString(excep.bstrHelpFile);
MessageBox(NULL,error,"bstrHelpFile",0);
*/
VARTYPE vt = result.vt;
switch(vt)
{
case VT_I4:
{
//MessageBox(NULL,"长整型转换成字符","infor",0);
//ltoa(result.lVal,rlValue,10);
long ln=result.lVal;
rlValue = new char[128];
sprintf(rlValue,"%d",ln);
//MessageBox(NULL,"长整型转换成字符","infor",0);
}
break;
case VT_UI1:
{
//MessageBox(NULL,"unsigned char","unsigned char",0);
rlValue = new char[128];//test done
sprintf(rlValue,"%c",result.bVal);
//MessageBox(NULL,"unsigned char","unsigned char",0);
}
break;
case VT_I2: