IntPtr 与 COM 中的 As Any

发布于 2025-01-07 10:33:11 字数 511 浏览 0 评论 0原文

我正在开发一个可以在 C# 和 VBScript 中工作的 COM 对象。它还必须支持 32 和 64 位。

我遇到的问题是指针。请参阅我的 .IDL 的一部分

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 

如果我将 PTRTYPE 声明为 void*,则 c# 将它们视为 IntPtr,而 VB6/VBScript 将它们视为“As Any”。

这种方法的问题是我无法使用“Any”类型参数进行更简单的指针数学运算。

如果我将 PTRTYPE 声明为 long(以及 64 位中的“hyper”),现在我可以进行指针数学运算,但在 C# 中,根据 32/64 位平台,我对同一方法有两个不同的定义。

我希望避免使用 VARIANT 作为 PTRTYPE 类型。

有没有办法让它同时兼容 C# 和 VBScript?

提前致谢, 毛罗.

i'm developing a COM object that should work in C# and also in VBScript. Also it must support 32 and 64 bits.

The problem I have is with pointers. See part of my .IDL

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 

If I declare PTRTYPE as void*, c# sees them as an IntPtr and VB6/VBScript sees them "As Any"

The problem with this approach is that I cannot do simpler pointer math with "Any" type parameters.

If I declare PTRTYPE as long (and "hyper" in 64 bits), now I can do pointer math but in C# I have two different definitions for the same method depending 32/64 bit platform.

I wish to avoid using VARIANT as PTRTYPE type.

Is there any way to make it compatible with both C# and VBScript?

Thanks in advance,
Mauro.

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

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

发布评论

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

评论(2

尐偏执 2025-01-14 10:33:11

我建议不要强迫您类型的消费者进行指针数学运算。

如果将其声明为 void,则始终可以允许偏移量作为参数传递,而不是强制使用者进行操作。这可能看起来更像是 . NET 框架,其中源 + 目标有一个作为简单整数传递的偏移量。

通过这样做,无论您选择哪个使用者,您都可以让该方法正常工作,并为您提供一种在您自己的代码中进行验证(即:确保偏移量合法)的方法,而不是依赖使用者。

I would recommend not forcing the consumer of your type to do the pointer math.

If declare this as void, you can always allow the offsets to be passed as a parameter, instead of forcing the consumer to do the manipulation. This could look a bit more like this Array.Copy overload in the .NET framework, where the source + destination have an offset passed as a simple integer.

By doing this, you allow the method to work correctly no matter what consumer you choose, as well as providing you a means of doing the validation (ie: making sure the offset is legitimate) in your own code instead of relying on the consumer.

神回复 2025-01-14 10:33:11

我采用的解决方案如下:

1) 将 .idl 复制到另一个文件夹

2) 将您想要成为 IntPtr 的变量中的 __int3264 替换为 void*

3) 从 .idl 文件构建 .tlb 文件

4) 构建主要互操作基于 .tlb 文件。

瞧!

问候,
毛罗.

The solution I adopted was the following:

1) Copy .idl to another folder

2) Replace the __int3264 with void* in the variables you want to be IntPtr

3) Build the .tlb file from the .idl one

4) Build a primary interop based on the .tlb file.

Voilá!

Regards,
Mauro.

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