Tag: pinvoke

Pinvoke DeviceIoControl参数

我正在使用DeviceIoControl C#项目。 我已经为我的签名咨询了相关的Pinvoke.net页面 : [DllImport(“Kernel32.dll”, SetLastError = false, CharSet = CharSet.Auto)] public static extern bool DeviceIoControl( SafeFileHandle hDevice, EIOControlCode IoControlCode, [MarshalAs(UnmanagedType.AsAny)] [In] object InBuffer, uint nInBufferSize, [MarshalAs(UnmanagedType.AsAny)] [Out] object OutBuffer, uint nOutBufferSize, out uint pBytesReturned, [In] IntPtr Overlapped ); 我之前从未见过object和[MarshalAs( UnmanagedType.AsAny )] ,但MSDN文档听起来很有希望: 一种动态类型,它在运行时确定对象的类型,并将对象编组为该类型。 该成员仅对平台调用方法有效。 我的问题是:使用此签名的“最佳”和/或“正确”方式是什么? 例如, IOCTL_STORAGE_QUERY_PROPERTY期望InBuffer是STORAGE_PROPERTY_QUERY结构。 看起来我应该能够定义该结构,创建一个new实例,并将其传递给我的Pinvoke签名: var query = new STORAGE_PROPERTY_QUERY { […]

从C#调用C ++函数,具有许多复杂的输入和输出参数

我是C#的新手,但他在C ++方面做了很多工作。 我有一个需要从C#调用的C ++函数。 在阅读了SO和一些谷歌搜索的一些答案之后,我得出结论,我需要为该函数创建一个纯C接口。 我已经这样做了,但我仍然对如何从C#调用它感到困惑。 C ++中的函数如下所示: int processImages( std::string& inputFilePath, // An input file const std::vector& inputListOfDirs, // Input list of dirs std::vector& vecInternalStruct, // Input/Output struct std::vector<std::vector >& OutputIntsForEachFile, std::vector< std::vector >& vecVecSmallStruct, // Output int verboseLevel ); 用C语言转换的相同函数如下所示: int processImagesC( char* p_inputFilePath, // An input file char** p_inputListOfDirs, // Input list […]

无法使用pinvoke将WM_CLOSE发送到Windows资源管理器窗口

我有一个C#应用程序,它使用SendMessage pinvoke方法向应用程序外的各个窗口发送“关闭窗口”消息(WM_CLOSE / 16)。 这很有用,除非有问题的窗口是Windows资源管理器窗口。 我没有exception,但窗口没有关闭。 这是签名: [DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = false)] internal static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 我需要将不同的消息发送到Windows资源管理器窗口吗? 或另一种方法来实现这一目标?

从其他窗口获取ListView项目

我正在做一些关于c#的项目。 我需要从ListView窗口获取i项目,通过做这样的事情我得到它的句柄 IntPtr par_hWnd = API.FindWindow(null, “Form1”); IntPtr child1 = API.FindWindowEx(par_hWnd, (IntPtr)0, null, null); API是我的静态类,有很多来自“user32.dll”的dllimports我能够获得这个ListView中的项目数: IntPtr count = API.SendMessage(child1, API.LVM_GETITEMCOUNT, 0, 0); 现在我需要获取item的文本,但结果必须放在LVITEM Structure中,我不知道如何正确调用SendMessage ,以及如何在c#中实现LVITEM 。 找不到c#的例子。 有帮助吗?

使用SendMessage的C#,WM_COPYDATA的问题

我已经花了几天(或更多)试图让这个工作。 手头的应用程序是FTPRush ,我知道有一个名为rush_cmdline.exe的cmd行应用程序,它使用SendMessage向FTPRush发送请求。 从调试rush_cmdline.exe我可以看到lParam , wParam , Message和hWnd 。 我的代码如下(使用SendMessage,而不是SendMessageW): [DllImport(“User32.dll”, EntryPoint = “FindWindow”)] public static extern Int32 FindWindow(String lpClassName, String lpWindowName); [DllImport(“USER32.DLL”, EntryPoint= “SendMessage”)] public static extern IntPtr SendMessage(int hWnd, int Msg, int wParam, IntPtr lParam); 我还尝试了另一个规范: [DllImport(“User32.dll”, EntryPoint = “SendMessage”)] public static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam); […]

