8
votes

Comment puis-je facilement utiliser un composant COM dans Native Visual C ++

J'essaie de créer une application qui utilise un composant COM dans VisualStudio '05 dans natif c ++. Le mélange de descriptions indigènes et gérées de choses dans le MSDN détruit totalement mon cerveau. (Je pense que le MSDN est un désordre total à cet égard) J'ai besoin d'un échantillon bref et simple de code de code Native C ++ pour charger mon composant et le rendre utilisable. Je vais bien avec le compilateur créant des wrappers et similaires.

S'il vous plaît ne me conseillez pas d'utiliser l'exemple MFC basé sur la boîte de dialogue, car il ne fonctionne pas avec ce composant et est en soi un énorme Tas de C ... Code.

Peut-être peut-être être un problème Native com vs géré com?

Je suis totalement perdu, donnez-moi quelques roulements ...

Edit: Merci pour toute l'aide. Mon problème est que tout ce que j'ai est une DLL enregistrée (en fait l'OCX, voir ci-dessous) . Je sais (personnellement) Quelle interface devrait ressembler, mais comment puis-je dire à mon programme? Il n'y a pas d'en-têtes qui définissent ID pour les interfaces que je pourrais utiliser. Mais j'ai lu que le compilateur C ++ peut extraire et enrouler pour moi. Quelqu'un sache comment cela se fait?

Clarification: Je n'ai que l'OCX et un indice de la documentation du composant, quelles méthodes il devrait exposer.


0 commentaires

6 Réponses :


3
votes

J'applaudis vos efforts pour aller avec Native C ++ pour faire face à la com - vous devez traverser la douleur pour vraiment apprécier l'environnement de développement luxueux (géré) d'aujourd'hui :)

Retour lorsque le monde (et i) était plus jeune, le livre de Kraig Brockshmidt " Inside Ole " était The TOME POUR FAIRE UN SENSIRE DE COM (avant que com était com). Ce livre prédit le code géré, donc aucune chance de gérer la confusion ici. Il y a aussi une deuxième édition.

Livres de Don Box's " Essential Com " et " efficace com ", mais bienvenue ajouts au magasin de la connaissance (non gérée) COM.

Cependant, si votre portefeuille ne s'étend pas pour acquérir ces vieux livres poussiéreux, le matériau de didacticiel Microsoft COM ici pourrait vous aider à vous mettre sur la bonne voie.

Happy piratage.


1 commentaires

Bien. Merci :). Je pourrais dire: "Je ne lis pas!" Mais ce ne serait pas une bonne bouge de carrière, serait-ce?)



3
votes

Les minimums nus pour instantiquer un objet COM sont les suivants:

1) doit avoir un appartement com disponible.

Ceci est accompli par la plupart des applications en appelant Coinitialize / Coinitializeex pour configurer la bibliothèque COM et l'appartement initial Com s'il s'agit de la première fois pour un processus.

2) Appelez CoCreateInstance / CoCreateInstanceEx pour créer un objet et spécifier des indicateurs pour indiquer comment il sera instancié.

3) Balance correctement des appels d'Addref et relâchez sur les interfaces de tout composant COM que vous créez, appelant la dernière version () lorsque vous avez terminé à l'aide d'un composant COM.

-

Dans une application gérée, n ° 1 est presque toujours géré pour vous. # 2 est abstraite si vous importez une référence à une bibliothèque COM et que vous pouvez simplement utiliser les noms importés comme s'il s'agissait de définitions de classe .NET et de telles. # 3 est automatiquement géré pour vous, mais vos besoins peuvent varier. Malheureusement, il existe parfois des bizarreries dans la manière dont les références sont traitées dans des applications gérées, ce qui peut causer des objets COM à coller plus longtemps que prévu. La classe Helper du maréchal dans System.Runtime a des méthodes qui peuvent vous aider si vous rencontrez des problèmes.

-

Dans une application non gérée, vous devrez faire des travaux de lumière si vous créez une application à partir de zéro.

  1. Appelle Coinitialize / Coinitializeex tôt dans le fil principal de votre application pour configurer l'appartement.
  2. Lorsque le fil principal de votre application est sur le point de sortir, appelez CounInitialize () pour fermer l'appartement.
  3. Pour des threads supplémentaires que vous créez, vous devez également appeler Coinitialize / Coinitializeex lors de leur démarrage si vous devez utiliser des objets COM de ces threads. En outre, en fonction de votre application, vous voudrez peut-être définir les paramètres de l'appartement.
  4. Pour ces threads, appelez également de la veinitialisation () lorsqu'ils quittent le nettoyage correctement.

0 commentaires

1
votes

Cela aiderait si vous avez donné un peu plus d'informations sur ce que vous faites exactement. Savez-vous quelles interfaces les outils d'objet, etc.

en général cependant, l'API que vous pouvez télécharger Google pour une aide plus spécifique est COCreateInstance. Vous aurez besoin de le transmettre le GUID de l'objet que vous souhaitez jouer. Tous les objets COMMENT Mixent l'interface IUnknown et vous pouvez interroger pour tout autre que cela pourrait avoir. Donc, certains échantillons de pseudocode pour que vous commencies puissent ressembler à quelque chose comme: p> xxx pré>

ici Vous pouvez interroger des interfaces supplémentaires à l'aide de l'interface iunknown que vous avez obtenue du Ptriunknown. P>

Nettoyez ensuite avec P>

CoUninitialize()


0 commentaires

2
votes

J'utilise une combinaison de pointeurs ATL SMART COM et de l'ATL :: CAXWindow Class pour les objets et les composants COM. Je trouve les pointeurs intelligents particulièrement faciles à utiliser.

http://www.murrayc.com/learning/windows/usecomfromatl.shtml

http://76.105.92.243/notes/atlcom.html#import

http://msdn.microsoft.com /en-us/library/yx242b61%28vs.80%29.aspx


3 commentaires

Merci pour les liens, le numéro 2 semble vraiment prometteur. Il faudra jusqu'à demain pour analyser tout cela: |


Je suis intéressé de savoir pourquoi quelqu'un a voté cela! J'essayais seulement d'aider.


Eh bien et vous avez réussi. Merci.



0
votes

Essayez d'utiliser #Import à partir de Visual C ++. Cela créera des emballages de pointeur intelligents pour les interfaces.


0 commentaires

4
votes

Exemple de travail entièrement (exactement ce dont vous avez besoin) de mon article de blog: Comment appeler l'objet COM de Visual Studio C ++?

// https://helloacm.com/how-to-call-com-object-from-visual-studio-c/
#include <iostream>
#include <objbase.h>
#include <unknwn.h>
#include <Propvarutil.h>
#import "wshom.ocx" no_namespace, raw_interfaces_only  

using namespace std;

int main() {
    HRESULT hr;
    CLSID clsid;
    CoInitializeEx(nullptr, COINIT_MULTITHREADED);  
    CLSIDFromProgID(OLESTR("WScript.Shell"), &clsid);   
    IWshShell *pApp = nullptr;
    hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWshShell), reinterpret_cast<LPVOID *>(&pApp));
    if (FAILED(hr) || pApp == nullptr) {
        throw "Cannot Create COM Object";
    }
    int out;
    VARIANT s;
    InitVariantFromInt32(0, &s);
    VARIANT title;
    InitVariantFromString(PCWSTR(L"title"), &title);
    VARIANT type;
    InitVariantFromInt32(4096, &type);
    BSTR msg = ::SysAllocString(L"Hello from https://helloacm.com");
    pApp->Popup(msg, &s, &title, &type, &out);
    CoUninitialize();
    cout << "Out = " << out;
    return 0;
}


0 commentaires