Commen changer un pointeur(long) en string? [Résolu]

Signaler
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013
-
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013
-
Bonjour, j'utilise une Dll qui me renvoi un pointeur, et j'aimerais le traduire en string afin de savoir à quoi cela correspond...

Donc si quelqu'un connais le code de la fonction qui traduit un LPCSTR en string je suis preneur.

Merci

10 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
En fait, si tu as bien étudié les liens que je t'ai passé lors de ta précédente question (c'est lourd à comprendre mais utile pour comprendre ce qu'on fait), la solution est dedans :
Le pointeur vers une String de longueur non fixe fournit la longueur de la chaine sous forme d'un Long (4 octets), suivi des caractères.
Il te suffit donc de lire le contenu de la mémoire de cette adresse pour récupérer la longueur :
Dim lLength As Long
CopyMemory_Long lLength, pHandle, 4

Puis, pour lire les caractères, il te suffit de réparer une chaine de même longueur et de recopier le contenu de la mémoire située derrière le chiffre donnant la longueur, c'est à dire avec un décalage de 4 octets
Dim sTexte As String
sTexte = String(lLength, ";")
CopyMemory_String sTexte, pHandle + 4, lLength

avec les définitions de CopyMemory données plus bas.

Si tu obtiens un résultat montrant un 'espace' entre chaque caractère, c'est que la chaine lue est UniCode (BSTR). Il te faudra peut-être la convertir :
sTexte = StrConv(sTexte, vbFromUnicode)


Déclarations de CopyMemory
Private Declare Sub CopyMemory_Long Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Long, _
                                                                          ByVal hpvSource As Long, _
                                                                          ByVal cbCopy As Long)
et
Private Declare Sub CopyMemory_String Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As String, _
                                                                          ByVal hpvSource As Long, _
                                                                          ByVal cbCopy As Long)

PS : Normalement, l'utilisation (déclaration) de CopyMemory est unique et utilise le type Any. Mais VB.Net ne reconnait pas ce type --> Futur problème de conversion de langage, au cas où.
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Ok merci bien, détaillé comme ceci, je comprend mieux comment fonctionnes ces lignes
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Une question; comment définirais tu la fonction PtrToStr?

J'ai essayé
Private Function PtrToStr(ByRef pHandle As Long) As String

Mais il refuse...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
PS (encore) : La manipulation de la mémoire peut causer des crashes de l'IDE de VB6.
Je te conseille vivement de faire une sauvegarde de ton projet avant de le lancer, à chaque fois (voir options de VB6 pour automatiser)
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

En fait c'est à la ligne :
sTexte = String(lLength, ";") 
que ca plante...je ne pense pas qu'il appréci le ";", je ne vois pas à quoi il sert non plus
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

PS: le pointeur que me renvoi la seconde fonction est : 94264448 ...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Pour ton erreur, bizarre
Comme tu l'auras vu toi même, les deux seuls paramètres nécessaires sont le nombre caractères et le second, le caractère qui sera répété. J'ai utilisé le point-virgule, mais tu mets ce que tu veux, de toute façon, les données seront écrasées ensuite. En utilisant un caractère un peu hors norme, çà permet de le repérer facilement si, par exemple, tu l'as rempli avec plus de caractères qu'il n'en sera copié ensuite, donc facilité de retrouver l'anomalie.

Que vaut lLength au moment de l'erreur ?
A mon avis, il vaut 0 et c'est ça qui provoque l'erreur.
Il faut donc remonter à la capture de la longueur qui doit clocher.

"le pointeur que me renvoi la seconde fonction est : 94264448"
seconde fonction : laquelle ?
ce genre de nombre peut en effet ressembler à un handle.
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

lLenght vaut 1835888451 l'ors de l'erreur.

La seconde fonction est la fonction qui traite la réponse (en long) de ma première fonction afin de me dire si la connexion est bonne ou non ....


