saluts,
compilateur: Visual C++ 6.0.
nous sommes rélativement nouveaux à la programmation en C++. nous essayons d'utiliser un ActiveX DLL créé dans Visual Basic 6.0.
pour utiliser le DLL, nous utilisons #import, et autres fonctions pour créer l'instance et appeller les fonctions du DLL, comme décrit dans un tutoriel.
l'initialisation du DLL (COM) fonctionne; le problème surgit quand nous essayons d'appeller une fonction du DLL. le code du programme est dessous. le projet du DLL en VB est appellé mbr et il contient une classe appellée mbrl. quand la fonction t->speak(...) est appellé, l'erreur suivante se passe:
"File: i386/chkesp.c
Line: 42
The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."
que voit dire:
"Le valeur d'ESP n'a pas été sauvé correctement à travers un appel de fonction. C'est habituellement un résultat d'appeler une fonction déclarée avec une convention d'appel avec un pointeur de fonction déclaré avec une convention d'appel différente."
ici est le code (un petit programme):
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #import "C:\WINDOWS\system32\mbr.dll" #include "iostream" #include <windows.h> using namespace std; using namespace mbr; int main(int argc, char* argv[]) { HRESULT hresult; CLSID clsid; _mbrl *t; _bstr_t bstrValue("k 100 100\n"); _bstr_t dbe("ar1"); _bstr_t oute("OUT.WAV"); _bstr_t bstrR(""); long freqe; long dure; long vole; long pite; long returne; freqe = 1; dure = 1; vole = 1; pite = 1; ::CoInitialize(NULL); hresult=CLSIDFromProgID(OLESTR("mbr.mbrl"), &clsid); hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER, __uuidof(_mbrl),(LPVOID*) &t); if(hresult == S_OK) { returne = t->speak(bstrValue, freqe, dure, vole, pite, dbe, oute); // <- L'ERREUR SE PASSE ICI t->Release(); ::CoUninitialize; } return 0; }
Partager