0

我有一个delphi 6 COM dll。它有类似 dosomething(const LicenceName: Widestring); 的方法

当我从 .net csharp 使用这个 COM 时,例如:comdll.dosomething("ğüşiöçĞÜŞİÖÇ"),我在 com dll 中获得 licenceName 参数,因为“güsiöçGÜSIÖÇ”一些土耳其字符消失了。

我应该怎么做才能正确传递土耳其字符?

提前致谢

4

1 回答 1

0

Delphi 6 字符串类型本身就是 Ansi(每个字符一个字节)。COM "BSTR" 类型和 .NET 字符串类型本身是 Unicode UTF-16(每个 unicode 代码点两个字节,其中大部分对应一个字符)。

如果你在 Delphi 6 中的 COM 函数代码使用 WideString 而不是字符串,你应该能够毫无问题地调用你的 COM 函数。否则,您可能会陷入代码页转换问题。也可以使用 ANSIString 转换为土耳其语代码页,但在我看来,这种转换隐含在您的代码中,因此您应该查找那些隐式转换并消除对 String (AnsiString) 的误用,替换WideString 类型。

有两种方法可以调用你的 COM 函数并且你没有指定。

  1. 使用 OLE 变体调用。

    var o:OleVariant;ws:宽字符串;开始 o := CreateOleObject('NameThing.OtherThingName'); o.MethodName(ws); // 这应该工作。注意:不要在 Delphi 6 中使用 STRING 类型。

  2. 使用带有类型库的本机 COM 调用。正确执行此操作的详细信息取决于您的特定功能参数。您尚未指定是否有 MyUnit_TLB.pas 单元,但如果有,请更新问题并显示您正在调用的实际方法。

于 2011-11-30T14:47:30.450 回答