我正在尝试使用文档中提到的参数在 C# 中调用 dll 函数,该参数为“...如果传递了 pfn = NULL,则调用是同步的。”。我实际上将 NULL (IntPtr.Zero) 传递给它,所以该方法应该被称为同步的。现在,当我调用该方法时,我总是收到“FatalExecutionEngineError”,ErrorCode 0xc0000005,我认为同步是问题所在。
所以我的问题是:如何在 C# 中调用同步的 C DLL 方法?或者我是否需要该方法的回调函数?
dll 来自 Siemens WinCC Runtime,有关方法的文档在此处(GetFocus 方法在第 1923 页):https ://cache.industry.siemens.com/dl/files/216/109755216/att_940522/v1/WCC_PReference_en -US.pdf?download=true
dll导入:
[DllImport("PDLRTAPI.dll", EntryPoint = "PDLRTGetFocusW", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool PDLRTGetFocus([In] UInt16 adrMode,
[In, Out] ref FOCUSINFO pFocusInfo,
[In, Out] IntPtr pfn,
[In, Out] IntPtr pvUser,
[In, Out] [MarshalAs(UnmanagedType.LPStruct)]
CMN_ERROR_MANCLASS pError);
方法调用:
pdlrtapiDLLWrapper.FOCUSINFO focusinfo = new pdlrtapiDLLWrapper.FOCUSINFO();
bRet = pdlrtapiDLLWrapper.PDLRTGetFocus((UInt16)1, ref focusinfo, IntPtr.Zero, IntPtr.Zero, err);
C#中FOCUSINFO的结构
[StructLayout(LayoutKind.Auto, CharSet = CharSet.Unicode)]
public class FOCUSINFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string szPicture;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string szObject;
}
PDLRTAPI.h 中 FOCUSINFO 的结构
typedef struct tagFOCUSINFOW
{
WCHAR szPicture[256];
WCHAR szObject[256];
} FOCUSINFOW, *LPFOCUSINFOW;
ADRMODE 的 typedef 是:
typedef unsigned short ADRMODE;