Dll en c++ 6.0

NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007 - 3 oct. 2007 à 22:39
NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007 - 4 oct. 2007 à 23:03
Bonjour,

j'ai un problème et je n'ai aucune idée du pourquoi.

Voici:


j'ai une dll fait en c++ 6.0. je la test par une application vb6 et tout fonctionne bien.


Je fais un imports de la dll dans vb.net 2005 et rien ne fonctionne


Est-ce qu'il y a autre chose à faire qu'un imports en .net pour exécuter une dll 6.0 ?


j'ai le code source de la dite DLL mais le c++ n'est pas mon fort alors je me suis dis que je pouvais tout simplement refaire une dll en c++ 2005 mais encore la, j'ai pas le bon résultat à l'exécution. Donc il doit me manquer un petit quelque chose dans le c++ et comme je ne suis pas très fort en c++ j'aurais besoin d'un petit coup de main s.v.p.


si quelqu'un a une idée pour m'aider je vous en remerci d'avance.

13 réponses

kts_system Messages postés 25 Date d'inscription vendredi 1 décembre 2006 Statut Membre Dernière intervention 27 novembre 2018
4 oct. 2007 à 10:40
deja definit une classe pour ta dll, initialise tous a null ds le constructeur
Par ex cette classe va permettre d'exportrer 3 fct SetGlobal, setBDD et Load

class CGridIRSDll
{
public:


 CGridIRSDll()
 {
    m_hDll = NULL;


    SetGlobal = NULL;  
    SetBDD = NULL;
    DoExitDll = NULL;
    Load = NULL;
 }

  HINSTANCE m_hDll;

   void (*Load)();
   void (*SetGlobal)(_GlobalVarStrc *pGlobal); 
   void (*SetBDD)(_DefBDD2VarStrc *pBDD);
   void (*DoExitDll)();


};

Ensuite dans ton code (la ou tu veut initialiser la dll) :
J'utilise un ptr global mais ce n'est pas obligatoire

 HINSTANCE hIns = LoadLibrary(_T("TA_DLL.dll"));


 if (hIns)
 { 
  g_pGridIRSDll = new CGridIRSDll;

  if (g_pGridIRSDll)
  {
   g_pGridIRSDll->m_hDll = hIns;


   g_pGridIRSDll->SetGlobal = (void (*)(_GlobalVarStrc *pGlobal)) GetProcAddress(g_pGridIRSDll->m_hDll,_T("_SetGlobal"));


   g_pGridIRSDll->SetBDD = (void (*)(_BDD2VarStrc *pBDD)) GetProcAddress(g_pGridIRSDll->m_hDll,_T ("_SetBDD2"));


   g_pGridIRSDll->Load = (void (*)() ) GetProcAddress(g_pGridIRSDll->m_hDll,_T("_Load"));
   g_pGridIRSDll->DoExitDll = (void (*)()  ) GetProcAddress(g_pGridIRSDll->m_hDll,_T("_DoExitDll")); 
  }
 }
 else
 {
     DWORD ulError = GetLastError();
     Trace("IHM", "Error LoadLibrary(TA_DLL.dll) n°%d", ulError);
 }

Et pour terminer (il faut liberer la dll)

//A faire plutot ds le destroyWindow ou avant le destructeur en tous cas
 if (g_pGridIRSDll)
 {
     g_pGridIRSDll->DoExitDll();
 }

//A faire ds le destructeur
 if (g_pGridIRSDll)
 {
      FreeLibrary(g_pGridIRSDll->m_hDll);
     delete g_pGridIRSDll;
 }

Et voila ca devrait marcher
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 12:15
Pas besoin (ni même souhaitable) de classe pour exporter une fonction de DLL utilisable par tout langage.
Mets le nom de fonction dans un fichier DEF, la fonction en __stdcall et compile en C.
Voila ce qui devrait toujours être pour une DLL utilisable par tout langage.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 12:37
Va aussi voir dans les sources .net de vbfrance les exemples où ils utilisent l'API, tu sauras ainsi utiliser une DLL depuis le framework.

ciao...
BruNews, MVP VC++
0
NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 16:13
voici dans mon fichier DEF

LIBRARY "IDEADLL"

DESCRIPTION

EXPORTS

ideacbc

Voici la fonction, c'est una mi qui l'a fait !

char

*
__stdcall ideacbc(
char *InputBuf,
char *plainKey,
char *OutputBuf,

int *KeyLen,
char *Seed,
int *a5){

unsigned
char pInputBuf[200];

unsigned
char pKey[16];

unsigned
char pOutputBuf[200];

unsigned
char pSeed[200];

unsigned _int16 Key[52];memcpy(pInputBuf, SHexToAscii(InputBuf),(*KeyLen));

memcpy(pKey, SHexToAscii(plainKey),16);

memcpy(pSeed, SHexToAscii(Seed), (*KeyLen));

EnKeyIdea(pKey, Key);

if((a5) == 0)DeKeyIdea(Key, Key);

IDEACryptCBC(pInputBuf, Key, pOutputBuf, (

unsigned _int16)(*KeyLen), 0, (
unsigned
char)(*a5));memcpy(OutputBuf, AsciiToSHex((

char *)pOutputBuf, (*KeyLen)), (*KeyLen)*3);

return OutputBuf;}

et voici mon cade pour le import en vb.net

<DllImport(

"IDEADLL.dll", SetLastError:=
True, CharSet:=CharSet.None, CallingConvention:=CallingConvention.StdCall)> _

