Tag: pinvoke

编组结构,嵌入指针从C#到非托管驱动程序

我正在尝试使用P / Invoked DeviceIoControl()调用将C#(.NET Compact Framework 3.5)与Windows CE 6 R2流驱动程序连接。 对于其中一个IOCTL代码,驱动程序需要一个DeviceIoControl输入缓冲区,该缓冲区是包含嵌入指针的以下非托管结构: typedef struct { DWORD address; const void* pBuffer; DWORD size; // buffer size } IOCTL_TWL_WRITEREGS_IN; 我在C#中定义了结构: [StructLayout(LayoutKind.Sequential)] public struct IoctlWriteRegsIn { public uint Address; public byte[] Buffer; public uint Size; } 和我的P / Invoke签名为: [DllImport(“coredll.dll”, CharSet = CharSet.Unicode, SetLastError = true)] static extern bool […]

照明USB OpenDMX FTD2XX DMXking

几个快速的问题。 我有一个DMX王USB照明控制器,我正试图控制。 它基于Open DMX协议(来自Entec),提供ac#class。 我已经将设备插入RGB设备,如果我用他们的驱动程序测试USB设备,它连接到COM4,当我将他们的软件切换到发送模式时,我可以设置单独的DMX通道。 使用他们的OpenDMX类,进行一些修改(核心是相同的,我刚刚添加了一些额外的错误检查,我可以找到设备,查询它的信息等。当我打开设备时,我得到一个句柄。我可以写使用FT_Write到那个设备,但不管我做什么,实际上没有灯亮起来。 以下是一些相关的代码片段: public static byte[] buffer; [DllImport(“FTD2XX.dll”)] public static extern FT_STATUS FT_Open(UInt32 uiPort, ref uint ftHandle); [DllImport(“FTD2XX.dll”)] public static extern FT_STATUS FT_Write(uint ftHandle, IntPtr lpBuffer, UInt32 dwBytesToRead, ref UInt32 lpdwBytesWritten); public static void writeData() { while (!done) { try { initOpenDMX(); status = FT_SetBreakOn(handle); status = FT_SetBreakOff(handle); bytesWritten = write(handle, […]

C#和SendMessage(键)无法正常工作

