DLL C++ pour VB

Signaler
-
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
-
Bonjour,

Je cherche a convertir une fonction d'un exe qui fonctionne très bien pour récupérer les infos en direct dans VB sans passer par un fichier text.

Mon problème est une suite d'erreur du style "System.AccessViolationException", "...EntryPoint...", ...

Quand j'en fix une j'en ai une autre. J'ai pris ma fonction et j'ai ajouter par bloc pour tester. Je suis parvenu à un résultat mais je ne récupère rien de bon.

Si quelqu'un a une piste que je pourrai suivre je suis preneur.


Bien à vous,
Nicolas H.

7 réponses

Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Sans code, dur de te répondre, il manque beaucoup trop d'information.

Quelle version de VB ?
Quel environnement de dev ?
Quelle déclinaison de C++ ?
Dans quel sens C++ -> VB ou VB -> C++ ?
Type de fonction (membre de classe/objet ou fonction brute) ?
Bonjour NHenry,

Quelle version de VB ? VB 2013
Quel environnement de dev ? VS 2013
Quelle déclinaison de C++ ? VC++ 2013 (?)
Dans quel sens C++ -> VB ou VB -> C++ ? dll en C++ et exe en VB
Type de fonction (membre de classe/objet ou fonction brute) ? aucune idée :(


Code C++ qui fonctionne :

int __stdcall SendInt()
{
 return 123;
}

BSTR __stdcall SendTxt()
{
 char *s = "This is my string\ntoto\nxxx";
 return SysAllocStringByteLen(s, lstrlen(s));
}



Code VB qui fonctionne :

    <DllImport("test.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SendTxt() As <MarshalAs(UnmanagedType.AnsiBStr)> String
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim s As String
        s = SendTxt()
        MsgBox(s)
    End Sub



Quand j'ajoute un sprintf(s, "%sdemo\n", s), j'ai une erreur "System.AccessViolationException" dans VB.

C'est un problème de type de variable, je pense mais je trouve rien qui fonctionne.

Quand je teste la même chose dans la source de mon exe C++, j'ai une erreur ici :

#ifdef _UNICODE
    if (_putwc_nolock(ch, f) == WEOF)
#else  /* _UNICODE */
    if (_putc_nolock(ch, f) == EOF)     //     <-----
#endif  /* _UNICODE */



Bien à toi,
Nicolas H.
J'ai oublié de me logé et je ne sais pas adapter le post après avoir fermé la page :(

En adaptant ma fonction comme ceci :

BSTR __stdcall SendTxt()
{
	char s[500];
	sprintf(s, "\n");

	sprintf(s, "%sThis is my string\ntoto\nxxx", s);
		
	return SysAllocStringByteLen(s, lstrlen(s));
}


Je récupère les infos.

Ici le 500 est beaucoup trop important. Il y a moyen d'avoir quelque chose de dynamique ?

Que la taille du char s'adapte aux ajouts. Du genre je démarre avec [100] et on incrémente à chaque ajout de x ou de la taille de l'ajout.


Bien à vous,
Nicolas H.
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Je ne fais pas beaucoup de C/C++, mais dans ton cas, il est plutôt recommandé de passer une chaine en paramètre par référence, cela permet d'éviter à ton code C++ d'assigner la chaine de manière dynamique et empêchant le code VB de la libérer (fuite de mémoire).
Je ne fais pas beaucoup de C non plus, j'ai même commencé il y a deux semaine :)

J'ai ajouté des paramètres mais cette DLL récupère des infos dans certain fichier et y lit des bytes. Je lui envoi donc un chemin de fichier et elle me renvoi l'interprétation des bytes.

Ne sachant pas implémenter de fonction ASM en VB.

Je n'ai que deux choix :
- Deux exe et un fichier texte entre
- Une dll qui envoi tout dans VB

Ma dll est terminé et opérationnelle. Je dois encore gérer le problème du 500 qui dans ma version final est à 100.000 pour ne pas avoir d'erreur :(
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Si c'est pour lire le contenu d'un fichier, il y a des fonctions intégrées dans le framework pour cela.

Sinon, pourquoi ne pas faire une série de fonction, qui permettent de :
- Ouvrir le fichier
- Lire une partie du contenu (paramètre ByRef Tableau de Byte et Longueur du tableau, retourne le nombre d'octets lu (0=fini))
- Fermer le fichier
J'ai bien essayé de convertir le code C++ en VB mais il y a des fonctions en Assembler. Si j'avais pu le faire je l'aurais fait.

La source compte +/- 1.200 lignes dont +/- 400 de Constante ou de Structure (conversion OK) mais après avec les fonctions, c'est une autre histoire. Je n'ai pas trouvé de bon équivalant en VB pour tout. Même avec l'assistance d'un convertisseur de code. Le soft n'est pas au point, je trouve, mais c'est une bonne aide.

En deux semaines, j'ai juste réussi à avoir le résultat que je voulais sur base de la source en C++ et à en faire une DLL pour VB (plus pratique).

Ceci me semble plus simple et plus rapide. Ayant d'autre code en C++ à convertir.

Je travaille très aléatoirement sur mon projet qui a commencé il y a 3 ans (cf. post VolatileRead/VolatileWrite). Les tests et la résolution de bug demande beaucoup de temps comme les nouvelles idées que je veux implémenter.
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Quelles fonctions tu peines à trouver un équivalent ?
Y-a-t-il une raison spécifique de la faire en C++/ASM plutôt qu'en VB (hormis le manque d'équivalent que tu connaisses) ?
Messages postés
36
Date d'inscription
vendredi 19 octobre 2001
Statut
Membre
Dernière intervention
26 mai 2016
1
Je t'ai envoyé les infos en MP.
Honnêtement aucune idée, j'ai acheté des sources spécifiques par élément recherché. Je ne parvenais pas à extraire les infos dont j'avais besoin d'autre soft en C++.
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Je ne fais pas d'ASM, mais d'après le nom, il s'agit d'un simple code de swap de byte.

A moins que la source a été tronquée.