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 :

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
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
loadlibrary('VPP53.dll','SIMUL_V100.h');
 
[a0,input1,input2,input3...input22]=calllib('SIMUL_V100','simul',Val1,Val2,Val3...Val22);
unloadlibrary('VPP53.dll')
ou a0 est un ptr pour le matlab

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