2010-03-17 87 views
0

我正在Delphi 2010中的一個DLL上工作。它導出一個接收變體數組的過程。我希望能夠採取這些變種之一,並將其​​轉換成一個字符串,但我一直越來越?????Delphi 2010變種unicode問題

我無法更改輸入變量 - 它必須是一個變量數組。 調用DLL的宿主應用程序無法更改。這是寫在2006年德爾福

樣品DLL的代碼:

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

使用D2006我的DLL工作正常。我曾嘗試使用VartoStr - 沒有運氣。當我檢查VarType我得到varString。任何建議如何解決這個問題?

回答

0

1 /你怎麼稱呼VarToStr()功能? VarToString(Arruid[0])

2 /您的Delphi2006應用程序是否將AnsiString或WideString發送到DLL? 如果是這樣,並且如果(1)不起作用,請嘗試投射到AnsiString而不是string

1

你的主機應用程序發送一個AnsiString,你會想到一個UnicodeString
Unicode字符串在Delphi 2009中引入,在Delphi 2006中不存在。如何解決它?嘗試[未經測試]:

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

也許[也未經測試]:

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

您還可以檢查是否孤單是一個函數像VarToStr接受AnsiStrings(也許在AnsiStrings單位?)。

+0

您無法使用ShareMem解決與Unicode/Ansi相關的D2006和D2010之間的問題。他們使用完全不同形式的內存管理器。 – 2011-03-17 02:53:14

+0

@肯白你是對的,我的錯。我忘記了embarcadero也改變了內存管理器(現在它使用fastmm)。 – 2011-03-17 03:00:51