Probleme utilisation dll C++ [Résolu]

Signaler
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010
-
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010
-
bonjour tout le monde, voila g créé ma dll, qui fonctionne (normalement) mais lorsque je l'appelle ca plante avec un type incompatible, la dll est en C++ et je l'utilise en vb.net
voila mon code, si y a des trucs vraiment affreu n'hesitez pas a le dire

pour la partie en C++ (la dll)

#include <stdafx.h>

#include <mapi.h>

#include <mapix.h>

#include <objbase.h>

#include <edk.h>

#include <Edkmdb.h>

#include <MAPIUtil.h>

#include <MAPIUTIL.H>

#include <MAPIDEFS.H>

#include <wabdefs.h>

#pragma
comment(
lib, "mapi32.lib")


extern "C" {

#endif
int
__declspec(
dllexport) SetPropri(SPropValue *XoSprop,MapiMessage XoMess);

#ifdef __cplusplus
}

#endif


int
__declspec(
dllexport) SetPropri(SPropValue *XoSprop,MapiMessage XoMess){

LPMAPIPROP Xomapiprop = NULL;
Xomapiprop = (LPMAPIPROP) &XoMess;
LPSPropValue XoSpropValue = NULL;
XoSpropValue->ulPropTag = XoSprop->ulPropTag;
XoSpropValue->dwAlignPad = 0;
XoSpropValue->Value= XoSprop->Value;
HRESULT hr;
hr= HrSetOneProp(Xomapiprop,XoSpropValue);

return 1;
}

pour son utilisation avec vb.net j'utilise

Public
Declare
Function SetPropri
Lib "SetPropri.dll" (
ByRef SPropValue
As
Object,
ByRef Message
As
Object)
As
Integer

puis pour l'appeller ca
xo1 = modSaisie.SetPropri(XoPropValue, XooMessage)

et quand je lance mon prog ca met parametres incorrecte ...snif
merci de toute aide
Naruto

21 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Et en vérifiant avec Depends.exe le nom est le bon ?
Alors là je vois pas. Et comme je l'ai dis la compatibilité VB.NET et c++ je n'y connais rien du tout.
Faudrait peut-être poster un nouveau message sur le forum (C/C++ et aussi VB je pense) au sujet du passage de param entre un prog VB.net et une dll c++.

Enfin si la fonction de mapi de peut être utilisée qu'ne delphi ou c) il sera peutêtre pas possible de l'appeler à partir de VB.net (même via une dll c++)...
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

Changement d'erreur, en fait maintenant ca me met qu'il ne trouve pas le point d'entré de la dll...
Naruto
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Il faut rajouter un fichier .def au projet de la dll avec :
EXPORTS:
SetPropri

car sinon comme la fct est en __stdcall, le compilo va rajouter @8 au nom (car la fct prend 2 paramètres de 4 octets sur la pile).
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

je l'avais deja fait...ou enfin ca plantais du coup j'ai enlevé l'include du fichier .def
mais g ca dedans, je me demande ce qui ne va pas (tel quel)

LIBRARY SetPropri


EXPORTS


SetPropri @16

Naruto
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
seule la section EXPORTS avec le nom des fonctions est utile (@16 sert à rien).

Sinon, dans le répertoire de visual il ya un prog nomé depends qui permet de vérifier si la fonction est bien exportée de la dll et de voir le nom sous lequel elle est exportée. Pour cel il suffit d'exécuter depends.exe et d'ouvrir ta dll avec.
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

oulala ca me met un truc bien sympa je trouve

Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

avec 1 fonction dans la 2ieme case a droite, mais pas dans la premiere
Naruto
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

