@devolegf

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

Доброго времени суток!
Пробую вызвать функцию с dll. Описание функции на с++:
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: Прекращена работа программы) Подскажите все ли параметры правильно представил в обертке? Другие функции с этой библиотеки работают отлично. .
  • Вопрос задан
  • 368 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Параметр функции, что на С++ PCMN_ERROR pError
Явно в C# должен обьявляться с ref и вызываться функция будет тоже с ref
WinCCODK_PDLCS.CPDLCSWrapper.PDLCSGetPropertyEx(..., ref errPdl)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы