Я пытаюсь вызвать функцию из 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, перестала работать программа)
Как передать параметры в функцию?
Другие функции этой библиотеки работают нормально. ,
Я думаю, что не работает правильно с параметрами Вермонт а также PvProp. Они описаны в документации:
Вермонт
Тип данных значения, переданного с помощью pvProp. Допустимые типы определены
в перечислении «VARENUM» в файле включения «wtypes.h»
принадлежность к компилятору. Нет VT_VARIANT, VT_DISPATCH или других
ссылки должны быть использованы.PvProp
Указатель на тег, в который сохраняется значение свойства. Данные
тип значения определяется vt. Для pvProp вы можете указать любой
значение, определенное для типа данных Variant; обратитесь к содержащимся значениям
в «wtypes.h» включите файл, принадлежащий вашему компилятору. Для типов
которые имеют буфер (например, BSTR), буфер выделяется
функция и должна быть впоследствии очищена вызывающим приложением.
Задача ещё не решена.
Других решений пока нет …