Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 07-10-2008 15:13:13

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

MSDN GCHandle Structure - Utilisation en Pb ?

Bonjour tout l'monde !

Je dois faire appel à une méthode d'une DLL (objet COM), déclarée comme ceci :

Code: cpp

void GetDecryptedFile(unsigned char** ppbFileContents);

J'ai longtemps cru (oui, je n'ai pas de doc, donc je crois tout et je ne sais rien ^_^) que l'argument représentait les données lues et décryptées, retournées par référence... Mais en fait il semblerait bien que non. J'ai pu obtenir un exemple d'utilisation en C# :

Code: cpp

byte[] data = new byte[100];

// init the data array with the decoded data
GCHandle gchData = GCHandle.Alloc(data, GCHandleType.Pinned);
decoder.GetDecryptedFile(gchData.AddrOfPinnedObject());

decoder étant l'objet COM ;)

J'ai donc besoin d'utiliser la structure MSDN GCHandle.
Mon problème c'est de savoir comment faire...

J'ai vu que l'on pouvait intercepter les évènements Windows en les déclarant dans la section events de notre fenêtre, mais je ne sais pas comment utiliser cette classe GCHandle. Pourriez-vous m'aider, s'il vous plait ?

Merci



PS : Cette discussion est liée à celle-ci !

Dernière modification par Nyphel (08-10-2008 14:58:10)

Hors ligne

 

#2 08-10-2008 06:02:27

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: MSDN GCHandle Structure - Utilisation en Pb ?

Bonjour,

Il y a un moment que je n'ai pas réalisé ce genre de manipulation. Hélas, il n'est pas possible parfois d'interfacer systématiquement des méthodes en C++ avec Powerbuilder lorsque les arguments sont complexes.

Il est donc nécessaire de conserver la partie en C++ et de la ré interfacer vers une nouvelle méthode présentant des arguments facilement interprétable par powerbuilder (dans ton cas une méthode retournant un blob du fichier décrypté).

Je t'invite donc à consulter la documentation de powerbuilder concernant la partie : PBNI

PBNI is a standard programming interface that enables developers to extend the functionality of PowerBuilder. Using PBNI, you can create extensions to PowerBuilder—nonvisual, visual, and marshaler extensions—and embed the PowerBuilder virtual machine (PBVM) into C++ applications. Through the Java Native Interface (JNI) and PBNI, Java applications can also communicate with the PBVM.

Hors ligne

 

#3 08-10-2008 06:41:00

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: MSDN GCHandle Structure - Utilisation en Pb ?

Merci Buck, voilà une piste à creuser

Hors ligne

 

#4 08-10-2008 09:26:15

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: MSDN GCHandle Structure - Utilisation en Pb ?

Bon, soyons pragmatiques, je pense qu'il faut bien analyser ce que tu dis Nyphel.

Nyphel a écrit:

J'ai pu obtenir un exemple d'utilisation en C# :

Code: cpp

byte[] data = new byte[100];

// init the data array with the decoded data
GCHandle gchData = GCHandle.Alloc(data, GCHandleType.Pinned);
decoder.GetDecryptedFile(gchData.AddrOfPinnedObject());

decoder étant l'objet COM ;)

J'ai donc besoin d'utiliser la structure MSDN GCHandle.
Mon problème c'est de savoir comment faire...

Négatif. Tu n'as pas à essayer d'appeller les méthodes de GCHandle... Surtout pas! Car, si tu regardes la doc, on peut y trouver la description suivante:

MSDN a écrit:

Provides a means for accessing a managed object from unmanaged memory.

Et vice-versa oserais-je ajouter... Bref, dans le code C#, cette classe est nécessaire, pour pouvoir jouer avec la mémoire comme si elle était non managée (donc C++ classique, pas .NET). Ici, c'est parce que ta méthode a besoin d'un bon vieux pointeur vers un tableau de bytes, pas d'un tableau de bytes .NET tout bizarrre en mémoire parce qu'il serait managé par le framework...

