现在是这样的:
有个COM接口,其中有几个函数的参数是另外一个接口,不知道怎么调用,只有一个DLL,还有C#的调用定义,我想在C++里面调用,调用其中一个普通参数的方法是可以的,但是调用那种参数是另外一个接口的函数就失败,悲剧!求助啊!!!
C#的相关接口定义是这样的:
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AD864139-4547-45e8-8981-C91F7C40AD69")]
  internal interface ITicketManager
  {
  void GetAppID(Guid productId, out ulong appId);   
  void GetTicket(ulong appID, string TicketID, out ITicket Ticket);
    
  }[ComImport, Guid("C66A047A-F755-4515-A573-F059C29736E2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  internal interface ITicket
  {
  [PreserveSig]
  int set_Property(uint propertyId, string propValue);
  [PreserveSig]
  int set_InvocationInfo(string TaskName, string taskParameters);
  }
[ComImport, ClassInterface(ClassInterfaceType.None), Guid("248DD447-4295-4888-BC5A-5D87F3705F74")]
  internal class TicketManager
  {
  }现在我在C++里面动态方式调用GetAppID是没问题的,但是调用GetTicket这个函数就不行,其中ITicket Ticket参数就是下面的那个ITicket接口,拜托大家了,有什么办法没????

解决方案 »

  1.   

    在C++中返回指针的,如果是在函数中的话,一般用双指针
    void GetTicket(ulong appID, string TicketID, ITicket** Ticket);
    如果是函数返回的,就是
    ITicket* Ticket GetTicket(ulong appID, string TicketID)
      

  2.   

    我是用IDL编译生成头文件的 ,我的ILD是这样写的:
    [
    object,
    uuid(C66A047A-F755-4515-A573-F059C29736E2),
    dual,
    nonextensible,
    helpstring("ITicket Interface"),
    pointer_default(unique)
    ]
    interface  ITicket:IUnknown{              
    HRESULT set_Property([in] unsigned long propertyId,[in] BSTR propValue);
    HRESULT set_InvocationInfo([in] BSTR TaskName,[in] BSTR taskParameters);
    }[

    object,
    uuid(AD864139-4547-45e8-8981-C91F7C40AD69),
    dual,
    nonextensible,
    helpstring("ITicketManager Interface"),
    pointer_default(unique)
    ]
    interface ITicketManager: IUnknown{

    HRESULT  GetAppID(GUID productId,[out] unsigned long *appId);
    HRESULT  GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket* Token);
    };
    // not needed GUID
    [
    uuid(A18935E0-C27A-48e2-B84B-2219B6967EA6),
    version(1.0),
    helpstring("TicketManager1.0 Type Library")
    ]
    // contains the coclass-GUID
    library TicketManagerLib
    {
    importlib("stdole2.tlb");
    interface IDocHostUIHandlerDispatch;
    interface IAxWinAmbientDispatchEx;
    [
    uuid(248DD447-4295-4888-BC5A-5D87F3705F74),
    helpstring("TicketManagerClass")
    ]
    coclass TokenManager
    {
    [default] interface ITicketManager;
        };
    };但是调用的时候GetAppID这个函数没问题,GetTicket 这个函数就不行,我用的是DllGetClassObject这种方式调用的
      

  3.   

    [out] ITicket* Token 这儿应改为[out] ITicket** Token
      

  4.   

    还是不行,我改为[out] ITicket** Token了,调用代码是这样的: {

    Logger::Instance().Log(LOG_INFO, _T("get DllGetClassObject method - Success."));
    IClassFactory* pICF = NULL;

    HRESULT hr = CreateInstance(__uuidof(TicketManager),IID_IClassFactory,(void**)&pICF);
    if(SUCCEEDED(hr))
    {


    TicketManager* pTicketManager=NULL;


    HRESULT hr2 = pICF->CreateInstance(NULL,__uuidof(ITicketManager),(void**)&pITicketManager);
    if (SUCCEEDED(hr2))
    {


      
    ITicket** Ticket=NULL;
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
    if (SUCCEEDED(hr3))
    {

    Logger::Instance().Log(LOG_INFO, _T("Invoke interface method OK."));
    }
    else
    {

    Logger::Instance().Log(LOG_ERROR, _T("Invoke interface ITicket method filed:%x"),GetLastError());
    }



    pTicketManager->Release();
    }
    pICF->Release();
    }
    }
      FreeLibrary(hi);
    }
    return 0;
      

  5.   

    少贴了点,则发下:
    HINSTANCE hi= ::LoadLibrary(L"xxxx.dll");if(hi!=NULL)
    {

    Logger::Instance().Log(LOG_INFO, _T("dll loaded."));
    pfnHello CreateInstance = (pfnHello)::GetProcAddress(hi,L"DllGetClassObject");

    if(CreateInstance!=NULL)
    {

    Logger::Instance().Log(LOG_INFO, _T("get DllGetClassObject method - Success."));
    IClassFactory* pICF = NULL;

    HRESULT hr = CreateInstance(__uuidof(TicketManager),IID_IClassFactory,(void**)&pICF);
    if(SUCCEEDED(hr))
    {


    TicketManager* pTicketManager=NULL;


    HRESULT hr2 = pICF->CreateInstance(NULL,__uuidof(ITicketManager),(void**)&pITicketManager);
    if (SUCCEEDED(hr2))
    {


      
    ITicket** Ticket=NULL;
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
    if (SUCCEEDED(hr3))
    {

    Logger::Instance().Log(LOG_INFO, _T("Invoke interface method OK."));
    }
    else
    {

    Logger::Instance().Log(LOG_ERROR, _T("Invoke interface ITicket method filed:%x"),GetLastError());
    }



    pTicketManager->Release();
    }
    pICF->Release();
    }
    }
      FreeLibrary(hi);
    }
    return 0;
      

  6.   

    ITicket** Ticket=NULL;
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
    错误, 改为
    ITicket* Ticket;
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",&Ticket);
    记得Release Ticket
      

  7.   

    不需要 CreateInstance  ITicket吗??
      

  8.   

    不行  直接退出了,我这样弄的:
    HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket *Token);调用的时候:
    ITicket *Ticket;
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
    调用失败,hr3是:0x80070057
      

  9.   

    晕, 你搞懂了吗?
    // 这里是指针的指针
    HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket **Token);ITicket *Ticket;
    // 这里传地址
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",&Ticket);你用点心, 别心浮气躁的
      

  10.   

    嗯嗯,  c++是菜鸟,哎。
    还是不行,
    HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket **Token);ITicket *Ticket;
    // 这里传地址
    HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",&Ticket);程序直接挂掉了