déclaration des fonctions utiles à mon programme :
Public Declare Function FxpCommand Lib "C:\Program Files\Cscape\FxServe.dll" Alias "?FxpCommand@@YGHPBDPAPAEPAHPAUHWND__@@@Z" (ByVal pRequest As Long, ByVal pDataptr As Long, ByVal pDataSize As Long, ByVal h As Long) As Long
Public Declare Function fxpGetErrorString Lib "C:\Program Files\Cscape\FxServe.dll" Alias "?FxpGetErrorString@@YGPBDH@Z" (ByVal nErrorCode As Long) As Long
Public Declare Sub setStopTransferState Lib "C:\Program Files\Cscape\FxServe.dll" Alias "?setStopTransferState@@YGXH@Z" (ByVal bStop As Boolean)
Public Declare Function getStopTransferState Lib "C:\Program Files\Cscape\FxServe.dll" Alias "?getStopTransferState@@YGHXZ" () As Boolean


Point h de mon programme :
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the FXPSERVERDLL_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// FXPSERVERDLL_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.

#ifdef FXPSERVERDLL_EXPORTS
#define FXPSERVERDLL_API __declspec(dllexport)
#else
#define FXPSERVERDLL_API __declspec(dllimport)
#endif

// Security Functions
FXPSERVERDLL_API int	__stdcall FxpCommand(LPCSTR pRequest, LPBYTE * pDataPtr, int * pDataSize, HWND h);
FXPSERVERDLL_API LPCSTR __stdcall FxpGetErrorString(int nErrorCode);

FXPSERVERDLL_API void __stdcall setStopTransferState(BOOL bStop);
FXPSERVERDLL_API BOOL __stdcall getStopTransferState();


#define	FXP_RESTART_MARK				110 //restart marker reply
#define	FXP_SERVICE_RDY					120 //Service ready in nnn minutes.
#define	FXP_CONN_OPEN_TRNS_START		125 //data connection already open; transfer starting
#define	FXP_CONN_ABT_OPEN				150 //File status okay;about to open data connection
#define	FXP_CMD_OK						200 //Command okay.
#define	FXP_CMD_NO_SUPER				202 //Command not Implemented, superflous at this site.
#define FXP_SYS_STATUS					211 //System status, or system help reply.
#define	FXP_DIR_STATUS					212 //Directory status.
#define	FXP_FILE_STATUS					213 //File status
#define	FXP_HELP_MSG					214 //Help message.
#define	FXP_SYS_NAME					215 //NAME system type.
#define	FXP_SERV_RDY					220 //Service ready for new user.
#define	FXP_SERV_CLOSE					221 //Service closing control connection. Logged out if appropriate.
#define	FXP_CONN_OPEN_NO_TRNS			225 //Data Connection open;no transfer in progress.
#define	FXP_CONN_CLOSE					226 //Closing data connection.
#define	FXP_MODE_PASSIVE				227 //Entering Passive mode (h1,h2,h3,h4,p1,p2)
#define	FXP_LOGGED_IN					230 //User Logged in, proceed.
#define	FXP_REQ_FILE_OK					250 //Request file action okay,completed
#define	FXP_PATH_OK						257 //"PATHNAME" created
#define	FXP_NEED_PASSWORD				331 //User name okay,need password
#define	FXP_NEED_LOGIN					332 //Need account for login.
#define	FXP_REQ_FILE_PENDING			350 //Request file action pending further information
#define	FXP_SERV_NOT_AVALB				421 //Service not available, closing control connection.
#define	FXP_CONN_OPEN_FAIL				425 //Cant open Data connection
#define	FXP_CONN_CLOSE_ABRT				426 //Connection closed; transfer abourted
#define	FXP_REQ_FILE_BUSY				450 //Request file action not taken.File unavailable.
#define	FXP_REQ_FILE_LOCAL_ERR			451 //Request file action not taken:Local error in progress
#define	FXP_REQ_FILE_NO_SPACE			452 //Request file action not taken:Insufficiant storage space in system.
#define	FXP_UNRECOGNISED_CMD			500 //Syntax error, command unrecognized.This may include error such as command line too long
#define	FXP_SYNTX_ERR_ARG				501 //Syntax error in parameters or arguments.
#define	FXP_CMD_NOT_IMPLEMENTED			502 //Command not implemented.
#define	FXP_CMD_BAD_SEQNC				503 //Bad sequence of commands.
#define	FXP_CMD_NOT_IMPLE_PARM			504 //Command not implemented for that parameter.
#define	FXP_NOT_LOGGED_IN				530 //Not logged in.
#define	FXP_NEED_ACC					532 //Need account for storing files.
#define	FXP_REQ_FILE_NOT_AVALB			550 //Request action not taken:File unavailable
#define	FXP_REQ_PAGE_UNKWN				551 //Request action aborted:page type unknown.
#define	FXP_REQ_FILE_EXD_SPACE			552 //Request file action aborted. Exceeded storage allocation (for current or dataset)
#define	FXP_REQ_FILE_NOT_ALLWD			553 //Request action not taken.File not allowed.

