2010-10-29 32 views
3

我想從我的C++代碼中調用Visual Basic的CreateObject方法。在VB中,我只需鍵入:在C++中調用VB的CreateObject方法

昏暗的OBJ作爲對象 OBJ =的CreateObject(「WScript.Network」)

並返回我的,我可以調用更多的方法的對象。但我怎麼能在C++中做到這一點?我正在關注http://msdn.microsoft.com/en-us/library/bb776046(v=VS.85).aspx中的MSDN文檔,但這些參數非常模糊,我無法弄清楚。

第一個參數是對CLSID的引用,我可以從註冊表中看到「WScript.Network」的CLSID是{093FF999-1EA0-4079-9525-9614C3504B74}。但是這個參數與第三個參數REFIID有什麼區別?

提前致謝!

回答

1

首先,您可能想要使用CoCreateInstance http://msdn.microsoft.com/en-us/library/ms686615%28VS.85%29.aspx或智能指針包裝器中的等效調用(例如:CComPtr <>,_com_ptr <>等)。

其次,針對您的具體問題,IID是接口ID,CLSID是類ID。一般來說,COM對象可以在同一個對象上有多個接口,這就是爲什麼有區別(儘管VB只能看到一個接口,這就是爲什麼你不需要爲VB指定除CLSID之外的其他東西)。

複製VB所做的「正確」方法是在對象上創建IDispatch接口,然後使用IDispatch枚舉這些方法。 C++中「更好」的方法是創建你想要使用的直接接口,並直接通過它調用方法。但是,這需要知道接口ID(IID或REFIID通過引用傳遞結構),這是特定於其他對象的。

希望有所幫助。我無法爲您的特定界面提供具體內容,但也許這會指出您朝着正確的方向發展。

+0

謝謝!我做了一些研究,並且可以像使用CComPtr和IDispatch一樣使用COM成功調用我的方法。再次感謝! – 2010-10-29 18:59:45

2

我會提供我的解決方案,只是爲了記錄。它調用AddWindowsPrinterConnection來安裝網絡打印機。它要求用戶確認,所以如果你想繞過這個,你需要將HKEY_CURRENT_USER/Printers/LegacyPointAndPrint/DisableLegacyPointAndPrintAdminSecurityWarning設置爲1(完成所有操作後可以將其更改爲0)。

CoInitialize(NULL); 
{ 
    ATL::CComPtr<IDispatch> test; 
    _variant_t printerConnection = "\\\\serverAddress\\printerName"; 
    _variant_t result; 
    test.CoCreateInstance(L"WScript.Network"); 
    test.Invoke1(L"AddWindowsPrinterConnection", &printerConnection, &result); 
} 

CoUninitialize();