我正在尝试从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 无效。这些在文档中描述:
vt
使用pvProp传递的值的数据类型。定义了有效类型 在“wtypes.h”包含文件中的“VARENUM”枚举中 属于编译器。没有VT_VARIANT,VT_DISPATCH或其他 应该使用引用。PvProp
指向保存属性值的标记的指针。数据 值的类型由vt确定。对于pvProp,您可以指定任何 为Variant数据类型定义的值;请参阅包含的值 在“wtypes.h”中包含属于您的编译器的文件。对于类型 具有缓冲区(例如BSTR)的缓冲区由缓冲区分配 函数,然后必须由调用应用程序清除。