#define FXP_MEDIA_FAILED 				611 //media not accessable or media not present.
#define FXP_MEDIA_BUSY					612 //media busy with some other operation.
#define FXP_FILE_ALREADY_EXIST			614 //Already file /DIR exist.
#define FXP_ERR_CMD_IN_PROGRESS			615 //Error in command processing.
#define FXP_LOCAL_PATH_ERR				616 //local path curpted. Error valid for "CDUP" other than that reset the Media.
#define FXP_DIR_NOT_EMPTY				617 //Directory not empty.
#define FXP_ROOT						618 //currently in root.
#define FXP_CONN_ABT_OPEN_SIZE			619 //File status okay;about to open data connection, along with size info

#define	FXP_COMPLETED					651 //No any command in process.
#define FXP_SUCCESS						652 //Currently success.
#define FXP_BAD_STATE					653 //Bad state

#define FXP_NO_CONNECTION				601		// Command failed - No Connection.

#define	FXP_FILE_LENGTHS_UNEQUAL		-106
#define FXP_CANT_CREATE_DIRECTORY		-111
#define	FXP_MODEL_NO_SUPPORT			-112
#define	FXP_FIRMWARE_NO_SUPPORT			-113
#define	FXP_ABORTED_BY_USER				-114
#define FXP_NO_SUCH_MODEL				-115


Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Bon alors j'ai du nouveau, en fait j'avais besoin de faire cette conversion car j'avais programmé ma fonction comme me renvoyant un long, alors qu'il suffisais de lui demander de me renvoyer un string....

Donc voila je n'ai plus besoin de faire cette conversion, je me compliquais la vie, en tout cas merci bien jack de t'être penché sur mon cas (c'est un de tes collègue Renfield qui m'a fais remarqué cela dans une autre conversation ^^ )
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013

Avant tout jack un grand merci !
je savais que cette longueur de string ce trouvais pas loin
...
ATTENTION
par contre je suis pas d'accord avec toi cette longueur ne ce trouve pas au pointeur du string mais 4 octets AVANT ! ! ! !
"1234"+"le pointeur"+"le texte"
exemple si :
a$="xavier"
alors le pointeur-4 = ";:,!xavier"
...
sinon c'était bien le pointeur "pHandle" ?
et comment toi tu l'obtient ?
car moi c'est du genre
sous vb:
byval a$
puis récupéré en assembleur :
a:ptr
mov esi,a
la longueur=[esi]
J'ai essayer cela marche en ainsi et pas unicode, donc ok !
c'est juste que je ne vois pas comment faire en vb seul !
je n'arrive pas a faire :
pHandle=pointeur string (pas unicode)
CopyMemory_Long lLength, pHandle-4, 4