我试图从我的C ++代码中调用Visual Basic的CreateObject方法。 在VB中,我只需input:
Dim obj As Object obj = CreateObject(“WScript.Network”)
而且,这使我可以调用更多方法的对象。 但我怎么能在C ++中做到这一点? 我正在关注http://msdn.microsoft.com/en-us/library/bb776046(v=VS.85).aspx中的MSDN文档,但是这些参数非常晦涩,我无法弄清楚。
第一个参数是对CLSID的引用,我可以从registry中看到“WScript.Network”的CLSID是{093FF999-1EA0-4079-9525-9614C3504B74}。 但是这个参数与第三个参数REFIID有什么区别呢?
提前致谢!
首先,您可能需要使用CoCreateInstance http://msdn.microsoft.com/en-us/library/ms686615%28VS.85%29.aspx ,或者在智能指针封装器(例如:CComPtr <>, _com_ptr <>等)。
其次,针对您的具体问题,IID是接口ID,CLSID是类ID。 COM对象通常可以在同一个对象上有多个接口,这就是为什么有一个区别(虽然VB只能看到一个,这就是为什么你不需要指定除CLSID以外的任何东西)。
复制VB所做的“正确”方法是在对象上创建IDispatch接口,然后使用IDispatch枚举方法。 C ++中“更好”的方法是创建你想要使用的直接接口,并直接通过它调用方法。 但是,这需要知道接口ID(IID,或通过引用传递结构的REFIID),这是特定于其他对象的。
希望有所帮助。 我无法为您的特定界面提供具体信息,但是这可能会使您指向正确的方向。
我会提供我的解决方案,只是为了记录。 它调用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();