2010-10-29 6 views
3

J'essaie d'appeler la méthode CreateObject de Visual Basic à partir de mon code C++. En VB, je voudrais simplement taper:Appel à la méthode CreateObject de VB en C++

Dim obj As Object obj = CreateObject ("WScript.Network")

Et qui me renvoie l'objet à partir duquel je peux appeler plusieurs méthodes. Mais comment puis-je faire cela en C++? Je suis la documentation MSDN dans http://msdn.microsoft.com/en-us/library/bb776046(v=VS.85).aspx, mais ces paramètres sont très obscurs et je ne peux pas les comprendre.

Le premier paramètre est une référence à un CLSID, et je peux voir dans le registre que le CLSID pour "WScript.Network" est {093FF999-1EA0-4079-9525-9614C3504B74}. Mais quelle est la différence entre ce paramètre et le troisième, REFIID?

Merci d'avance!

Répondre

1

Tout d'abord, vous voulez probablement utiliser CoCreateInstance http://msdn.microsoft.com/en-us/library/ms686615%28VS.85%29.aspx, ou l'équivalent de l'appel à l'intérieur d'une enveloppe de pointeur intelligent (par exemple: CComPtr <>, _com_ptr <>, etc.). Deuxièmement, à votre question spécifique, l'IID est l'ID de l'interface, le CLSID est l'ID de la classe. Les objets COM peuvent avoir plusieurs interfaces sur le même objet en général, ce qui explique pourquoi il existe une distinction (bien que VB ne puisse en voir qu'un, c'est pourquoi vous n'avez pas besoin de spécifier autre chose que le CLSID pour VB).

La "bonne" façon de dupliquer ce que VB fait est de créer l'interface IDispatch sur l'objet, puis d'énumérer les méthodes en utilisant IDispatch. Le "meilleur" moyen en C++ est de créer l'interface directe que vous voulez utiliser, et d'appeler les méthodes directement à travers. Cependant, cela nécessite de connaître l'identifiant de l'interface (IID, ou REFIID passant la structure par référence), spécifique à l'autre objet.

Espérons que ça aide. Je ne peux pas fournir de détails pour votre interface particulière, mais peut-être que cela vous indique la bonne direction.

+0

Merci! J'ai fait quelques recherches et j'ai réussi à appeler ma méthode en utilisant COM, comme vous l'avez suggéré, en utilisant CComPtr et IDispatch. Merci encore! –

2

Je vais fournir ma solution, juste pour l'enregistrement. Il appelle AddWindowsPrinterConnection pour installer une imprimante réseau. Il demande confirmation de l'utilisateur, donc si vous voulez contourner cela, vous devez définir HKEY_CURRENT_USER/Printers/LegacyPointAndPrint/DisableLegacyPointAndPrintAdminSecurityWarning à 1 (vous pouvez le remettre à 0, après que tout soit fait).

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(); 
Questions connexes