ActiveX dans un projet sans interface graphique
Je souhaite utiliser un composant activeX (.ocx) dans un projet projet (VC++ 6) sans interface utilisateur (forcément, avec une interface ça aurait été trop facile) .
Donc, l'absence d'interface rend l'insertion dans le projet de l'activeX problématique : la manipulation usuelle (Project puis add to project puis components and controls) ne fonctionne pas.
Si j'ai bien compris, c'est dû à l'absence de conteneur de contrôle activeX dans mon projet.
:?: Mes questions :
- mon diagnostique est il bon ?
- Comment créer et utiliser ce %ù*! de contrôle ? (A priori en le créant manuellement non ?)
Merci
[ActiveX] Utilisation d'un activeX sans interface graphique
Bonjour à tous,
voici la réponse qui m'a été apporté sur un forum parallèle.
Citation:
at first, create an IDL-File from your control :
msvc->Tools->OLE/COM-ObjectViewer->AllObjects->RightClickOnYourDll->ViewTypeInformation->Save
//be care with floats from visualbasic ! simple replace "SINGLE" with "float" in the IDL-File yourIDL-File.idl
now create the both c-files :
MIDL /ms_ext /c_ext /cstub yourImplFile.c /h yourImplHeader.h yourIDL-File.idl
as next, include the created interface in your code :
#include yourImplHeader.h
//from yourImplFile.c :
const IID IID__FloodNetDll = {0x0F405369,0xB9FF,0x45B9,{0x82,0x36,0x7E,0x52,0x7F,0x6D,0xA6,0x52}};
const CLSID CLSID_FloodNetDll = {0x92BEB9AE,0x8447,0x4C78,{0x98,0x5D,0x81,0x4F,0x37,0xA9,0x7E,0x3E}};
//now the instance :
_HRESULT hr;
// pointee to Interface from yourImplHeader.h
_yourImplClass *IFnDll;
// initiate COM
hr = CoInitialize(0);
//fill the pointee:
hr = CoCreateInstance( CLSID_FloodNetDll, NULL, CLSCTX_INPROC_SERVER,IID__FloodNetDll, (void**) &IFnDll);
//do something ith numbers:
float ret;
float n1, n2;
n1=5; n2=7;
hr = IFnDll->AddNumbers(&n1, &n2, &ret);
//do something with strings :
BSTR strPar;
wchar_t csPar[15]=L"TextParameter";
strPar=BSTR(csPar);
hr = IFnDll->ShowText(&strPar);
//release dll :
hr = IFnDll->Release();
// Uninitialize COM :
CoUninitialize();
Appliqué à mon projet, en incluant ole32.lib et en remplaçant
Par Ca compile.
Maintenant, je n'arrive pas à insérer dans mon projet une nouvelle classe issue d'un autre projet aux options de compilation différentes.
:arrow: Du coup en essayant de jongler avec les différents option de compilation j'ai des erreurs Variées...
Dans une première configuration (Sans utilisation des Precompiled Headers, avec l'option « ignore all default libraries » /GN ).
Code:
error LNK2001: unresolved external symbol __chkesp
Dans une configuration des options de compilation (Sans utilisation des Precompiled Headers, mais sans l'option « ignore all default libraries » /GN ).
Code:
error LNK2005: _DllMain@12 already defined in LIBCMTD.lib(dllmain.obj)
Le résultat est le même avec ou sans ole32.lib
:?:Par quel bout je dois prendre ça ?
Correction probleme compilation
Pour le problème de compilation :
Code:
error LNK2005: _DllMain@12 already defined in LIBCMTD.lib(dllmain.obj
En gros, la librairie C Run-Time (CRT) et la librairie MFC sont linkées dans le mauvaise ordre, et il s'agit de spécifier au complateur le bon ordre.
On règle facilement le problème en suivant les instruction MSDN ici (une version française existe, mais j'ai pas réussi à remettre la main dessus)
Probleme de compilation avec midl
Héhé. Bon maintenant je me heurte à l'usage de mon composant ActiveX . :lol:
Aprés vérification, les méthodes definies dans mon fichier .idl n'apparaissent pas dans le .h.
:?:
- Comment est il possible que mon interface .h soit différente du .IDL ?
- Existe t il une alternative à une compilation manuelle avec MIDL ?
- Si je ne peux pas générer de .H contenant ces méthodes, comment puis-je appeler les méthodes qui sont définie dans le fichier .idl ?
:?:
Exemple de code d'appel pour Connect()
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| (...)
HRESULT hr;
_DOPCData *IFnDll = NULL ;// Type défini par mon .h généré par MIDL
// initiate COM
hr = CoInitialize(0);
//fill the pointee:
hr = CoCreateInstance(CLSID_OPCData, NULL, CLSCTX_INPROC_SERVER,DIID__DOPCData,(void**) &IFnDll);
if (SUCCEEDED(hr)) // equivalent de (hr==S_OK)
{
if(IFnDll != NULL) { hr = IFnDll->Connect();}
}
(...) |
Par exemple, si j'appelle la méthode Connect() comme dans le code si dessus, il me retourne l'erreur suivante :
Code:
1 2
|
error C2039: 'Connect' : is not a member of '_DOPCData' |
C'est normal : il n'y apas de référence à Connect() dans mon .h alors que la méthode est bien définie dans le .IDL
Définition de la méthode Connect() dans le fichier .idl
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| // Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: opcdatx.ocx
(...)
library OPCDATALib
{
(..)
dispinterface _DOPCData {
(..)
methods:
[id(0x0000000a), helpcontext(0x00004e7a)]
long Connect(); / |
comprend pas....