我试图将密钥发送到应用程序。 为了方便测试,我只使用了记事本。 这就是代码的样子: [DllImport(“USER32.DLL”, EntryPoint = “SendMessageW”, SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool SendMessage(IntPtr hwnd, int Msg, int wParam, int lParam); const int WM_KEYDOWN = 0x100; const int WM_a = 0x41; public void Press() { Process[] p = Process.GetProcessesByName(“notepad”); IntPtr pHandle = p[0].MainWindowHandle; SendMessage(pHandle, WM_KEYDOWN, […]

如何从C#调用这个delphi .dll函数?

// delphi代码(delphi版本:Turbo Delphi Explorer(它是Delphi 2006)) function GetLoginResult:PChar; begin result:=PChar(LoginResult); end; //使用上面的delphi函数的C#代码(我使用的是unity3d,在C#中) [DllImport (“ServerTool”)] private static extern string GetLoginResult(); // this does not work (make crash unity editor) [DllImport (“ServerTool”)] [MarshalAs(UnmanagedType.LPStr)] private static extern string GetLoginResult(); // this also occur errors 在C#中使用该function的正确方法是什么? (也用于delphi,代码就像if(event = 1)和(tag = 10)然后writeln(’Login result:’,GetLoginResult);)

无法在DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点

我们有一台特定的Vista x64机器,在运行我们的C#WinForms应用程序时,会显示以下错误: System.EntryPointNotFoundException:无法在DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点。 这个代码在其他Vista机器上运行正常。 出于某种原因,这台特殊的Vista机器总是抛出这个例外。 我们该如何解决这个问题?

keybd_event需要KEYEVENTF_EXTENDEDKEY说明

在文档中它说: KEYEVENTF_EXTENDEDKEY (0x0001):如果指定,则扫描代码前面有一个值为0xE0(224)的前缀字节。 有人能解释这意味着什么吗? 这有什么区别: keybd_event(RIGHT, 0, 0, 0); keybd_event(RIGHT, 0, 2, 0); 还有这个: keybd_event(RIGHT, 0, 1 | 0, 0); keybd_event(RIGHT, 0, 1 | 2, 0); 因为当我执行这段代码时,我看不出有什么区别? 另外,什么是“字节bScan”? 在描述中它是:密钥的硬件扫描代码。 那意味着什么?

在C#中使用SetFilePointer已经取消了堆栈

好的,我在C#和.NET 4.0中使用SetFilePointer函数。 以下是我用来调用此函数的dllimports: [DllImport(“Kernel32.dll”, SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] static extern uint SetFilePointer([In] SafeFileHandle hFile, [In] long lDistanceToMove, [Out] out int lpDistanceToMoveHigh, [In] EMoveMethod dwMoveMethod); 每当我运行在调试器中使用SetFilePointer函数的代码时,我都会遇到以下exception: PInvokeStackImbalance was detected Message: A call to PInvoke function ‘MyDiskStuff!MyDiskStuff.HardDisk::SetFilePointer’ has unbalanced the stack. This is likely because the managed PInvoke signature does not match […]

拦截ESC而不从缓冲区中删除其他按键

我有一个控制台应用程序,提示用户输入多个。 我希望用户能够在任何提示取消操作后按下escape。 就像是: if (Console.ReadKey().Key != ConsoleKey.Escape) { string input = Console.ReadLine(); … } 但问题是,如果按下除escape之外的键,它将不是输入的一部分(从ReadLine返回)。 有没有办法“偷看”下一个键,否则这样做?

正确调用非托管DLL函数的约定

我正在尝试为LibVLC DLL库编写一个简单的超简单轻量级包装器。 我不需要访问太多,只需要播放暂停和停止媒体文件的能力。 我正在查看文档和我发现的其他链接解释了旧版本的LibVLC,但它已经过时了最新版本。 我也试过LibVLC.Net,但它也已经过时了,我找不到我在源代码中寻找的内容,以便将它与我想要导出的函数相匹配。 我有以下签名我正试图导出: libvlc_new (int argc, const char *const *argv) 说明: argc the number of arguments (should be 0) argv list of arguments (should be NULL) 这就是我正在尝试的方法。 [DllImport(“libvlc”, EntryPoint = “libvlc_new”)] public static extern IntPtr New(Int32 argc, String[] argv); 描述表明它应该是一个数组,我认为问题是第二个参数。 我试过了: [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] argv 根据这里的说法,还有一些其他的选项,比如这里建议的String和StringBuilder,但是每当我调用函数时我仍然会遇到Imbalanced PInvoke堆栈。 我需要知道什么是正确的调用约定,很可能是其他几个函数。 “PInvoke For […]

将Clarion Procedure声明转换为C#DLLImport

如何将此Clarion过程声明转换为C#? 它是用C编写的第三方DLL的一部分,它没有太多文档。 我已经列出了正常工作的Clarion方法的原型。 在C#中,我不确定用什么类型替换*CString 。 我试过像@DanielC建议的char[] ,但它没有用。 我还发现Clarion long是32位(感谢@ shf301)。 号角: SendRequest Procedure(*CString xData,Long DataLen,Long xTimeout),Byte,Virtual C#(我试过的,哪个不起作用): [DllImport(“3RD_PARTY_API.dll”)] private static extern long SendRequest(ref string xData, int DataLen, int xTimeout); 当我在C#中调用SendRequest方法时,我从VS2010获得了标准的PInvokeStackImbalance检测错误。 我认为这是参数类型的问题,而不是DllImport声明中的CharSet或EntryPoint 。 我真的只是坚持如何将*CString转换为有效的C#类型。