2010-10-29 28 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();