Quoi, tu ne connais pas PB ? Va falloir parcourir tout le forum alors !

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.
  • Index
  •  » Powerscripts
  •  » [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

#1 03-11-2008 13:02:35

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

[RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Bonjour,

De nombreuses fonctions de DLL demandent des char* comme argument. C'est justement mon cas aujourd'hui, et je ne parviens pas à m'en sortir.
Une fonction de la DLL demande un chemin d'accès à un fichier comme argument.
La DLL est écrite en C, encodage ANSI.

Voici ce que dit la documentation de ma DLL :

DWORD SetDECKeyListFile(IN char *szKeyListFilePath)
-Loads the key-list file and decrypt data found in files.

Voici ce que dit la documentation PowerBuilder au sujet du passage d'arguments char* (pointers) à une fonction externe :

Datatype in source code : * (any pointer)
Size, sign, precision : 32-bit pointer
PowerBuilder datatype : Long

Datatype in source code : char *
Size, sign, precision : Array of bytes of variable length    
PowerBuilder datatype : Blob

J'en déduis donc que je vais devoir passer du Blob à ma fonction... Ce que je fais lors de ma déclaration en Global external function :

Code: pb

FUNCTION long SetDECKeyListFile(blob szKeyListFilePath) LIBRARY "Csr_PicDEC.dll" alias for "SetDECKeyListFile;Ansi"


Je fais donc mon appel à la fonction comme ceci :

Code: pb

blob lb_test_dec
lb_test_dec = blob("C:\CSR\EXE\ENC.PCS0001.list.V0001.ENC", EncodingANSI!)

SetDECKeyListFile(lb_test_dec); 


Et lorsque j'exécute mon code, mon application crashe avec le message :

PowerBuilder application execution error (R0021)
Application terminated.
Error : Bad runtime function reference at line ... in open event of object ....

Voyez-vous un soucis particulier ? Moi je ne comprends pas vraiment le problème...

Dernière modification par Nyphel (04-11-2008 17:15:38)

Hors ligne

 

#2 03-11-2008 14:30:48

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Salut,


Encore avec tes problèmes de char* je vois...

Bon, ici tu dois passer un path, donc une string (en C les string sont des tableaux de char, donc char* est un pointeur vers ce tableau...), donc moi, j'essaierais avec:

Code: pb

FUNCTION long SetDECKeyListFile(string szKeyListFilePath) LIBRARY "Csr_PicDEC.dll" alias for "SetDECKeyListFile;Ansi"


Je suppose que ta dll attend de l'ANSI puisqu'elle attend un char* et non un wchar*, donc bien vu pour le ";ANSI"

Essaie déjà ça, on verra...

Hors ligne

 

#3 03-11-2008 14:42:01

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Code: pb

string ls_test_dec
ls_test_dec = "C:\CSR\EXE\ENC.PCS0001.list.V0001.ENC"

char lc_test_dec[100]
lc_test_dec = "C:\CSR\EXE\ENC.PCS0001.list.V0001.ENC"

blob lb_test_dec
lb_test_dec = blob("C:\CSR\EXE\ENC.PCS0001.list.V0001.ENC", EncodingANSI!)

SetDECKeyListFile(ls_test_dec); 


J'ai tenté différents types sans succès.
A vrai dire je me demande si PowerBuilder voit bien ma DLL. N'étant pas un objet COM, je ne peux pas enregistrer la DLL via regsvr32. J'ai ajouté son répertoire en tête du Path, j'ai aussi tenté de la mettre directement dans le répertoire d'exécution... Mais rien n'y fait.

Hors ligne

 

#4 03-11-2008 15:04:04

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

pour char *, je tenterais un ref string...


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 03-11-2008 15:07: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: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Je viens de tester, ça crashe exactement de la même façon :-/
Je l'ai déclarée en (ref string ...), et j'ai simplement passé ma string en paramètre lors de l'appel.

Dernière modification par Nyphel (03-11-2008 15:14:35)

Hors ligne

 

#6 03-11-2008 16:00:33

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Es-tu bien sûr que ta doc est la doc de la dll, et non la doc pour les programmeur C qui gèrent cette dll? Parce que quand tu compile la dll, tu es censé choisir un nom d'export de fonction (DllExport quelque chose comme ça), mais parfois, il arrive que ce nom d'export soit le nom de fonction interne pré- ou post-fixé de quelque chose...

Je pense que tu peux vérifier en ouvrant ta dll avec un editeur de texte sans formatage (wordpad peut-être, sinon notepad++ est super) et rechercher le nom de la fonction que tu tentes d'appeler (les dllExport sont en principe lisible en clair). Tu verras peut-être une légère différence dans le nom, voir même plusieur version de ta fonction: 1 post-fixée d'un "A" pour ANSI et 1 postFixée d'un "U" pour Unicode,...

C'est une idée, sinon je ne sais pas...

Hors ligne

 

#7 03-11-2008 16:03:45

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

L'en-tête .H m'a été transmis pour lever toute ambiguïté :

Code:

EXPORT DWORD SetDECKeyListFile(IN char *szKeyListFilePath);
EXPORT DWORD DecryptAESFile(IN char * szFilePath, OUT UCHAR ** ppcDecryptedData, OUT DWORD * pdwDecryptedSize);
EXPORT DWORD DecryptAESFileAndCalculateMD5(IN char * szFilePath, OUT UCHAR ** ppcDecryptedData, OUT DWORD * pdwDecryptedSize, OUT UCHAR * szMD5);
EXPORT DWORD ReleaseDecryptedPointer(IN UCHAR ** ppcDecryptedData);
EXPORT DWORD EncryptKeysFileData(IN UCHAR * pcData, IN DWORD dwSize, IN char * szTargetPath);

L'idée était bonne... J'y ai cru !

Dernière modification par Nyphel (03-11-2008 16:04:21)

Hors ligne

 

#8 04-11-2008 08:15:58

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Zut!

Bon, ben moi je pense que je vais jeter l'éponge, je suis à court d'idée. Ca devrait marcher pourtant!
Bon courage Nyphel

Hors ligne

 

#9 04-11-2008 08:54:42

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Et n'est-il pas simplement probable que mon application n'accède pas à la DLL ?
Peut-être que ma fonction est correctement déclarée, mais que mon application ne voit pas du tout la DLL, donc que ca crashe...

Hors ligne

 

#10 04-11-2008 09:34:04

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Bonjour,

ça y ressemble, pour faire mes tests dans ce genre de situation, pour assurer, je copie la dll dans C:\Windows\System32.

Après modification du path, le mieux est de rebooter windows pour assurer le coup et recharger correctement le nouveau contexte. Normalement, une simple relance de Powerbuilder suffit pour recharger le nouveau contexte. Si tu ne l'as pas fait, PB ne trouvera pas la DLL.

J'utiliserai effectivement une ref string dans ce cas. Il n'y a effectivement pas de raisons pour que cela ne fonctionne pas.

Hors ligne

 

#11 04-11-2008 10:35:59

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

buck a écrit:

J'utiliserai effectivement une ref string dans ce cas. Il n'y a effectivement pas de raisons pour que cela ne fonctionne pas.

Moi je ne pense pas, mais je peux me tromper
Le proto du header est en effet

Code:

EXPORT DWORD SetDECKeyListFile(IN char *szKeyListFilePath);

et le IN est très explicite à mmon avis : paramètre en entrée uniquement, mettre le string en ref serait dangereux à mon sens...

Hors ligne

 

#12 04-11-2008 11:50:55

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Merci encore pour votre aide !
J'ai testé avec mes librairies dans C:\Windows\System32, dans le path, dans le répertoire de l'exécutable, après reboots, ... Avec des types char[], string, blob et blob[],... Avec et sans passage par référence... Mais rien n'y fait.

Dernière modification par Nyphel (04-11-2008 11:51:52)

Hors ligne

 

#13 04-11-2008 12:42:59

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Bonjour,

Pour moi c'est un pointeur char * donc un passage par référence(Prototyping API Calls for Powerbuilder) => ref string, même si la variable est IN, elle n'est tout simplement pas modifié par la procédure appelante en retour.

Autre idée, les appels externes sont sensibles à la casse, comme te l'a conseillé Cortex, tu édites la DLL avec le notepad ou wordpad, le nom de ta fonction appelante devrait apparaître en clair dans le binaire. Et tu vérifies que le nom et la casse sont très exactement identique à ta déclaration dans PB.

Hors ligne

 

#14 04-11-2008 13:11:46

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C


Code: pb

FUNCTION long SetDECKeyListFile(string szKeyListFilePath) LIBRARY "Csr_PicDEC.dll" alias for "_SetDECKeyListFile@4;Ansi"

Code: pb

string ls_test_dec
ls_test_dec = "C:\CSR\EXE\ENC.PCS0001.list.V0001.ENC"
SetDECKeyListFile(ls_test_dec); 


Voici qui semble fonctionner, du moins ça ne crashe plus...
La documentation n'était donc pas à jour, de même que le fichier d'en-tête .H
En éditant le fichier .DLL avec WordPad, j'ai remarqué cette étrange écriture du nom de fonction, avec du underscore et du arobase... Et ça semble fonctionner.

Je vous remercie pour vos précieux conseils, je ne tag pas desuite comme résolu, mais ça semble en bonne voie

Hors ligne

 

#15 04-11-2008 13:18:18

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Ha ben voilà, enfin

Tu pourras féliciter l'équipe qui gère ta dll pour leur partage de connaissance, leur proactivité et leur maîtrise de la compilation de dll...

...non, j'ai rien dit...

Hors ligne

 

#16 04-11-2008 17:15:23

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

Re: [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

;)

Tout fonctionne à merveille, merci encore pour cette aide précieuse !

Hors ligne

 
  • Index
  •  » Powerscripts
  •  » [RESOLU] Type Char* et Powerbuilder : passage d'arguments à une fonction C

Pied de page des forums

Propulsé par FluxBB 1.2.22