Как объявить аргументы типа void * в IDL - PullRequest
1 голос
/ 26 января 2012

Я занимаюсь разработкой проекта ATL.Некоторые интерфейсы содержат аргументы для передачи различных указателей.Вот мой файл IDL:

import "oaidl.idl";
import "ocidl.idl";
[
    object,
    uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
    dual,
    nonextensible,
    helpstring("IMyObject Interface"),
    pointer_default(unique)
]
interface IMyObject : IDispatch{
    [id(1), helpstring("method Make")] HRESULT Make(DWORD type, LPVOID settings);
    [id(2), helpstring("method Deserialize")] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};
[
    uuid(E57065B4-498F-4347-9ACC-A2C86A771720),
    version(1.0),
    helpstring("TestComVoid 1.0 Type Library")
]
library TestComVoidLib
{
    importlib("stdole2.tlb");
    [
        uuid(1DC2528B-EA49-4F89-BB56-B1D667379644),
        helpstring("MyObject Class")
    ]
    coclass MyObject
    {
        [default] interface IMyObject;
    };
};

Первый метод IMyObject создает объект на основе типа и соответствующей структуры.Второй метод создает объект на основе двоичных данных.

Но я получаю ошибку MIDL2139: тип параметра не может быть получен из void или void *

Кроме того, я хочу создать оболочку C #с аргументами IntPtr для передачи указателей.(«Добавить ссылку» -> COM -> «Библиотека типов TestComVoid 1.0»)

Я попытался использовать INT_PTR вместо LPVOID, затем я получил int вместо IntPtr.Я попытался использовать DWORD_PTR вместо LPVOID, тогда я получаю uint вместо IntPtr.Я пытался использовать VARIANT вместо LPVOID, затем я получаю Object вместо IntPtr.

Как правильно передавать указатели на эти случаи?

Ответы [ 2 ]

4 голосов
/ 30 января 2012

Я нашел решение.Для этих методов нужно использовать атрибут local.Вот оно:

[
    object,
    uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
    dual,
    nonextensible,
    helpstring("IMyObject Interface"),
    pointer_default(unique)
]
interface IMyObject : IDispatch{
    [id(1), helpstring("method Make"), local] HRESULT Make(DWORD type, LPVOID settings);
    [id(2), helpstring("method Deserialize"), local] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};
0 голосов
/ 27 мая 2012

Вы получили int вместо IntPtr, потому что INT_PTR действительно определено как "int". Это значит "int size pointer" - не указатель на int.

Просто используйте LPDWORD (LPINT) вместо INT_PTR.

...