2010-03-17 5 views
0

Je travaille sur une DLL dans Delphi 2010. Il exporte une procédure qui reçoit un tableau de variantes. Je veux être en mesure de prendre l'une de ces variantes, et le convertir en une chaîne, mais je continue à obtenir ?????Delphi 2010 variante au problème unicode

Je ne peux pas changer la variable d'entrée - il doit être un tableau de variantes. L'application hôte qui appelle la DLL ne peut pas être modifiée. Il est écrit en Delphi 2006.

code DLL Exemple:

Procedure TestArr(ArrUID : array of variant); stdcall; 
var 
    i: integer; 
    s: string; 
begin 
    s:= string(String(Arruid[0])); 
    showmessage(s); 
end; 

En utilisant D2006 ma DLL fonctionne très bien. J'ai essayé d'utiliser VartoStr - pas de chance. Quand je vérifie le VarType j'obtiens un varString. Des suggestions pour résoudre ce problème?

Répondre

0

1/Comment appelez-vous la fonction VarToStr()? VarToString(Arruid[0])?

2/Votre application Delphi2006 envoie-t-elle AnsiString ou WideString à la DLL? Si tel est le cas, et si (1) ne fonctionne pas, essayez de passer à AnsiString au lieu de string.

1

Votre application hôte envoie un AnsiString et vous attendez un UnicodeString.
Les chaînes Unicode ont été introduites dans Delphi 2009, elles n'existent pas dans Delphi 2006. Comment résoudre ce problème? Essayez [non testé]:

Procedure TestArr(ArrUID : array of variant); stdcall; 
var 
    i: integer; 
    s: AnsiString; 
begin 
    s:= Ansistring(VarToStr(Arruid[0])); 
    showmessage(s); 
end; 

ou peut-être [aussi non testé]:

Procedure TestArr(ArrUID : array of variant); stdcall; 
var 
    i: integer; 
    s: AnsiString; 
begin 
    s:= Ansistring(AnsiString(Arruid[0])); 
    showmessage(s); 
end; 

Vous pouvez également vérifier si Theres est une fonction qui accepte comme VarToStrAnsiStrings (peut-être dans l'unité AnsiStrings?).

+0

Vous ne pouvez pas utiliser ShareMem pour résoudre des problèmes entre D2006 et D2010 liés à Unicode/Ansi. Ils utilisent des formes totalement différentes du gestionnaire de mémoire. –

+0

@Ken White vous avez raison, mon erreur. J'ai oublié que embarcadero a changé le gestionnaire de mémoire aussi (maintenant il utilise fastmm). –