Tag: pinvoke

C#:如何将null传递给期望ref的函数?

我有以下function: public static extern uint FILES_GetMemoryMapping( [MarshalAs(UnmanagedType.LPStr)] string pPathFile, out ushort Size, [MarshalAs(UnmanagedType.LPStr)] string MapName, out ushort PacketSize, ref Mapping oMapping, out byte PagesPerSector); 我想这样称呼: FILES_GetMemoryMapping(MapFile, out size, MapName, out PacketSize, null, out PagePerSector); 不幸的是,我不能在需要类型ref Mapping的字段中传递null而且没有强制转换我已尝试修复此问题。 有什么建议?

在C#中使用pinvoke时,和ref之间有什么区别?

使用[In,Out]和将参数从C#传递给C ++时只使用ref有什么区别吗? 我发现了几个不同的SOpost,以及来自MSDN的一些东西也接近我的问题,但并没有完全回答它。 我的猜测是我可以安全地使用ref,就像我使用[In,Out]一样,并且marshaller将不会采取任何不同的行为。 我担心的是它会采取不同的行为,并且C ++对我传递的C#结构不满意。 我已经在我正在使用的代码库中看到了两件事情…… 以下是我发现并一直在阅读的post: P / Invoke [In,Out]属性是否可选用于编组数组? 让我觉得我应该使用[In,Out]。 MSDN:InAttribute MSDN:OutAttribute MSDN:定向属性 这三个post让我觉得我应该使用[In,Out],但我可以使用ref代替它,它将具有相同的机器代码。 这让我觉得我错了 – 所以问这里。

P / Invoke和C ++ Wrappers之间的性能差异

在学习P / Invoke的过程中,我问过上一个问题: 如何在涉及指针时进行P / Invoke 但是,我不太明白在C#中使用P / Invoke而不是在托管C ++中创建包装器的含义。 在C#中使用P / Invoke创建相同的DLL肯定会导致更清晰的接口,因为我可以在嵌入式资源上使用DLLImport,但是我自己编组的本机DLL的托管C ++包装器会有更好的性能吗?

生成P / Invoke代码的最简单方法是什么?

我是一位经验丰富的.Net程序员,但在我的生活中还没有编译过C / C ++程序。 现在我有这个C-dll,标题和文档(第三方,而不是Win API),我需要从中调用十种方法。 我在考虑使用Platform Invoke。 我发现这三个工具可以为我创建代码: PInvoker: http ://www.pinvoker.com P / Invoke Interop助手: http : //www.codeplex.com/clrinterop P / Invoke向导: http : //www.paulyao.com/res/pinvoke/pinvoke.aspx 可能 Swig: http ://www.swig.org/ Pinvoker似乎与Interop助手和向导有一些不同的方法。 Swig我刚刚检查到这里没有问过这个问题。 这些工具的优缺点是什么? 鉴于我对C / C ++知之甚少,对我来说生成P / Invoke代码的最佳=最简单,最安全的方法是什么?

没有找到入口点的例外

我正在尝试在C#项目中使用C ++非托管dll,并且在尝试调用一个无法找到入口点的函数时遇到错误。 public class Program { static void Main(string[] args) { IntPtr testIntPtr = aaeonAPIOpen(0); Console.WriteLine(testIntPtr.ToString()); } [DllImport(“aonAPI.dll”)] public static extern unsafe IntPtr aaeonAPIOpen(uint reserved); } 这是函数的dumpbin: 5 4 00001020 ?aaeonAPIOpen@@YAPAXK@Z 我将dll导入更改为[DllImport(“aonAPI.dll”, EntryPoint=”?aaeonAPIOpen”)]和[DllImport(“aonAPI.dll”, EntryPoint=”_aaeonAPIOpen”)]并且没有运气。

从另一个进程获取win32线程的StartAddress

