从 .net 调用 Delphi 6 COM 对象时发出土耳其语字符
我有一个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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Delphi 6 字符串类型本身就是 Ansi(每个字符一个字节)。 COM“BSTR”类型和 .NET 字符串类型本身就是 Unicode UTF-16(每个 unicode 代码点两个字节,其中大部分对应于单个字符)。
如果 Delphi 6 中的 COM 函数代码使用 WideString 而不是字符串,那么您应该能够毫无问题地执行 COM 函数调用。否则,您可能会陷入代码页转换问题。也可以使用 ANSIString 转换为土耳其语代码页,但在我看来,这种转换在您的代码中隐式发生,因此您应该查找这些隐式转换并删除 String (AnsiString) 的误用,替换带 WideString 的类型。
有两种方法可以执行 COM 函数调用,但您没有指定。
使用 OLE 变体进行调用。
变量
o:OleVariant;
ws:宽字符串;
开始
o := CreateOleObject('NameThing.OtherThingName');
o.MethodName(ws); // 这应该可以。注意:在 Delphi 6 中不要使用 STRING 类型。
end;
使用带有类型库的本机 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.
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;
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.