L'auteur de la dll me dit que la dll reçoit bien le safearray, mais que ça plante parce qu'il lui faut un pointeur sur le safearray. Comme je passe déjà un PSafeArray, et vu le header en C, j'en déduis qu'il faut un pointeur sur PSafeArray.
Il m'a aussi précisé que c'était à moi d'instancier le safearray, puis lui le purge, et le redimensionne au besoin.
Je me suis rendu compte comme toi que la convention d'appel n'était pas bonne. J'avais vu "cdecl pour les dll C et C++" sur developpez.com, alors j'ai foncé tête baissé comme un âne, mais sans résultat.
Actuellement, j'ai déclaré un nouveau type :
1 2
| type
PPSafeArray : ^PSafeArray; |
Puis la déclaration de la fonction :
function LireFichier(tableau: PPSafeArray) : longint; stdcall ; external 'DllDXF.dll';
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var
tableau : PSafeArray;
pTableau : PPSafeArray;
ArrayBounds : TSafeArrayBound;
begin
ArrayBounds.lLbound:= 0;
ArrayBounds.cElements:= 10;
tableau := SafeArrayCreate( VT_VARIANT, 1, ArrayBounds );
New(pTableau); // J'ai vu que c'était conseillé d'utiliser New/Dispose sur le net...
pTableau := tableau;
// Appel de la méthode de la dll
LireFichier(tableau);
Dispose(pTableau);
end; |
J'obtiens toujours la même erreur concernant la mémoire...
Je vais finir par y arriver, il faut bien y croire 
Edit : j'avais essayé ta proposition, sans succès. Je confirme que tout est plus facile car implicite en VB. Comme tu peux le voir dans un précédent message, en VB il suffit de déclarer un tableau de "Record"...
Partager