C#-同步调用C DLL函数

如何解决C#-同步调用C DLL函数

我正在尝试使用C#中的参数调用C#中的dll函数,该参数在文档中被称为“ ...如果传递了pfn = NULL,则该调用是同步的。”。我实际上是将NULL(IntPtr.Zero)传递给它,因此该方法应称为同步。现在,当我调用方法时,我一直都收到“ FatalExecutionEngineError”错误代码0xc0000005,并且我认为同步是问题所在。

所以我的问题是:如何在C#中同步调用C DLL方法?还是该方法需要回调函数

该dll来自西门子WinCC运行系统,有关方法的文档在这里(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,Out] IntPtr pfn,Out] IntPtr pvUser,Out] [MarshalAs(UnmanagedType.LPStruct)]
                                                       CMN_ERROR_MANCLASS pError);

方法调用

pdlrtapiDLLWrapper.FOCUSINFO focusinfo = new pdlrtapiDLLWrapper.FOCUSINFO();
            bRet = pdlrtapiDLLWrapper.PDLRTGetFocus((UInt16)1,ref focusinfo,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;

解决方法

更新:

事实证明,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,Out] IntPtr pvUser,Out] [MarshalAs(UnmanagedType.LPStruct)] CMN_ERROR_MANCLASS pError);

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?