comment je peux traduire en delphi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #ifndef _VER #define LRLIB_C_API extern "C" #else #define LRLIB_C_API #endif
comment je peux traduire en delphi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #ifndef _VER #define LRLIB_C_API extern "C" #else #define LRLIB_C_API #endif
salut
un truc dans ce genre le seul probleme
c'est que le extern "C" indique si la methode
vient de l'exterieur ou pas dans ton cas je pense que tu peut l'oublier
@+ Phil
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 {$ifndef _VER} const LRLIB_C_API := 'extern "C"' ;<== ??? {$else} const LRLIB_C_API := ''; <== ??? {$endif}
en faite je traduit des .h pour charger une DLL ecrite en C++ dans delphi ,
donc je pense que j'en aurai besoin non ?
et pour traduire cela :
j'ai fait ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 const char *OmPlrGetErrorStringA(OmPlrError error); const wchar_t *OmPlrGetErrorStringW(OmPlrError error); #ifdef UNICODE #define OmPlrGetErrorString OmPlrGetErrorStringW #else #define OmPlrGetErrorString OmPlrGetErrorStringA #endif
mais ca compile pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 var OmPlrGetErrorStringA: function(error: OMPLRERROR): PCHAR ;cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var OmPlrGetErrorStringW: function(error: OMPLRERROR): WCHAR_T ;cdecl {$IFDEF WIN32} stdcall {$ENDIF}; {$IFDEF UNICODE} const OmPlrGetErrorString = OmPlrGetErrorStringW; {$ELSE} const OmPlrGetErrorString = OmPlrGetErrorStringA; {$ENDIF}
il dit:
pour la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Pas assez de paramètres originaux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3const OmPlrGetErrorString = OmPlrGetErrorStringA;
Juste une chose, quand tu as fait les modifs est-ce que tu as ajouté les options de compilation dans les options de ton projet ?
vous voulez dire quoi par options de compilation ? j'ai rien changé normalement.
Généralement, si tu veux que la compilation traite des lignes et pas d'autres. Genre compileret pas
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2const OmPlrGetErrorString = OmPlrGetErrorStringW;
Tu vas dans project->options->directories/conditionals->conditional defines et tu définis UNICODE. Si t'en a plusieurs, tu les sépares par des ; et après tu ne compile pas directement, tu fais build all (tout construire). Mais je ne sais pas trop si cela va résoudre ton problème.
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2const OmPlrGetErrorString = OmPlrGetErrorStringA;
UNICODE est une directive de Visual C++, indiquant qu'on est dans un projet Unicode. Vu que Delphi n'est pas Unicode, on oublie, et on fait comme si UNICODE n'était pas définie.
Mui,
Aïe.
Attention à ne pas confondre les constantes de Delphi et le travail du pré-processeur C ou C++
Pour Delphi,
signifie que tu crées un constante OmPlrGetErrorString qui prend la valeur OmPlrGetErrorStringW.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2const OmPlrGetErrorString = OmPlrGetErrorStringW;
Et bien entendu, comme OmPlrGetErrorStringW est en fait une fonction, Delphi ne veut pas de cette définition.
Il n'y a rein qui remplacer aussi simplement un #define du C ou C++, comme ceci
qui est une directive pour le pré-compilateur, l'informant de remplacer toutes les occurrences de OmPlrGetErrorString par OmPlrGetErrorStringW, cela au niveau élémentaire du texte du code source, avant que la compilation proprement dite sit effectuée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define OmPlrGetErrorString OmPlrGetErrorStringW
Mui,
Aïe.
Attention à ne pas confondre les constantes de Delphi et le travail du pré-processeur C ou C++
Pour Delphi,
signifie que tu crées un constante OmPlrGetErrorString qui prend la valeur OmPlrGetErrorStringW.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2const OmPlrGetErrorString = OmPlrGetErrorStringW;
Et bien entendu, comme OmPlrGetErrorStringW est en fait une fonction, Delphi ne veut pas de cette définition.
Il n'y a rein qui remplacer aussi simplement un #define du C ou C++, comme ceci
qui est une directive pour le pré-compilateur, l'informant de remplacer toutes les occurrences de OmPlrGetErrorString par OmPlrGetErrorStringW, cela au niveau élémentaire du texte du code source, avant que la compilation proprement dite soit effectuée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define OmPlrGetErrorString OmPlrGetErrorStringW
Non : les define de Delphi ne servent qu'à faire de la compilation conditionnelle.
si delphi ne reconnais pas les UNICODE alors j'enleve toutes les lignes à l'interieure de la définition de cette directive !!!
j'enleve les fonctions foncW et je ne laisse que les foncA
Bonjour,
il est vrai que définir ces fonctions en version ansi ou unicode selon une directive de compilation n'a pas beaucoup d'intérêt, car pour l'utiliser il faudrait que toutes les autres fonctions le soient ainsi que les chaines de caractères.
Pour l'utiliser en C++ il faut déjà toujours utiliser des macro de type _T("Ma chaine") (remplaçant par "Ma chaine" en ansi et L"Ma chaine" en unicode) ; ceci pour pouvoir compiler un programme en ANSI puis en UNICODE sans changer le code (juste en définissant ou non la macro UNICODE).
Néanmoins cela reste réalisable (pour le sport) en Delphi avec des const :
Mais ceci est aussi possible (et peut-être plus simple car réutilisable pour toutes les fonctions) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function OmPlrGetErrorStringA(error: OMPLRERROR): PCHAR ; stdcall ; external NomLib name 'OmPlrGetErrorStringA'; function OmPlrGetErrorStringW(error: OMPLRERROR): PWCHAR ; stdcall ; external NomLib name 'OmPlrGetErrorStringW'; type TOmPlrGetErrorStringA = function(error: OMPLRERROR): PCHAR ; stdcall ; TOmPlrGetErrorStringW = function(error: OMPLRERROR): PWCHAR ; stdcall ; const {$IFDEF UNICODE} OmPlrGetErrorString : TOmPlrGetErrorStringW = OmPlrGetErrorStringW; {$ELSE} OmPlrGetErrorString : TOmPlrGetErrorStringA = OmPlrGetErrorStringA; {$ENDIF}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 const VERS_WIDE = 'W'; VERS_ANSI = 'A'; {$IFDEF UNICODE} VERS_TCHAR = VERS_WIDE; {$ELSE} VERS_TCHAR = VERS_ANSI; {$ENDIF} type {$IFDEF UNICODE} PTChar = PWideChar; {$ELSE} PTChar = PAnsiChar; {$ENDIF} function OmPlrGetErrorStringA(error: OMPLRERROR): PAnsiChar; stdcall ; external NomLib name 'OmPlrGetErrorString'+VERS_ANSI; function OmPlrGetErrorStringW(error: OMPLRERROR): PWideChar; stdcall ; external NomLib name 'OmPlrGetErrorString'+VERS_WIDE; function OmPlrGetErrorString (error: OMPLRERROR): PTChar ; stdcall ; external NomLib name 'OmPlrGetErrorString'+VERS_TCHAR;
Si tu laisses tes instructions sous des {$ifdef OPTION}. Sois tu définis OPTION pour que le programme "passe" dans les lignes de code écrites sous OPTION, Soit tu ne la définis pas pour compiler les autres lignes (càd ceux du {$else})
Par exemple en écrivant :Et que dans les options de ton projet tu définis OPTION. Il n'y a que SuiteInstructions1 qui sera compiler, sinon c'est SuiteInstructions2.
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part {$ifdef OPTION}SuiteInstructions1{$else}SuiteInstructions2{$endif}
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager