bonjour, j'ai un problème pour appeler une dll, depuis VC++, qui à été fait en fortran.
de façon général les entrées sont 2 int et 20 floats: (la fonction à l'intérieure de la dll s'appelle "DLL_SIMULATEUR")
DLL_SIMULATEUR(int int, float, float ..., float)
J'ai fait des tests sous Visual Basic et la dll marche très bien, le code en VB est:
--- function declaration ---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Declare Sub DLL_SIMULATEUR Lib "C:\vpp53.dll" (CodeError As Integer, n As Integer, t As Double, dt As Double, TWS As Double, TWA As Double, ec As Double, Ang As Double, _ X As Double, Y As Double, z As Double, psi As Double, teta As Double, phi As Double, _ Vx As Double, Vy As Double, vz As Double, omx As Double, omy As Double, omz As Double, Course As Double, Cap_Compass As Double, Leeway As Double, MomentSafran As Double)
--- call to dll ---
Code : Sélectionner tout - Visualiser dans une fenêtre à part Call DLL_SIMULATEUR(CodeErreur, n, t, dt, TWS, TWA, ec, Ang, X, Y, z, psi, teta, phi, Vx, Vy, vz, omx, omy, omz, Course, Cap_Compass, Leeway, MomentSafran)
Aussi, j'ai fait pas mal des trucs sous matlab, et pour appeler la dll sous matlab il faut écrire une fichier .h, donc, le heder est comme ça :
et l'appelle à la dll se fait comme ça: (ça est dans le fichier .m)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #ifndef simul_h #define simul_h EXPORTED_FUNCTION double __stdcall simul(int*, int*, double*, double*,..., double*); #endif
ou a0 est un ptr pour le matlab
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 loadlibrary('VPP53.dll','SIMUL_V100.h'); [a0,input1,input2,input3...input22]=calllib('SIMUL_V100','simul',Val1,Val2,Val3...Val22); unloadlibrary('VPP53.dll')
MAIS quand j'essai d'appeler la dll depuis VC++, je ne sais pas quoi faire... j'ait toujours pas mal des erreurs du type "Violation d'accès lors de la lecture de l'emplacement 0x00000000"
le code en C++ que je suis en train de tester est:
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 // Test3.cpp*: définit le point d'entrée pour l'application console. // #include "stdafx.h" #include <windows.h> #include <stdio.h> // DLL function signature typedef double (*importFunction)(int, int, float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float);// int main(void) { int CodeErrDll=0; int n=0; float t =0; float Dt = 0; float Tws = 0; float Twa = 0; float AngleBoom = 0; float AngleSafran = 0; float X = 0; float Y = 0; float Z = 0; float Psi =0; float Teta = 0; float Phi = 0; float Vx = 0; float Vy = 0; float Vz = 0; float Omx = 0; float Omy = 0; float Omz = 0; float Course = 0; float CapCompas = 0; float Leeway = 0; float MomentMecheSafran=0; importFunction addNumbers; double *result = 0; // Load DLL file HINSTANCE hinstLib = LoadLibrary(TEXT("vpp53.dll")); if (hinstLib == NULL) { printf("ERROR: unable to load DLL\n"); return 1; } // Get function pointer SimU = (importFunction)GetProcAddress(hinstLib, "DLL_SIMULATEUR"); if (SimU == NULL) { printf("ERROR: unable to find DLL function\n"); FreeLibrary(hinstLib); return 1; } // Call function. SimU(CodeErrDll,n, t,Dt,Tws,Twa,AngleBoom,AngleSafran,X,Y,Z,Psi,Teta,Phi,Vx,Vy,Vz,Omx,Omy,Omz,Course,CapCompas,Leeway,MomentMecheSafran); // Unload DLL file FreeLibrary(hinstLib); // Display result printf("The result was: %f\n", result); return 0; }
Que est ce que j'ai fait mal??? je dois recevoir dans la reponse de la dll les mêmes 24 paramètres actualises ...
Merci bcp
Miguel
Partager