背景: 我在Win32中编写了一个multithreading应用程序,我使用System.Diagnostics命名空间中的Process类从C#代码开始。 现在,在C#代码中,我想获取Win32应用程序中创建的每个线程的起始地址的名称/符号,以便我可以将与线程相关的信息(例如CPU使用情况)记录到数据库中。 基本上,C#代码启动Win32应用程序的多个实例,监视它们,如果需要则终止,然后将info / error / exceptions / reason / etc记录到数据库。 为此,我已经包装了两个Win32 API即。 SymInitialize和SymFromAddr在我自己编写的程序友好的API中,如下所示: extern “C” { //wraps SymInitialize DllExport bool initialize_handler(HANDLE hModue); //wraps SymFromAddr DllExport bool get_function_symbol(HANDLE hModule, //in void *address, //in char *name); //out } 然后使用pinvoke从C#代码调用这些API。 但它不起作用, GetLastError提供126 错误代码 ,这意味着: 指定的模块无法找到 我将Process.Handle作为hModule传递给两个函数; initialize_handler似乎工作,但get_function_symbol没有; 它给出了上述错误。 我不确定我是否通过了正确的手柄。 我尝试传递以下句柄: Process.MainWindowHandle Process.MainModule.BaseAddress 两者都在第一步失败(即调用initialize_handler )。 我将Process.Threads[i].StartAddress作为第二个参数传递,这似乎是失败的原因,因为ProcessThread.StartAddress似乎是RtlUserThreadStart函数的地址, 而不是特定于应用程序的启动函数的地址。 […]

使用.NET 4.5.2从C#代码更改键盘布局

我正在编写我的SDL Trados Studio插件。 插件的最后一部分需要一些API完全没有公开的自动化,所以我所拥有的(保持某些东西)是自动化默认的键盘快捷键。 我的代码完全适用于英文键盘布局(以及匈牙利语!),但它当然不适用于希腊语,俄语等等。 我一直在寻找解决方案,但直到现在我都找不到它,不是在网上也不是在SO上,比如这篇文章: 通过代码改变键盘布局c# 我需要将键盘布局更改为英语,以便它可以采用正确的快捷键(和其他字符串)。 然后我需要将其切换回之前的状态。 我正在使用非常有限的API,因此我只有SendKeys我使用。 这是工作代码: //Save the document SendKeys.SendWait(“^s”); //Open files view SendKeys.SendWait(“%v”); SendKeys.SendWait(“i”); SendKeys.SendWait(“1”); Application.DoEvents(); //get url and credentials from a custom input form string[] psw = UploadData.GetPassword( Settings.GetValue(“Upload”, “Uri”, “”), Vars.wsUsername == null ? Settings.GetValue(“Upload”, “User”, “”) : Vars.wsUsername, Vars.wsPassword == null ? “” : Vars.wsPassword ); […]

如何获取与特定文件夹关联的图标?

我的一个项目中需要我从其路径获取特定文件夹的图标。 例如: 如果我使用C:\Users\Username\Desktop我想获取与Desktop文件夹关联的图标 如果我使用具有自定义图标的文件夹的路径,我想获得该图标 不,我不想要一般默认文件夹图标 我一直在寻找将近3天没有运气。 任何帮助表示赞赏。

WCT GetThreadWaitChain调用allways返回false

我试图获取有关某些线程的WCT信息,但每次调用GetThreadWaitChain函数时,我都会得到错误的响应,并且ref参数保持为零。 我究竟做错了什么? 我在一个调用WaitForMultipleObjects的线程上调用此函数,我确保在调试时此线程等待。 那是我的代码: internal void CollectWaitInformation(ClrThread thread) { var g_WctHandle = OpenThreadWaitChainSession(0, 0); uint threadID = thread.OSThreadId; WAITCHAIN_NODE_INFO[] NodeInfoArray = new WAITCHAIN_NODE_INFO[WCT_MAX_NODE_COUNT]; int isCycle = 0; int count = 0; // Make a synchronous WCT call to retrieve the wait chain. bool result = GetThreadWaitChain(g_WctHandle, IntPtr.Zero, WCTP_GETINFO_ALL_FLAGS, threadID, ref count, NodeInfoArray, out isCycle); if […]

使用std :: string为PInvoke定制Marshaler

免责声明:C ++ / CLI Noob问题 我正在尝试在签名中具有std :: string的C ++ DLL上使用PInvoke。 目前我只是测试:我的目标是将字符串传递给本机DLL,然后返回它。 本机导出如下所示: #define NATIVE_CPP_API __declspec(dllexport) NATIVE_CPP_API void hello_std(std::string inp, char* buffer) { const char* data = inp.data(); strcpy(buffer, data); } 我正在尝试使用自定义封送器以正常方式对其进行PInvoke: [DllImport(“native_cpp.dll”, EntryPoint = “?hello_std@@YAPADV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z”, CallingConvention = CallingConvention.Cdecl)] private static extern void hello_std( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(clr_wrapper.string_marshaler))] String inp, StringBuilder buffer); static void Main(string[] args) […]