Private
Shared
Function ideacbc(
ByVal pInputBuf
As
String,
ByVal pKey
As
String,
ByVal pOutputBuf
As
String,
ByRef KeyLen
As
Integer,
ByVal pSeed
As
String,
ByRef a5
As
Integer)
As
String

End
Function

voici dans les propriétés de la solution c++ 2005

Dynamic Library (.dll)
Use Standard Windows Libraries
Not Using ATL
No
Use Unicode Character Set
Common Language Runtime Support (/clr)
No Whole Program Optimization

est-ce qu'il a quelque chose la dedans qui ne serait pas bon à votre avis ?

merci beaucoup pour votre aide !
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 16:31
OUH LA
return OutputBuf;

On ne retourne jamais un truc loccal à la fonction, c'est à dire sur la stack. Ce sera assurément écrasé en sortie.

ciao...
BruNews, MVP VC++
0
NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 16:57
ok je dois faire quoi, enlever le return ? si j'enlève le return est-ce que le pOutputBuf sera retourné par la procedure ?

j'ai fait un test,

void

__stdcall ideacbc(
char *InputBuf,
char *plainKey,
char *OutputBuf,

int *KeyLen,
char *Seed,
int *a5)

et adapter le vb en conséquence. si je test le vb le outputbuf n'est pas initialisé juste des 00 de dans mais ça devrait être de l'hexa

voici les parametres d'appel.

pInputBuf =

"C6 1F D1 F0 85 06 FA BF "
pKey =
"56 D2 D0 C4 8A BC 0D D0 CA AB 86 5F 83 1A 83 5F "
pOutputBuf =
"00 00 00 00 00 00 00 00 "
KeyLen = 32
pSeed =
"11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 "
a5 = 0 ' 1 encrypt, 0 decrypt

Au retour
pOutputBuf = "00 00 00 00 00 00 00 00 "

si ça peut vous aidez à m'aider, je peux vous fournir le .h et .cpp

merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 17:11
KeyLen et a5, tu prends des pointeurs, c'est utile ? Modifies-tu leur valeur ?
Si est non alors prends direct la valeur, inutile de perdre du temps à déréférencer les pointeurs.

"si j'enlève le return est-ce que le pOutputBuf sera retourné..."
alors là faut sérieux te plonger dans un bouquin de C.
Soit on prend un buffer en param que la fonction remplira, soit on fait une alloc que l'appelant devra désallouer. La 1ere solution étant la plus sure.

ciao...
BruNews, MVP VC++
0
NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 17:47
pour keylen et a5 non c¸a ne devrait pas être modifié donc pour la modif j'aurais juste besoin de changer *par  ?

je sais je suis vraiment poche en C et quand ça parle de pointeur là c'est encore pire. Comme je veux juste utiliser cette dll qui était en c++6.0 avant et que je ne réussi pas à recevoir les bonnes infos je me suis dit que de la mettre en c++ 2005 serait pas si terrible à faire mais disons que je m'y perds. Je suis en spécialiste oracle et je me débrouille tres bien en VB.net.
 
Le bouquin de C très bonne idée mais j'en ai pas. mais je vais investir, je crois que ça va valloir la peine !

voic un lien pour le .h et .cpp
http://www.sendspace.com/file/c88o2o

si quelqu'un a le gout d'y jetter un oeil. c'est l'original en c++6.0

merci encore une fois
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 18:02
Comme je te disais, dans l'original on prend le buffer à remplir en param de la fonction.
Je me suis gourré dans la réponse plus haut, tu ne retournes pas un bufer local mais ce qu'on te passe en param, c'est donc seulement inutile mais pas invalide. J'avais confondu OutputBuf et pOutputBuf.

Si ça n'est fait que pour fournir une String à de l'interprété, ne prends rien en param et retourne un BSTR que tu fabriqueras depuis pOutputBuf avec SysAllocStringByteLen(), voir dans mes sources.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 18:15
Autre conseil:
l'original n'est vraiment pas le must du code, Len() ne vaut pas mieux que le 'static char[]' de SHexToAscii(), passe sur autre chose dès que fini.
Exemple:
int Len(char *psz)
{
  char *c = psz;
  while(*c) c++;
  return (c - psz);
}

etc, etc...

ciao...
BruNews, MVP VC++
0
NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 19:22
salut

dès que je réussirai a faire fonctionner cette foutue DLL, je regarderai  pour le len et autre.

pour l'instant je me trouve vraiment très poche, mon résultat attendu n'est jamais bon

je me demande bien pourquoi la dll originale (le lien que j'ai mis dans mon autre post) fonctionne bien avec vb6 et que rendu en .net plus rien ne fonctionne.

s'il y a une âme charitable qui voudrais bien me faire une dll fonctionnel ça serait très apprécié.

un BSTR est-ce que .net transforme ça en string ou si faut que je marshall ?

merci de prendre le temps de m'aider j'appréci vraiment.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2007 à 19:39
BSTR est un String de vb6 ou .net, aucun traitement supplémentaire.

ciao...
BruNews, MVP VC++
0
NaNouk_X Messages postés 15 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 4 octobre 2007
4 oct. 2007 à 23:03
ouf pas facile, je n'y arrive tout simplement pas. je n'ai vraiment pas assez de connaissance en C pour pouvoir faire la modification.

est-ce que tu serais assez gentil pour faire la modifiaction pour moi s.v.p. ?

merci, étant codeur je sais que je t'en demande beaucoup mais j'aimerais juste que cette dll fonctionne pour moi. si je réussi je vais pouvoir par la suite essayer de reprendre ce code et le transposer en vb poour le plaisir d'apprendre...

merci
0
Rejoignez-nous