DLL en Delphi lue par VBA [Résolu]

Signaler
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
-
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
-
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

Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Sur le nom du projet dans VS, clic droit -> propriétés.

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

ciao...
BruNews, MVP VC++
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Il n'y a aucune erreur dans ma dll, va impec testé depuis VBA Excel.

ciao...
BruNews, MVP VC++
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

R15, BruNews,

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

ciao...
BruNews, MVP VC++
Messages postés
82
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008

70 k

Otavio Reis