Tag: pinvoke

RegisterHotkey Fn修饰符?

我知道你可以为RegisterHotKey使用CTRL , ALT , SHIFT等修饰符,但是Fn键怎么样? 我以前在我的笔记本电脑上有一些膨胀软件,当按下Fn + Up / Down时会改变亮度。 我删除了所有的英国媒体报道,我想编写一个同样的程序。 任何帮助表示赞赏!

在非托管回调的委托中抛出exception的含义

在非托管回调期间使用的委托中抛出exception会产生什么影响或未被感知的后果? 这是我的情况: 非托管C: int return_callback_val(int (*callback)(void)) { return callback(); } 管理C#: [DllImport(“MyDll.dll”)] static extern int return_callback_val(IntPtr callback); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate int CallbackDelegate(); int Callback() { throw new Exception(); } void Main() { CallbackDelegate delegate = new CallbackDelegate(Callback); IntPtr callback = Marshal.GetFunctionPointerForDelegate(delegate); int returnedVal = return_callback_val(callback); }

Marshal.PtrToStructure()和结构DEVMODE中的char数组有问题

我在使用Marshal.PtrToStructure()从指向DEVMODE类型结构的指针中提取数据时遇到问题。 以下是DEVMODE结构上MSDN条目的链接。 我对此结构的C#实现如下: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DEVMODE { public const int CCHDEVICENAME = 32; public const int CCHFORMNAME = 32; public unsafe fixed char dmDeviceName [CCHDEVICENAME]; public Int16 dmSpecVersion; public Int16 dmDriverVersion; public Int16 dmSize; public Int16 dmDriverExtra; public DM_FIELD_TYPE dmFields; public Int16 dmOrientation; public Int16 dmPaperSize; public Int16 dmPaperLength; public Int16 […]

在C#中使用Delphi的stuct数组和字符串

我一直在尝试以下列方式调用在Delphi中创建的方法: function _Func1(arrParams: array of TParams): Integer;stdcall; type TParams = record Type: int; Name: string; Amount : Real; end; 我的代码是: [DllImport(“some.dll”, EntryPoint = “_Func1”, CallingConvention = CallingConvention.StdCall)] public static extern int Func( [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct)] TParams[] arrParams) 结构是: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct TParams { public int Type; [MarshalAs(UnmanagedType.AnsiBStr)] public string Name; public double Amount; […]

在P / Invoke中为固定字符串传递什么?

假设这个C函数: void do_something(const char* str) 它将字符串存储在某处以供以后参考 。 此外,我在C#中有这个签名来调用这个函数: [DllImport(“NativeLib”)] static extern void do_something(string str); 现在,将字符串传递给此方法时需要做什么: 我是否需要固定字符串(使用GCHandle.Alloc() )(或者是编组创建副本)? 如果我确实需要固定它,我是否传递“原始”字符串(即我传递给GCHandle.Alloc()的字符串)? 或者我是否需要传递GCHandle.AddrOfPinnedObject()的返回值? 在这种情况下, string是正确的数据类型(对于do_something )吗? 或者我应该使用IntPtr吗?

将非托管C ++指针转换为对象到托管C#对象

我有一个用C ++编写的非托管静态库(.dll): // This is a personal academic project. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com #include “program.h” struct MyData { int32_t index; char* name; //uint8_t* data; }; extern “C” { __declspec(dllexport) MyData* GetMyData() { MyData* ms = new MyData(); ms->index = 5; ms->name = “Happy […]

使用平台Invoke(C#)在非托管代码中分配和释放内存

我想在非托管代码(C ++)中分配和释放内存,我们从托管代码(C#)中将它们称为函数。 我不确定以下代码是否没有内存泄漏? C#代码: [DllImport(“SampleDLL.dll”)] public extern void getString([MarshalAs(UnmanagedType.LPStr)] out String strbuilder); [DllImport(“SampleDLL.dll”)] public extern void freeMemory([MarshalAs(UnmanagedType.LPStr)] out String strBuilder); …. //call to unmanaged code getString(out str); Console.WriteLine(str); freeMemory(out str); C ++代码: extern void _cdecl getString(char **str) { *str = new char[20]; std::string temp = “Hello world”; strncpy(*str,temp.c_str(),temp.length()+1); } extern void _cdecl freeMemory(char **str) { […]

将C ++库嵌入.Net库中

在我的.Net程序集中,我将不得不使用一些本机(C ++)dll。 通常我们需要将C ++ dll复制到bin文件夹中并使用PInvoke来调用它。 为了节省分发成本,我想直接将C ++嵌入到我的.Net dll中,这样分发的程序集数量就会减少。 知道怎么做吗?

如何从C#调用具有void * callback和object参数的C ++ Dll中的函数

我正在尝试创建一个C dll的包装器,我试图调用一个具有回调函数的函数,接收一个对象作为传回的指针。 .h文件delares extern int SetErrorHandler(void (*handler) (int, const char*, void*), void *data_ptr); 处理程序是一个回调函数,在发生错误时调用,data_ptr是传递给你的任何对象(状态),在我的应用程序就是这个(当前对象)的情况下。 我能够在一个dll中调用函数,它使用编组的常量类型,如简单类型字符串,整数等。但我无法弄清楚如何只是编写一个指向C#对象的指针,这是一个状态。 为了通过在这里搜索我已经找到的对象引用传递对象引用,否则似乎我需要一个结构类型来能够编组该函数,所以我创建了一个结构来保存我的对象: [StructLayout(LayoutKind.Sequential)] struct MyObjectState { public object state; } 编辑:我试图在public object state属性上放置一个属性: [MarshalAs(UnmanagedType.Struct, SizeConst = 4)] ,但这会产生相同的错误,所以我删除它,似乎它无论如何都会工作。 该struct包含一个对象属性,用于保存回调函数的任何对象。 我在C#中声明了委托如下: delegate void ErrorHandler(int errorCode, IntPtr name, IntPtr data); 然后我在C#中声明了导入函数,如下所示: [DllImport(“somedll.dll”, CallingConvention = CallingConvention.Cdecl)] static extern int SetErrorHandler handler, IntPtr data); 然后我在我的C#代码中创建了一个回调函数: […]

无法捕获由PInvoke调用的C dll引起的exception

我正在编写一个使用最新MediaInfoLib Dll的C#.NET 3.5程序。 它似乎导致某些文件的exception。 我想捕获这些exception并确保我的程序继续运行, 但由于某种原因,我无法通过简单的try / catch语句来捕获它。 PInvoke方法: [DllImport(“MediaInfo.dll”)] private static extern IntPtr MediaInfo_New(); [DllImport(“MediaInfo.dll”)] private static extern IntPtr MediaInfo_Open(IntPtr Handle,MarshalAs(UnmanagedType.LPWStr)] string FileName); 用法: Handle = MediaInfo_New(); try{ MediaInfo_Open(Handle, FileName) } catch { } 调用MediaInfo_Open(Handle,FileName)可能会导致exception。 我的程序退出并且“vshost32-clr2.exe”崩溃,而不是使用try / catch语句捕获错误。 (它也作为发布版本崩溃,没有附加调试器) 在搜索网络后,我发现有人建议检查“启用非托管代码调试”,这只导致我的程序退出而没有vshost32-clr2.exe崩溃。 知道我怎么能抓住exception吗?