-1

我正在尝试使用文档中提到的参数在 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;
4

1 回答 1

0

更新:

事实证明,FOCUSINFO 参数只需要是一个“out”参数而不是“reference”。所以正确的代码是:

[DllImport("PDLRTAPI.dll", EntryPoint = "PDLRTGetFocusW", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
        public static extern bool PDLRTGetFocus([In] UInt16 adrMode,
                                             [Out] FOCUSINFO pFocusInfo,
                                             [In, Out] IntPtr pfn,
                                             [In, Out] IntPtr pvUser,
                                             [In, Out] [MarshalAs(UnmanagedType.LPStruct)] CMN_ERROR_MANCLASS pError);

所以对于遇到这个问题的每个人:检查参数,尤其是 dll 函数的数据类型两次......

无论如何,感谢所有试图帮助我的人。

于 2020-10-22T11:17:08.850 回答