Bonjour à tous,
Suis desolé si je pose la question ki est peut être dejà plusiuers fois sur le beau site revenu. Mais ca fait bail ke j'essaie d'ecrire ce test, mais helas. Bon je pose le probleme:
le project s'appelle A et comme resultat du project , on a une dll nommée A.dll. Dans la DLL on a une serie de fonction. et cette DLL marche dejà tres bien avec un autre langage de programmation où l'appel de la dll se fait rapidement suivant:
callDLL("ma dll",""maFonction", "Parametre"), dans parametre, on a parameterIn , parametreOut, parametreInTyp, parameterOutTyp.
De cette maniere je veux aussi la tester dans le language d'origne de la DLL en C/C++ mais malheuresement je me heurte au passage de parametres.
j'ai essayé d'appeller la dll dynamikement, elle fonctione. Mon probleme se situe comme le passer les parametres ki est un HANDLE.
Voici une petit partie de mon code d'appel:
je reussi à rentrer dans la fonction mais il bloke apres ici
Code : 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 #include <stdafx.h> // Test2.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include <iostream> #include <windows.h> #include "ARRAY.H" #include "N_STRING.H" #include "nc_var.h" #include <TCHAR.H> typedef int (__stdcall WINAPI *AddFunc)(HINSTANCE hInst,WORD hCal,HWND hwNd,LPCTSTR workdir, HANDLE tParam); extern "C" int CSDParameterRet(char *); //struktur tParam typedef struct { LPCSTR pszInArr; LPCSTR pszInTyp; LPCSTR pszOutArr; LPCSTR pszOutTyp; LPCSTR pszDllName; LPCSTR pszProcName; }EXTDLL_PARAM_T; using namespace std; int main() { AddFunc _AddFunc; int nResult =0; //parameter char* hParam; // FunctionFunc _FunctionFunc; HINSTANCE hInstLibrary = LoadLibrary("A.dll"); if (hInstLibrary) { _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "CallParameterRet"); // _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary,"Function"); if (_AddFunc) { HINSTANCE hInst = LoadLibrary("B.dll"); WORD hCal = (WORD)GetProcAddress(hInst,"ExtDll_GetLPSTR") ; //ausgabe cout << "HCAL: "<< hCal <<"\n"; cout << "HINSTANCE: "<< hInst; HWND hWnd = NULL; LPCTSTR workdir = "C:/VC/Test2/"; cout <<"result1: " ; //set Info EXTDLL_PARAM_T tParam; tParam.pszInArr = "test"; cout <<"result1: " ; tParam.pszInTyp = ""; tParam.pszOutArr = ""; tParam.pszOutTyp = ""; // N_String nstrDLLName; // nstrDLLName.AssignTStr("A.dll"); tParam.pszDllName = "A.dll"; tParam.pszProcName = "CSDParameterRet"; cout <<"result2: " ; //mon probleme nResult = (* _AddFunc)(hInst, hCal,hWnd, workdir, (HANDLE)&tParam); cout <<"result: " << nResult; } FreeLibrary(hInstLibrary); } else { std::cout << "DLL Failed To Load!" << std::endl; } std::cin.get(); return nResult; }--
Code : Sélectionner tout - Visualiser dans une fenêtre à part nResult = (* _AddFunc)(hInst, hCal,hWnd, workdir, (HANDLE)&tParam);
Voici le code source où la DLL a eté creer:
Code : 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 #include "StdAfx.h" #include "mainclass.h" static mainclass *m_pMain; Macro (CallParameterRet) { LPSTR pszBDA; CSD_GETLPSTR(0,&pszBDA); AfxMessageBox(pszBDA); return 0; } le Header file est le suivant: <div class="bbcode_container"> <div class="bbcode_quote"> <div class="quote_container"> <div class="bbcode_quote_container"></div> #define GETLPSTR(idx, var) \ (*(EXTDLLPROC_GETLPSTR_T)GetProcAddress(hInst, "ExtDll_GetLPSTR"))(hParam, idx, var, 0) #define Macro(PROC_NAME) \ int WINAPI PROC_NAME(HINSTANCE CSD_hInst, WORD ChCal,HWND hWnd, LPCTSTR pszWorkDir, HANDLE hParam) // Type safe macros to get call parameters typedef int (WINAPI *CSD_EXTDLLPROC_GETLPCTSTR_T)(HANDLE hParam, unsigned uIdx, TYPE* pVar, int nVarLen);\ CSD_EXTDLLARG_API BOOL CSD_ExtDll_GetLPCTSTR(HANDLE hParam, unsigned uIdx, TYPE* pVar, int nVarLen);\ </div> </div> </div>
Merci encore pour votre temps. Mon but normaleemnt est de wrapper cela en Java mais aussi longtemps ke je ne sache pas son test dans son propre est fait, je n#avancerais pas. c est pkoi je voulais d'abors ecrire u Test_EXE en C.Dans le Header de la MainClass où la DLL a ete concu, on a les fonction comme CallParameterRet(LPCTSTR). Ca veut peut etre dire ke cette fonction n'acepte ke ce parametere mais je ne crois d'après la construction de leur Header file. AIDE AIDE AIDE
bonne journée...............
Partager