在C ++中调用VB的CreateObject方法

时间:2010-10-29 16:42:47

标签: c++ windows

我正在尝试从我的C ++代码中调用Visual Basic的CreateObject方法。在VB中,我只需输入:

Dim obj As Object 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之间有什么区别?

提前致谢!

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

首先,您可能希望使用CoCreateInstance http://msdn.microsoft.com/en-us/library/ms686615%28VS.85%29.aspx或智能指针包装器内的等效调用(例如:CComPtr&lt;&gt;,_com_ptr&lt;&gt;等)。

其次,根据您的具体问题,IID是接口ID,CLSID是类ID。 COM对象一般可以在同一个对象上有多个接口,这就是为什么有区别的原因(虽然VB只能看到一个,这就是为什么你不需要指定除了VB的CLSID之外的其他东西)。

复制VB正在执行的操作的“正确”方法是在对象上创建IDispatch接口,然后使用IDispatch枚举方法。 C ++中的“更好”方法是创建您想要使用的直接接口,并直接通过它调用方法。但是,这需要知道接口ID(通过引用传递struct的IID或REFIID),这是特定于另一个对象的。

希望有所帮助。我无法为您的特定界面提供细节,但这可能会指向您正确的方向。