Tag: pinvoke

SendInput在64位上失败

可能重复: SendInput和64位 我正在使用.NET代码中的SendInput(PInvoke)。 用于在32位操作系统上正常工作的代码,但现在在WIN7上SendInput返回0,最后一个错误设置为57(ERROR_INVALID_PARAMETER)。 我无法将代码编译为x86,因为我已加载到64位主机中。 此外,我尝试了各种有关结构尺寸和场偏移的解决方案,但都没有。 这些是我的PInvoke导入和类型: [StructLayout(LayoutKind.Sequential)] struct KEYBOARD_INPUT { public uint type; public ushort vk; public ushort scanCode; public uint flags; public uint time; public uint extrainfo; public uint padding1; public uint padding2; } [DllImport(“User32.dll”, SetLastError=true)] private static extern uint SendInput( uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, int structSize); 和代码用法是: uint […]

动态P /调用DLL

从.NET动态P / Invoke非托管代码的最佳方法是什么? 例如,我有许多非托管DLL,它们之间有共同的C风格导出。 我想获取DLL的路径,然后根据导出的名称P / Invoke一个函数。 直到运行时我才知道DLL名称。 基本上,什么是.NET的LoadLibrary和GetProcAddress ? (我现有的代码使用这些函数来完成相同的目标,完全在非托管代码中)。

不正确的编组:C#数组到C ++非托管数组

我有以下C#代码,其中包含结构定义(CInput),obj定义和init,以及对C ++(本机)DLL函数的调用(也是由我编写的)。 //C# code public struct CInput { [MarshalAsAttribute(UnmanagedType.R8)] public double Time; [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_R8)] public double[] Database; /* other similar fields*/ } CInput Inputs = new CInput(); /* init of Inputs fields*/ int bfr = Example(ref Inputs); //’Example’ being the C++ DLL call Messagebox.Show(bfr.ToString()); 编组第二个参数时出错,我不知道在哪里。 然后: //C++ code struct CInput { double Time; […]

C DLL中的PInvoke char *在C#中作为String处理。 null字符问题

C DLL中的函数如下所示: int my_Funct(char* input, char* output); 我必须从C#app调用它。 我这样做的方式如下: …DllImport stuff… public static extern int my_Funct(string input, string output); 输入字符串完美地传输到DLL(我有可见的certificate)。 function填写的输出虽然是错误的。 我有六进制数据,如: 3F-D9-00-01 但不幸的是,在两个零之后的所有内容都被剪切掉了,只有前两个字节来到我的C#应用​​程序。 它发生了,因为(我猜)它将它视为空字符并将其作为字符串的结尾。 任何想法我怎么能摆脱它? 我试图将它指定为IntPtr而不是字符串,但我不知道以后如何处理它。 我尝试过后: byte[] b1 = new byte[2]; Marshal.Copy(output,b1,0,2); 2通常应该是字节数组的长度。 但是我得到了各种错误:比如“请求的范围超出了数组的末尾”。 或“试图读取或写入受保护的内存……” 我感谢任何帮助。

P / Invoke动态DLL搜索路径

我有一个现有的应用程序P / Invokes到一个DLL与应用程序本身驻留在同一目录中。 现在(由于佳能生产了最疯狂的API之一)我需要支持这个API的两个版本,并在运行时确定我应该使用哪个(旧的或新的)。 由于DLL具有相同的名称(第一个加载具有相同名称的其他DLL,因此只重命名第一个将无法帮助我)我必须将它们保存在不同的目录中。 因此我的问题是:我有什么选项来控制DllImport声明中给出的DLL使用的目录? 我想我可以尝试以下两个想法中的任何一个: 1)在执行第一个P / Invoke之前使用“SetDllDirectory”设置我想要的目录,然后重置它。 2)使用“LoadLibraryEx”手动加载所需的DLL,并希望这样做。 但是,有没有更多的“.NET:ish方式”首先尝试? 更新:我意识到我可以在两个单独的.Net程序集中填充对DLL的所有访问权限,然后将它们中的每一个放在与相应API文件相对应的单独目录中。 然后我可以动态加载正确的.Net程序集,并自动加载正确的DLL。 有什么理由不行吗? 我能想到一个:我将如何调试这些东西? 有可能告诉Visual Studio一个程序集(包含在我的解决方案中)应该放在一个子目录中并从那里进行调试吗?

p / invoke返回指向struct的指针的C函数

如何在C#中声明一个返回指向结构的指针的C函数? 我相信以下是一种方法,然后是Marshal.PtrToStructure来获得实际的结构值。 // C-function SimpleStruct * Function(void); // C# import [DllImport(“MyDll.dll”)] public static extern IntPtr Function(); 我对此是否正确? 还有其他方法可以实现同样的目标吗? (可以按值返回结构)

如何使用pinvoke将C struct数组指针指向C#

我试图使用pinvoke来编组从C到C#的另一个结构内的结构数组。 AFAIK,没有办法。 所以相反,在C结构中,我向我的数组和malloc声明了一个ptr。 问题:1)如何在C#端声明等效? 2)如何在C#端分配和使用等效的? //The C code typedef struct { int a; int b; } A; typedef struct { int c; // A myStruct[100]; // can’t do this, so: A *myStruct; } B; //The c# code: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public class A{ int a; int b; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public class […]

如何将.NET位图传递给本机DLL?

这是我有的: 一个外部DLL,我用C编写。这个DLL链接到opencv。 我不想直接从C#调用OpenCV – 已经有大量的C代码访问OpenCV,它将在DLL中使用。 有一个导出函数: passbitmap(void * mem,size_t s); 我希望从中调用DLL的AC#项目。 一个System.Drawing.Bitmap对象,我想以某种方式将像素/位图数据传递给我的DLL。 我猜它是某种P / Invoke,但我从来没有这样做过,在这种情况下我不知道如何正确地做到这一点。 我该怎么办?

将C ++结构编组到C#的最有效方法是什么?

我即将开始阅读大量的二进制文件,每个文件有1000个或更多记录。 不断添加新文件,因此我正在编写Windows服务来监视目录并在收到新文件时对其进行处理。 这些文件是用c ++程序创建的。 我在c#中重新创建了结构定义,可以很好地读取数据,但是我担心我这样做会最终导致我的应用程序死机。 using (BinaryReader br = new BinaryReader(File.Open(“myfile.bin”, FileMode.Open))) { long pos = 0L; long length = br.BaseStream.Length; CPP_STRUCT_DEF record; byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))]; GCHandle pin; while (pos < length) { buffer = br.ReadBytes(buffer.Length); pin = GCHandle.Alloc(buffer, GCHandleType.Pinned); record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF)); pin.Free(); pos += buffer.Length; /* Do stuff with my […]

使用C#从另一个应用程序的SysListView32中的数据网格中读取单元格项

我试图使用C#.net ui-automation和winapi读取另一个进程的SysListView32中的数据网格项 使用ui-automation的C#代码 http://pastebin.com/6x7rXMiW 使用winapi的c#代码http://pastebin.com/61RjXZuK 使用此代码,您只需将鼠标指针放在屏幕上的SysListView32上,然后按Enter键。 现在,两个代码在具有以下属性的单元格项上返回空 pastebin.com/Rw9FGkYC 但这两个代码都适用于以下属性 pastebin.com/L51T4PLu 唯一的区别我注意到name属性包含与单元格中相同的数据,但是当name属性为空时会出现问题。 有没有其他方法来阅读细胞? 或者我可以做的任何改变,请详细说明。