使用LayoutKind.Explicit的布尔编组,这是否已按设计破坏或失败?

首先,布尔类型被称为具有四字节值的默认编组类型。 以下代码有效: struct A { public bool bValue1; public int iValue2; } struct B { public int iValue1; public bool bValue2; } public static void Main() { int[] rawvalues = new int[] { 2, 4 }; A a = (A)Marshal.PtrToStructure(GCHandle.Alloc(rawvalues, GCHandleType.Pinned).AddrOfPinnedObject(), typeof(A)); Assert.IsTrue(a.bValue1 == true); Assert.IsTrue(a.iValue2 == 4); B b = (B)Marshal.PtrToStructure(GCHandle.Alloc(rawvalues, GCHandleType.Pinned).AddrOfPinnedObject(), typeof(B)); Assert.IsTrue(b.iValue1 […]

如何将函数指针从C#传递给C ++ Dll?

C ++ dll中定义的函数是: static double (*Func1)(double); EXTERN_C __declspec(dllexport) __stdcall double TestDelegate(double (*fun)(double)) { Func1 = fun; return Func1(25.0); } void My_Real_purpose() { SomeClass a; a.SetFunction(Func1);//Define behaviour of a by C# in runtime a.DoSomething();//Even I want it runs in another thread! } 我试着用C#这样称呼它: class A { [DllImport(“DllName.dll”)] public extern static double TestDelegate(IntPtr f); public delegate double […]

加载64位dll时,带有HRESULT 0x8007007E的DllNotFoundException

我下载了zlib并将该库编译为Windows 32位和Windows 64位dll。 我现在有zlibwapi.dll和zlibwapi64.dll 。 dll被复制到我的应用程序文件夹中,引用如下: [DllImport(@”zlibwapi.dll”, EntryPoint = “uncompress”, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)] private static extern int uncompress32( IntPtr dest, ref uint destLen, [In(), MarshalAs(UnmanagedType.LPArray)] byte[] source, uint sourceLen ); [DllImport(@”zlibwapi64.dll”, EntryPoint = “uncompress”, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)] […]

如何调用Windows API

可能重复: Windows API和.net语言 我想从.NET Framework调用本机Windows API。 我希望有一个简单的方法,我可以像其他.NET API一样从高级层调用本机API。 请参阅您知道的任何资源。 任何帮助将不胜感激。

返回从非托管代码到托管代码的指针

我有一个非托管的DLL导出以下函数: SomeData* test(); 我们假设SomeData为: typedef struct _Data Data; struct _Data{ int a; int b; } 现在我想用C#代码调用这个函数。 我开始定义自定义编组所需的C#Struture,如下所示: [StructLayout(LayoutKind.Sequential)] public class SomeData { public Int32 a; public Int32 b; } 现在,我宣布托管函数: [DllImport(“DynamicLibrary.dll”, CharSet=CharSet.Auto)] [return: MarshalAs(UnmanagedType.LPStruct)] public static extern SomeData test(); 在主要function我有: IntPtr ptr = test(); 这样做,我得到MarchalDirectiveException:“无法封送’返回值’:无效的托管/非托管类型组合(Int / UInt必须与SysInt或SysUInt配对)。” 我没有为C#中的SomeData分配内存,因为我希望这个内存在C函数中分配,我会使用Marshal.Copy将它传递给托管内存。 有任何想法吗? 谢谢 ———————— JaredPar ANSWER之后的编辑——————– 事实上,我在将代码复制到我的问题时犯了一个错误。 我使用的真实托管签名是: […]