我有一个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"兄弟帮我看看吧..... 在线等... 

解决方案 »

  1.   

    varResult.Clear
    hr=pDispatch->Invoke(dispid_Docs, 
    clsid,
    LOCALE_USER_DEFAULT, 
    DISPATCH_METHOD,
    &dpNoArgs, 
    &varResult,
    NULL,
    NULL);
    试试,没有你的COM组件没法调,不知道是否正确,试试吧
      

  2.   

    MessageBox( "asfd444444"); // 被执行.
    你可以在这里得到错误代码,这样你就知道怎么回事了
    UINT err;
    varResult.Clear();
    hr=pDispatch->Invoke(dispid_Docs,
    clsid,
    LOCALE_USER_DEFAULT,
    DISPATCH_METHOD,
    &dpNoArgs,
    &varResult,
    NULL,
    &err);//看看err里面是什么,然后查查MSDN看看问题出在那里
      

  3.   

    DISPID_FILEOPEN = 1hr = pDispApp->GetIDsOfNames ( IID_NULL, &szFunction , 1, 
                                   GetUserDefaultLCID(), &dispid_Docs );dispid_Docs 返回来的值也等于1, 说明得到了这个函数, 但在Invoke失败了. 为何?????
      

  4.   

    ActiveX需要把调用程序做成容器,是不是跟这个有关?
      

  5.   

    不知道,我用的是徐景周的Word 插件框架一个ATL, 然后我再在里面加我自己写的一个ActiveX(MFC ActiveX)搞了好几天, Invoke 处老失败。 不知道怎么办, 项目又好急, 急死我了。 那位大哥能不能帮帮我, 我把源码给他。
      

  6.   

    发给我看看吧:)
    没做过这种东西,帮你试试吧
    [email protected]