Ceci étant dit, ça ne t'aide pas beaucoup (ça t'évite quand même de perdre du temps à tenter un wrapper en PBNI...).
Evidemment, si je me rappelle le dernier post que tu as fait à ce sujet, il était clair dans mon esprit que l'on essayait de passer une string d'une manière ou l'autre... Evidemment, une doc aurait pu nous donner la sémantique de l'argument et donc la manière d'appel en PB (tu mériterais une prime pour utilisation d'objets sans doc )

As tu essayé un tableau de bytes en argument (> PB10 je pense), ou un blob, ou un any... Si c'est le cas, c'est bizarre, car contrairement à l'avis de Buck, je pense qu'a part quand on a besoin de callback, il est toujours possible de faire des appels API en PB (j'ai parfois souffert, mais ca finit toujours par passer)

Dernier conseil: va voir les tips and tricks pour VB6 concernant l'appel de cette méthode... On a souvent les même problèmes d'appel en PB et VB6...

Bon courage, j'espère voir un [RESOLU] d'ici peu...

Hors ligne

 

#5 08-10-2008 09:38:29

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: MSDN GCHandle Structure - Utilisation en Pb ?

Merci Cortex, j'avoue que je n'avais pas du tout fait attention à la gestion mémoire de Pb, et j'y vois maintenant plus clair.

Quand à l'argument, j'avoue ne plus savoir : mes 2 phrases de doc disent que c'est bien une chaine de caractères en argument, chaine qui recevra le texte décodé. L'exemple C# fournit avec cette "doc" semble passer un pointeur en argument (Je n'y connais rien en C#). J'ai demandé un complément d'informations, mais c'est en attente :-/

Je vais donc creuser la solution des types blob/any/tableau de bytes (Je suis en Pb 10.2.0 build 8075), et voir ce qu'il se passe du côté de VB6.

Merci tout Cortex, et j'espère te faire prochainement le plaisir du [RESOLU] ;)

Hors ligne

 

#6 08-10-2008 14:19:29

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: MSDN GCHandle Structure - Utilisation en Pb ?

En ce qui concerne les types BLOB ou ANY, rien ne change. Il semblerait que ce soit plutôt un tableau de bytes, mais j'avoue ne pas savoir les déclarer .
Avec tout ça, je n'ai pas encore eu le temps de jeter un oeil du côté de VB6, histoire de trouver des problèmes similaires...

Hors ligne

 

#7 08-10-2008 14:37:50

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: MSDN GCHandle Structure - Utilisation en Pb ?

Nyphel a écrit:

En ce qui concerne les types BLOB ou ANY, rien ne change. Il semblerait que ce soit plutôt un tableau de bytes, mais j'avoue ne pas savoir les déclarer .

Code: pb

// external function

// Si ta version de PB supporte le type byte:
subroutine GetDecryptedFile(ref byte ppbFileContents[]) library 'toto.dll' // etc,... j'ai pas la suite...

// ...sinon:
subroutine GetDecryptedFile(ref char ppbFileContents[])

C'est uniquement la taille en mémoire qui définit le type à utiliser.

Hors ligne

 

#8 08-10-2008 14:55:43

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: MSDN GCHandle Structure - Utilisation en Pb ?

Ah... Le mot "byte" n'étant pas reconnu par ma version de Pb, je pensais qu'il fallait utiliser un autre mot clef. Que le type byte existait depuis la version initale de Pb, et que c'est le type tableau de bytes qui ne l'était pas.
Donc maintenant on peut le confirmer : le type byte n'est pas reconnu sur Pb 10.2.0 build 8075 !

J'ai aussi essayé le tableau de char, mais sans succès... L'application crashe toujours violemment en me disant :
"Error calling external object function getdecryptedfile at line ... in ... event of object ..."

Code: pb

FUNCTION long SetDECKeyListFile(ref char szKeyListFilePath[]) LIBRARY "Csr_PicDEC.dll" alias for "SetDECKeyListFile;Ansi"

Code: pb

char lc_picture_content[]                  
my_ole_object.GetDecryptedFile(lc_picture_content)  

Dernière modification par Nyphel (08-10-2008 14:57:18)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22