我正在尝试从 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),缓冲区由函数分配,之后必须由调用应用程序清除。