Bonjour,
Je suis en train d'essayer de placer un contrôle ActiveX dans mon application.
J'ai utilisé la méthode de RACPP pour placer le contrôle sur un contrôle normal (en l'occurence, un simple "STATIC")
Cette méthode permet attacher un ActiveX à un contrôle standard Win32 (
voir sa source)
Ensuite, je récupère le DISPID de la méthode que je veux appeler.
Jusque là, tout se passe bien, je n'ai pas d'erreur.
Le problème réside dans l'appel à cette méthode qui ne fonctionne pas.
J'ai donc voulu essayer avec un contrôle ActiveX "sûr" : le contrôle "Actobat Control for ActiveX".
Il possède une méthode "LoadFile" qui prend en paramètre le nom du fichier à charger.
Je l'ai d'abord essayé avec Visual Basic, et tout est OK
Quand je reviens en C++, Le contrôle est bien créé, mais j'obtiens une erreur lors de l'appel de la méthode LoadFile.
Je me demandais si le problème pouvait venir du fait que l'ActiveX était attaché à un contrôle de mon application.
Voici le code: (Pour info, p_hWnd correspond au contrôle STATIC parent de l'ActiveX)
hDllAtl=LoadLibrary("atl.dll");
typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDllAtl, "AtlAxAttachControl");
CoInitialize(0);
// Créer le controle ActiveX
HRESULT hr;
VARIANT rVal = {0};
CLSID clsid;
LPDISPATCH pdisp;
LPUNKNOWN punk;
if (CLSIDFromProgID(L"PDF.PdfCtrl.5", &clsid)!=S_OK)
{
MessageBox(HWND_DESKTOP,"Unable to obtain CLSID...","Error",MB_ICONERROR);
return 0;
}
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,(void**)&punk);
if(FAILED(hr))
{
MessageBox(HWND_DESKTOP,"Unable to CoCreateInstance...","Error",MB_ICONERROR);
return 0;
}
hr=punk->QueryInterface(IID_IDispatch,(void * *)&pdisp);
if (FAILED(hr))
{
MessageBox(HWND_DESKTOP,"Unable to QueryInterface...","Error",MB_ICONERROR);
punk->Release();
punk=NULL;
return 0;
}
AtlAxAttachControl(punk,p_hWnd,NULL);
OLECHAR FAR *fncName;
fncName=L"LoadFile";
hr = pdisp->GetIDsOfNames(IID_NULL,&fncName,1,LOCALE_SYSTEM_DEFAULT,&dpid_LoadFile);
if (FAILED(hr))
{
MessageBox(HWND_DESKTOP,"Unable to obtain the LoadFile() DispID...","Error",MB_ICONERROR);
return 0;
}
UpdateWindow(p_hWnd);
VARIANT vRet;
VARIANTARG varg;
DISPPARAMS dprm;
ZeroMemory(&dprm,sizeof(dprm));
VariantInit(&varg);
VariantInit(&vRet);
dprm.rgvarg=&varg;
varg.vt=VT_BSTR;
dprm.cArgs=1;
dprm.cNamedArgs=0;
varg.bstrVal=SysAllocString(L"C:\\Essai.pdf");
hr=pdisp->Invoke(dpid_LoadFile,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&dprm,&vRet,NULL,NULL);
VariantClear(&vRet);
VariantClear(&varg);
if (FAILED(hr))
{
MessageBox(p_hParent,"Unable to call the LoadFile() method...","Error",MB_ICONERROR);
return 0;
}
return 1;
Quelqu'un aurait-t-il des indications ?
Merci d'avance.