我有一个ActiveX 组件,内有
[ uuid(C009BC30-BB91-4D53-AEFD-DE712F9E4F9C),
helpstring("ODMA_AppInterface Control 的调度接口")]
dispinterface _DODMA_AppInterface
{
properties:
methods: [id(DISPID_ABOUTBOX)] void AboutBox();
[id(DISPID_FILEOPEN)] BSTR FileOpen();
[id(DISPID_FILESAVE)] void FileSave( BSTR SaveFileName );
[id(DISPID_FILESAVEAS)] void FileSaveAs( BSTR SaveAsFileName ); };
几个接口, 我想在Atl中使用,请问如调用这些接口呢???
我在机于对话框模式中写的一个测试. 代码如下:{
::CoInitialize(NULL); // Create an instance of the Word application and obtain the
// pointer to the application's IDispatch interface.
CLSID clsid;
CLSIDFromProgID(L"ODMA_SYS.AppInterfacCtrl.1", &clsid); IUnknown* pUnk;
HRESULT hr ;
hr= ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER,
IID_IUnknown, (void**) &pUnk);
if( FAILED( hr) ) MessageBox( "asfd11111");
IDispatch* pDispApp;
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispApp);
if( FAILED( hr) ) MessageBox( "asfd222"); // Get IDispatch* for the Documents collection object
wchar_t* szFunction = OLESTR("AboutBox");
DISPID dispid_Docs;
hr = pDispApp->GetIDsOfNames ( IID_NULL, &szFunction , 1,
GetUserDefaultLCID(), &dispid_Docs );
if( FAILED( hr) ) MessageBox( "asfd33333333");
DISPPARAMS dpNoArgs = {
NULL,
NULL,
0,
0
};
VARIANT vResult;
hr = pDispApp->Invoke ( dispid_Docs, IID_NULL,
GetUserDefaultLCID(), DISPATCH_METHOD,
&dpNoArgs, NULL, NULL, NULL);
if( FAILED( hr) )
MessageBox( "asfd444444"); // 被执行.
CoUinitialize();
}动行后会执行, "asfd444444"兄弟帮我看看吧..... 在线等...
[ uuid(C009BC30-BB91-4D53-AEFD-DE712F9E4F9C),
helpstring("ODMA_AppInterface Control 的调度接口")]
dispinterface _DODMA_AppInterface
{
properties:
methods: [id(DISPID_ABOUTBOX)] void AboutBox();
[id(DISPID_FILEOPEN)] BSTR FileOpen();
[id(DISPID_FILESAVE)] void FileSave( BSTR SaveFileName );
[id(DISPID_FILESAVEAS)] void FileSaveAs( BSTR SaveAsFileName ); };
几个接口, 我想在Atl中使用,请问如调用这些接口呢???
我在机于对话框模式中写的一个测试. 代码如下:{
::CoInitialize(NULL); // Create an instance of the Word application and obtain the
// pointer to the application's IDispatch interface.
CLSID clsid;
CLSIDFromProgID(L"ODMA_SYS.AppInterfacCtrl.1", &clsid); IUnknown* pUnk;
HRESULT hr ;
hr= ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER,
IID_IUnknown, (void**) &pUnk);
if( FAILED( hr) ) MessageBox( "asfd11111");
IDispatch* pDispApp;
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispApp);
if( FAILED( hr) ) MessageBox( "asfd222"); // Get IDispatch* for the Documents collection object
wchar_t* szFunction = OLESTR("AboutBox");
DISPID dispid_Docs;
hr = pDispApp->GetIDsOfNames ( IID_NULL, &szFunction , 1,
GetUserDefaultLCID(), &dispid_Docs );
if( FAILED( hr) ) MessageBox( "asfd33333333");
DISPPARAMS dpNoArgs = {
NULL,
NULL,
0,
0
};
VARIANT vResult;
hr = pDispApp->Invoke ( dispid_Docs, IID_NULL,
GetUserDefaultLCID(), DISPATCH_METHOD,
&dpNoArgs, NULL, NULL, NULL);
if( FAILED( hr) )
MessageBox( "asfd444444"); // 被执行.
CoUinitialize();
}动行后会执行, "asfd444444"兄弟帮我看看吧..... 在线等...
hr=pDispatch->Invoke(dispid_Docs,
clsid,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dpNoArgs,
&varResult,
NULL,
NULL);
试试,没有你的COM组件没法调,不知道是否正确,试试吧
你可以在这里得到错误代码,这样你就知道怎么回事了
UINT err;
varResult.Clear();
hr=pDispatch->Invoke(dispid_Docs,
clsid,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dpNoArgs,
&varResult,
NULL,
&err);//看看err里面是什么,然后查查MSDN看看问题出在那里
GetUserDefaultLCID(), &dispid_Docs );dispid_Docs 返回来的值也等于1, 说明得到了这个函数, 但在Invoke失败了. 为何?????
没做过这种东西,帮你试试吧
[email protected]