[mailto:?SetPropri@@YAHPAU_SPropValue@@PAUIMAPIProp@@@Z ?SetPropri@@YAHPAU_SPropValue@@PAUIMAPIProp@@@Z]
que ca me met dans la fonction que je veu exporter
Naruto
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Ouais, en fait c'est pas trop grave car c'est une dll qui n'est pas chargée au lancement mais plus tard (delay-load) si des conditions sont requises. La zone importante est celle en bas à droite lorque tu sélectionne le nom de ta dll dans le panneau de gauche.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
force la déclaration en extern "C" (parce que là c'est la mixture c++ qui est mise) et rajoute __stdcall :

extern "C" int __declspec(dllexport) __stdcall SetPropri(SPropValue *XoSprop,MapiMessage XoMess);

vérifie que le .def est bien dans le projet.
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

l'entry-point donc, je suppose, qui est 0*0001151E
(grande question, je me demande si tu a visual studio, je pourrais t'envoyer ma source pour voir si y a quelque chose qui va pas du tout (enfin si tu voi ce que je veu faire avec ma dll))
parce que je ne sais meme pas si c mon prog en vb qui plante ou la dll (eu g un EXTERN "C" qui veu dire que c que pour du C ou pas (normalement non vu que g deja réussit a renvoyer une valeur de la dll))
Naruto
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

désolé le debug est assez gros, je peu l'envoyer sans le debug c beaucoup moin gros du coup
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Alors pour éviter les noms à rallonge du C++, il faut mettre extern "C" à chaque fois (à la déclaration et à la définition :


extern "C" int __declspec(dllexport) SetPropri(SPropValue *XoSprop,MapiMessage XoMess);


extern "C" int __declspec(dllexport) SetPropri(SPropValue *XoSprop,MapiMessage XoMess){
LPMAPIPROP Xomapiprop = NULL;
Xomapiprop = (LPMAPIPROP) &XoMess;
LPSPropValue XoSpropValue = NULL;
XoSpropValue->ulPropTag = XoSprop->ulPropTag;
XoSpropValue->dwAlignPad = 0;
XoSpropValue->Value= XoSprop->Value;
HRESULT hr;
hr= HrSetOneProp(Xomapiprop,XoSpropValue);
return 1;
}

Cependant, pourquoi ne pas utiliser directement HrSetOneProp à partir de VB. Il faut simplement savoir que cette fonction est dans mapi32.dll sous le nom HrSetOneProp@8

pour la récupérer en VB ça doit être un truc du genre :
Declare Function HrSetOneProp Lib "mapi32" Alias "HrSetOneProp@8
" (...) As Long

les (...) correspondent aux param à la sauce VB que je ne connais pas.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
pour la partie c++ j'ai oublié de mettre __stdcall :


extern "C" int __declspec(dllexport) __stdcall SetPropri(SPropValue *XoSprop,MapiMessage XoMess);
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

dison que au niveau de vb6 ca ne marchais pas du tout d'appeller directement l'api HrSetOneProp de mapi32, ca plantais des que je pensais avoir les bons parametres, donc c plutot au niveau de la déclaration que j'arrivais jamais, du coup g opté pour le c++, et la il me dit une déclaration (du coup je peu peu etre passer ces declarations en .net, mais toutes les infos que g cherché la dessus m'ont dis que cette fonction n'était utilisable que en Delphi et en c++ lol (a ton avis quel serait sa declaration en vb .net)

Naruto
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

quand je tente de déclarer en extern la deuxieme decaration ca me met ca

d:\projet Lotus-Outlook .net\SetPropri\SetPropri\proc.cpp(31): error C2733: seconde liaison C d'une fonction surchargée 'SetPropri' non autorisée

Naruto
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Aucune idée je connais à peine VB alors VB .net ...

Normalement ce que je t'ai donné devrait exporter la fonction C++ sous un nom normal. Ensuite pour passer les params je ne peux plus d'aider...
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Vire la première déclararion (inutile de toute façon)
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

oui, maintenant ca me met au moin un nom correct lol, et au niveau des parametres ca bug tjs autant, mais merci bien deja, a mon avis c au niveau de la compabilité entre c++ et vb que ca va po...
Naruto
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Regarde du coté des sources de brunews sur l'utilsation de dll c/c++ en VB :

http://www.cppfrance.com/code.aspx?id=20672
Messages postés
62
Date d'inscription
mardi 8 septembre 2009
Statut
Membre
Dernière intervention
3 mars 2010

Une exception non gérée du type 'System.EntryPointNotFoundException' s'est produite dans Projet1.exe


Informations supplémentaires : Impossible de trouver le point d'entrée SetPropri dans la DLL SetPropri.dll.

lol pour changer (et ca met aussi quand je précise le Alias setpropri@8)

Naruto