从 .net 调用 Delphi 6 COM 对象时发出土耳其语字符

发布于 2024-12-18 11:35:45 字数 259 浏览 1 评论 0原文

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

当我使用 .net csharp 中的 COM 时,如下所示: comdll.dosomething("ğüşiöçĞÜŞіÖÇ"),我在 com dll 中得到的 licenceName 参数为“güsiöçGÜSIÖÇ” 一些土耳其人的性格消失了。

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

提前致谢

i have a delphi 6 COM dll. it has method like dosomething(const LicenceName: Widestring);

when i use this COM from .net csharp like:
comdll.dosomething("ğüşiöçĞÜŞİÖÇ"), i get the licenceName param in com dll as "güsiöçGÜSIÖÇ"
some turkish character disappears.

what should i do to pass Turkish characters correctly ?

Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千笙结 2024-12-25 11:35:45

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

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

有两种方法可以执行 COM 函数调用,但您没有指定。

  1. 使用 OLE 变体进行调用。

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

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

Delphi 6 string types are natively Ansi (single byte per character). The COM "BSTR" type, and .NET string type are natively Unicode UTF-16 (two bytes per unicode codepoint, most of which correspond to a single character).

If your COM function code in Delphi 6 uses WideString instead of string, you should be able to do your COM function call without an issue. Otherwise, you are falling into a codepage conversion issue, perhaps. It is also possible to convert to a Turkish codepage with ANSIString, but in my opinion such a conversion is happening implicitly in your code, and so you should look for those implicit conversions and remove the mis-use of String (AnsiString), replacing the types with WideString.

There are two ways you could be doing your COM function calll and you didn't specify.

  1. Invocation using OLE Variants.

    var
    o: OleVariant;
    ws:WideString;
    begin
    o := CreateOleObject('NameThing.OtherThingName');
    o.MethodName(ws); // this should work. Note: Do NOT use STRING type here in Delphi 6.
    end;

  2. Invocation using native COM with a type library. Details of doing this correctly depend on your specific function parameters. You have not specified if you have a MyUnit_TLB.pas unit, but if you have please update the question and show the actual method you're invoking.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文