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. P>
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. P>
Peut-être peut-être être un problème Native com vs géré com? p>
Je suis totalement perdu, donnez-moi quelques roulements ... p>
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? P>
Clarification: Je n'ai que l'OCX et un indice de la documentation du composant, quelles méthodes il devrait exposer. p>
6 Réponses :
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 :) P>
Retour lorsque le monde (et i) était plus jeune, le livre de Kraig Brockshmidt " Inside Ole " était The STRAND> 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. P>
Livres de Don Box's " Essential Com " et " efficace com ", mais bienvenue ajouts au magasin de la connaissance (non gérée) COM. p>
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. P>
Happy piratage. P>
Bien. Merci :). Je pourrais dire: "Je ne lis pas!" Mais ce ne serait pas une bonne bouge de carrière, serait-ce?)
Les minimums nus pour instantiquer un objet COM sont les suivants: P>
1) doit avoir un appartement com disponible. P>
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. P>
2) Appelez CoCreateInstance / CoCreateInstanceEx pour créer un objet et spécifier des indicateurs pour indiquer comment il sera instancié. P>
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. P>
- p>
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. P>
- p>
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. P>
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> 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()
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. P>
http://www.murrayc.com/learning/windows/usecomfromatl.shtml p>
http://76.105.92.243/notes/atlcom.html#import p>
http://msdn.microsoft.com /en-us/library/yx242b61%28vs.80%29.aspx P>
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.
Essayez d'utiliser #Import à partir de Visual C ++. Cela créera des emballages de pointeur intelligents pour les interfaces. P>
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; }