Conversion de type

cs_rfad Messages postés 3 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 20 septembre 2009 - 20 sept. 2009 à 14:32
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 sept. 2009 à 17:27
Bonjour,
Je développe une DLL en Visual C++ "Visual Studio 8" avec des fonctions qui font du cryptage. Une des fonctions doit prendre un unsigned long long comme paramètres. Cette fonction doit être ensuite utilisée par une autre équipe dans un développement Visual Basic 6.0. Comme vous pouvez le devinez, le type unsigned long long n'existe pas dans VB, donc j'ai modifié le paramètre pour que ce soit une chaine de caractère. Mon problème est : comment je peux transformer une chaine pour qu'elle soit lue dans Visual C++ comme si elle était de type unsigned long long. Je m'explique comment une chaine comme "9250003068290380" peut être lue comme
0x9250003068290380

Merci de vos réponses.

7 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
20 sept. 2009 à 15:34
C'est pas super simple de lire une chaîne VB en C;
pourquoi ne passerais-tu pas plutôt 2 arguments de type long, du genre :

FunctionFromDll(long dwHighPart,long dwLowPart);
0
cs_rfad Messages postés 3 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 20 septembre 2009
20 sept. 2009 à 16:05
Bonjour juju12,
Merci de ta réponse, Oui c'est peut être une idée à creuser. je sais que ce n'est pas super suimple de lire une chaine VB en C mais est ce qu'il y a une réponse à ma question ?
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
20 sept. 2009 à 17:44
Convertir une chaîne hexa en nombre?
Par exemple :


char data[]="12B356798FF5"; // A-F en majuscules
long long result=0;

for(char*str=data;*str;str++)
{
   if(*str<='9') result+=(*str)-'0';
   else result+=(*str)-'A';
   result*=10;
};

0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
20 sept. 2009 à 17:46
Oups désolé petite erreur faut multiplier par 16 (0x10) et pas par 10.
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
20 sept. 2009 à 21:58
On dev en C, en C++, en ASM, en ... ce qu'on voudra mais absolument pas en Visual C++ qui est un IDE et non un langage.

Une chaine depuis vB se prend en param char* (pointeur) comme nimporte quelle API. Se déclare "ByVal String" depuis VB.

Exemples:
DLL C ET ASM POUR VB
http://www.cppfrance.com/code.aspx?id=20672
TRAITER STRING VB PAR DLL C/C++ (WIN32)
http://www.cppfrance.com/code.aspx?ID=30115

DWORD __stdcall HexaToDecimal(const char* pszHexa)
{
DWORD ret 0, t 0, n = 8, c;
while(c = *pszHexa) {
if((c >= '0') && (c <= '9')) t = (c - '0');
else if((c >= 'A') && (c <= 'F')) t = (c - 'A' + 10);
else if((c >= 'a') && (c <= 'f')) t = (c - 'a' + 10);
else break;
ret *= 16; ret += t;
pszHexa++;
if(--n == 0) break;
}
return ret;
}

Toutes les fonctions de ta DLL doivent être en standard STDCALL pour Win 32 bits x86.
ciao...
BruNews, MVP VC++
0
cs_rfad Messages postés 3 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 20 septembre 2009
20 sept. 2009 à 22:46
Merci BruNews mais je n'arrive pas à avoir le bon résultat.
en effet dans ma fonction quand je mets :

unsigned long long Code;
Code = 0x9250003068290380;

traitement....

j'ai un résultat.

mais quand je fais

Code = HexaToDecimal(VCode); // avec VCode le paramètre de la fonction, j'ai tout a fait un autre résultat. Vcode a été initialisé à "9250003068290380"

Dites moi ce que je dois faire ou ce que je n'ai pas fait.

Merci.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 sept. 2009 à 17:27
1) type 'long long' connais pas, mettre __int64.
2) Je te passe une fonction HexaToDecimal(), elle retourne DWORD. Tu la modifies pour q'elle sorte du unsigned __int64, assuré qu'il ne faut pas plus de 3 secondes pour cette modif.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous