IntPtr против любого другого в COM - PullRequest
1 голос
/ 18 февраля 2012

Я занимаюсь разработкой COM-объекта, который должен работать на C #, а также на VBScript.Также он должен поддерживать 32 и 64 бита.

У меня проблема с указателями.См. Часть моего .IDL

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

Если я объявлю PTRTYPE как void *, c # увидит их как IntPtr, а VB6 / VBScript увидит их "как угодно"

Проблема с этим подходомявляется то, что я не могу сделать более простую математику указателя с параметрами типа «Any».

Если я объявляю PTRTYPE как long (и «гипер» в 64 битах), теперь я могу сделать математику указателя, но в C # у меня есть два разныхопределения для одного и того же метода в зависимости от 32/64-битной платформы.

Я хочу не использовать VARIANT в качестве типа PTRTYPE.

Есть ли способ сделать его совместимым как с C #, так и с VBScript?

Заранее спасибо, Мауро.

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Я принял следующее решение:

1) Скопируйте .idl в другую папку

2) Замените __int3264 на void * в переменных, которые вы хотите использовать IntPtr

3) Создание файла .tlb из .idl one

4) Создание основного взаимодействия на основе файла .tlb.

Вуаля!

С уважением,Mauro.

0 голосов
/ 18 февраля 2012

Я бы порекомендовал не заставлять потребителя вашего типа выполнять указатель по математике.

Если объявить это как void, вы всегда можете разрешить передачу смещений в качестве параметра вместо того, чтобы заставлять потребителя выполнять манипуляции. Это может выглядеть немного больше как перегрузка Array.Copy в .NET Framework, где источник + назначение имеют смещение, переданное в виде простого целого числа.

Делая это, вы позволяете методу работать правильно независимо от того, какого потребителя вы выбираете, а также предоставляете вам средства для проверки (т. Е. Проверки правильности смещения) в вашем собственном коде вместо того, чтобы полагаться на потребитель.

...