Как исправить обертку C # для C ++?

Я пытаюсь вызвать функцию из DLL. Описание функции в C ++:

BOOL WINAPI PDLCSGetPropertyEx(LPCTSTR lpszProjectName, LPCTSTR lpszPictureName, LPCTSTR lpszObjectName, LPCTSTR lpszPropName, VARTYPE vt, LPVOID pvProp, DWORD dwFlags, LPVOID pData, PCMN_ERROR pError);

В C # я написал:

[DllImport("pdlcsapi.dll", EntryPoint = "PDLCSGetPropertyEx", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
    public static extern bool PDLCSGetPropertyEx(
        [In] String lpszProjectName,
        [In] String lpszPictureName,
        [In] String lpszObjectName,
        [In] String lpszPropName,
        VarEnum vt,
         IntPtr pvProp,
        [In] UInt32 dwFlags,
        [In] IntPtr pData,
        [In,Out] [MarshalAs(UnmanagedType.LPStruct)] CMN_ERROR_MANCLASS pError
        );

и вызов в приложении:

WinCCODK_PDLCS.CMN_ERROR_MANCLASS errPdl;
        errPdl = new WinCCODK_PDLCS.CMN_ERROR_MANCLASS();
        IntPtr p = new IntPtr();
        String propName = listBox2.SelectedItem.ToString();
        String objName = listBox1.SelectedItem.ToString();
        bool ret = WinCCODK_PDLCS.CPDLCSWrapper.PDLCSGetPropertyEx(
            "C:\\DemoProjectV72_Light\\DemoProjectV72_Light.mcp"
            , "io.pdl"
            , objName
            , propName
            , VarEnum.VT_I4
            , p
            , 0
            , IntPtr.Zero
            , errPdl ); 
        if (ret){
            listBox2.Items[listBox2.SelectedIndex] = listBox2.Items[listBox2.SelectedIndex] + val.ToString();
        }else{
            MessageBox.Show(errPdl.szErrorText);
        }

После вызова этой функции приложение падает (появляется стандартное окно Windows, перестала работать программа)

Как передать параметры в функцию?

Другие функции этой библиотеки работают нормально.,

Я думаю, что не правильно работает с параметрами vt и PvProp. Они описаны в документации:

Вермонт
Тип данных значения, переданного с помощью pvProp. Допустимые типы определены в перечислении "VARENUM" в файле включения "wtypes.h", принадлежащем компилятору. Никакие VT_VARIANT, VT_DISPATCH или другие ссылки не должны использоваться.

PvProp
Указатель на тег, в который сохраняется значение свойства. Тип данных значения определяется vt. Для pvProp вы можете указать любое значение, определенное для типа данных Variant; обратитесь к значениям, содержащимся в включаемом файле "wtypes.h", принадлежащем вашему компилятору. Для типов, которые имеют буфер (например, BSTR), буфер выделяется функцией и должен впоследствии очищаться вызывающим приложением.

0 ответов

Другие вопросы по тегам