DLL en Delphi lue par VBA

Résolu
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008 - 16 avril 2007 à 23:14
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008 - 19 avril 2007 à 14:17
Bonjour,

J'ai écrit une DLL en delphi. J'ai crée une autre application en Delphi pour accéder les fonctions de la DLL. ça marche bien. Maintenant il faut que j'appelle les fonctions de la DLL du VBA sur un fichier Excel. J'i bien declaré la fonction. ça ne marche pas. Vous savez pour quoi?

Voilà la fonction de la DLL sur Delphi:

function NU:string; stdcall;
var
  Buffer : array[0..255] of char;
  BufferSize : DWORD;
begin
  BufferSize := sizeOf(Buffer);
  GetUserName(@buffer, BufferSize);
  Result:=Buffer;
end;


 exports
 NU;

Voilà ma declaration sur le VBA d'Excel:
Declare Function NU Lib "C:\PrjDllDelphi\PrjDllDelphi.dll" () As String

Merci,
Otavio Reis

34 réponses

otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 10:20
Merci encore une fois.
Comment je change ça? Je suis allé dans projet, propriétés, ressources. La première ligne est :Définitions du preprocesseur: _UNICODE;UNICODE. Si j'efface ça, il le met à nouveau.
Otavio Reis
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 avril 2007 à 10:33
Sur le nom du projet dans VS, clic droit -> propriétés.

Utilise mes templates, sera tout réglé correctement.

ciao...
BruNews, MVP VC++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 10:38
Je l'ai compilé /za en desactivant les propriétés de langue. Il ouvre la winnt.h et donne l'erreur suivant:


Erreur 1 error C2467: illegal declaration of anonymous 'struct' D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h 477 

Otavio Reis
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 11:10
Brunews, merci bcp...
J'ai crée la DLL en C++ ça a compilé parfaitement bien. Ensuite je suis allé sur le VBA du Excel et je la declaré:
Declare Function bnGetUsername Lib "C:\Documents and Settings\otei\Bureau\Temporaire\X1.dll" () As String

Dans la feuille je fais appel et ça ne marche pas... J'ai utilisé ta fonction sur ton template en C++. Maintenant le pb est sur la déclaration du VBA?






Otavio Reis
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 11:34
Je demande de debouguer en utilisant Excl comme Host et il me sort la message: Exception non gérée à 0x77fe1de8 dans EXCEL.EXE : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000104

Otavio Reis
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 avril 2007 à 13:22
http://brunews.com/bnUser.zip

Dans VB (chemin DLL à régler=:
Declare Function bnGetUserName Lib "d:\bnUser.dll" () As String


Sub test()
  Debug.Print bnGetUserName()
End Sub

ciao...
BruNews, MVP VC++
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 avril 2007 à 13:28
Quel troll ce BruNews. Je m'y ferais jamais.

En même temps si y avait que ça de "faux" dans ce que j'ai dit, je peux m'estimer très heureux. Heuu, une réservation peut être ?

Donc si c'est à titre de test (cf remarque de Renfield), on peut faire comme l'API. Par exemple, quand on cherche à acceder à GetUserName depuis VB, on fait comme ça par exemple :

http://chrisrae.com/vba/routines/getusername.html

Donc si tu voulais mettre un intermédiraire ça donnerait quelque chose comme ça (Je n'ai ni Delphi ni VBA sur ce PC) :

function NU(const buffer: PChar; const size: Integer): Integer; stdcall;
begin
  Result:= GetUserName(buffer, size);
end;

Avec un appel dans ce style :

Declare Function NU Lib "X1.dll" (ByVal lpBuffer As String, nSize As Long) As Long

Function GetUserName() As String
Dim lpBuff As String * 25

NU lpBuff, 25
GetUserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
End Function
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 14:46
Je vous remercie énormement pour vos réponses... En fait, j'ai tout essayé en Delphi, en C++. Les DLLs sont crées. Les logiciels en C++ ou Delphi accèdent aux fonctions de la DLL facilement, mais le VBA n'arrive pas à lire la fonction. Si je crée des fonctions (sans pointeurs) dans une DLL, j'arrive à faire appel aux fonctions à partir du VBA. Je vous remercie encore une fois, mais je vais laisser tomber.

Si un jour quelqu'un passe par ici et arrive à appeller sur le VBA d'Excel l'une des deux fonctions ci-dessous, s.v.p., indiquez moi le chemin.

Em C++:

BSTR
__stdcall bnGetUsername()
{

char buff[260];
DWORD len;
len = GetUserName(buff, 260);
buff[len] = 0;

return SysAllocStringByteLen(buff, len);
}


Ou, en Delphi:


function NU: pchar; StdCall;
Var
  Buffer : array[0..255] of char;
  BufferSize : DWORD;
begin
  BufferSize := sizeOf(Buffer);
  GetUserName(@buffer, BufferSize);
  GetMem(Result, BufferSize);
  StrCopy(Result, @Buffer);
end;

Merci
Otavio Reis
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 17:56
Ok, encore un test... On va y arriver... J'espère...
J'ai compilé cette fonction:
BSTR __stdcall bnGetUsername()
{
char buff[264];
DWORD len = 206;
GetUserName(buff, &len);
if(!len) buff[0] = 0;
return SysAllocStringByteLen(buff, len);
}

Je l'ai déclaré comme ça sur le VBA d'Excel:
Declare Function bnGetUserName Lib "C:\Documents and Settings\virtual\Desktop\temporaire\cDLL\Release\X1.dll" () As String


Sub test()
  Debug.Print bnGetUserName()
End Sub

Dans la feuille, j'écris sur une cellule:
= test

Excel a crée un Form avec le message: "Nom non valide!

Merci BruNews, mais ça n'a pas marché... c'est bizarre... Je ne comprends pas...
Otavio Reis
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
18 avril 2007 à 18:25
BruNews, J'ai compilé la DLL en utilisant Excel comme host. J'ai mis les points d'arret dans la fonction sur la DLL. J'ai vérifié que on ne rentre pas dans la fonction. Le message est le suivant:
"Le point d'arret ne sera pas atteint pour l'instant. Aucun Symbole n'a été chargé pour ce document."

Peut-être qu'on n'arrive pas à faire l'appel à la fonction. Dans ton template, c'est écrit:
/* METTRE FICHIER "DEF" DANS
      Onglet Linker => Input => Module Definition File
*/

Pendant la création de la DLL, je suis allé sur Projet --> Ajouter un nouvel élément --> fichier de définition de module .Def. Puis j'ai ajouté l'élément en donnant le même nom, mais avec l'extension Def. Le Def est comme ça:
LIBRARY "X1"
EXPORTS
bnGetUsername


J'espère qu'on puisse réperer l'erreur.
Otavio Reis
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 avril 2007 à 22:49
Il n'y a aucune erreur dans ma dll, va impec testé depuis VBA Excel.

ciao...
BruNews, MVP VC++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
19 avril 2007 à 09:51
R15, BruNews,

Coooooooolll!!
ça a marché parfaitement bien... toutes les deux. Merci bcp à vos tous qui m'ont aidé.
Merci énormément,
Otavio Reis
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 avril 2007 à 12:39
Juste pour info, quelle taille la dll en delphi ?

ciao...
BruNews, MVP VC++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
19 avril 2007 à 14:17
70 k

Otavio Reis
0
Rejoignez-nous