Tag: unmanaged

SafeHandle和HandleRef

在阅读了这两个内容后,包括在这个网站上的高投票答案,我仍然觉得这有点不清楚。 由于我对此事的理解可能是错误的,我将首先发布我所知道的概要,以便我可以纠正如果我错了,然后发布我的具体问题: 有时在编写托管代码时,我们必须将地址传递给非托管代码。 这就是IntPtr的用途。 但是,我们尝试确保两个相反的事情:a)保持指针(到一个地址)从GC中存活。 b)在不需要时释放它(即使我们忘记明确地这样做)。 HandleRef执行第一个,SafeHandle执行第二个。 (我实际上是指这里列出的SafeHandle的派生词)。 我的问题: 显然,我想确认两者。 那么我该如何获得该function呢? (这是主要问题。) 从这里和从MSDN (“调用一个托管对象”)看起来只有someObject.Handle可能是GC’d,而一个独立的IntPtr不会。 但IntPtr 本身是管理的! IntPtr如何在超出范围之前进行GC(如此处所述)?

使用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属性为空时会出现问题。 有没有其他方法来阅读细胞? 或者我可以做的任何改变,请详细说明。

检测到CallbackOnCollectedDelegate

我是一个应用程序的子类。 我的子类Window过程在DLL中。 我在DLL中的子类代码看起来有点像这样(剥离,删除其他非相关部分)。 class FooBar { private delegate int WndProcDelegateType(IntPtr hWnd, int uMsg, int wParam, int lParam); private const int GWL_WNDPROC = (-4); private static IntPtr oldWndProc = IntPtr.Zero; private static WndProcDelegateType newWndProc = new WndProcDelegateType(MyWndProc); internal static bool bHooked = false; [DllImport(“user32.dll”)] private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, WndProcDelegateType dwNewLong); [DllImport(“user32.dll”)] private […]

在内存中从.CAB存档或InfoPath XSN文件中提取的最小C#代码

最近我一直在尝试实现一些从InfoPath XSN文件(.CAB存档)中提取文件的function。 在广泛搜索互联网之后,似乎没有本机.NET API。 所有当前的解决方案都围绕着大型库,即托管的C ++,它包含了Cabinet.dll。 遗憾的是,所有这些都违反了我的公司“没有第三方图书馆”的政策。 从2.0开始,.NET获得了一个名为UnmanagedFunctionPointer的属性,该属性允许使用__cdecl进行源级回调声明。 在此之前,__ stdcall是镇上唯一的节目,除非你不介意捏造IL,这种做法在这里也是非法的。 我立即知道这将允许为Cabinet.dll实现一个相当小的C#包装器,但我无法在任何地方找到一个示例。 有没有人知道使用本机代码执行此操作的方式比下面更清晰? 我当前的解决方案(执行非托管代码,但完全正常,在32/64位上测试): [StructLayout(LayoutKind.Sequential)] public class CabinetInfo //Cabinet API: “FDCABINETINFO” { public int cbCabinet; public short cFolders; public short cFiles; public short setID; public short iCabinet; public int fReserve; public int hasprev; public int hasnext; } public class CabExtract : IDisposable { //If any of […]

从非托管进程卸载.NET DLL

我正在使用我最好在托管DLL中的C#中实现的代码扩展我的Inno-Setup脚本。 我已经知道如何从托管DLL导出方法作为在非托管进程中使用的函数。 它可以通过IL编织来完成,并且有一些工具可以实现自动化: NetDllExport (由我编写) UnmanagedExports 因此,在导出后,我可以在Inno-Setup安装程序中从Pascal脚本调用我的函数。 但是有一个问题:DLL似乎不再被卸载了。 使用Inno-Setup的UnloadDLL(…)无效,文件将保持锁定状态,直到安装程序退出。 因此,安装程序等待2秒,然后无法从临时目录(或安装目录)中删除我的DLL文件。 事实上,它确实存在,直到有人清理驱动器。 我知道无法再从AppDomain卸载托管程序集,除非整个AppDomain关闭(进程退出)。 但是对于非托管主机进程意味着什么呢? 是否有更好的方法允许Inno-Setup在加载和使用后卸载或删除我的DLL文件?

在c#中创建非托管c ++对象

我有一个非托管的dll,里面有一个“MyClass”类。 现在有没有办法用C#代码创建这个类的实例? 要调用它的构造函数? 我尝试过,但是visual studio会报告错误,并显示该内存区域已损坏或其他内容。 提前致谢

Marshal.AllocHGlobal VS Marshal.AllocCoTaskMem,Marshal.SizeOf VS sizeof()

我有以下结构: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct WAVEHDR { internal IntPtr lpData; // pointer to locked data buffer internal uint dwBufferLength; // length of data buffer internal uint dwBytesRecorded; // used for input only internal IntPtr dwUser; // for client’s use internal uint dwFlags; // assorted flags (see defines) internal uint dwLoops; // loop control […]

如何使用st#:: vector作为C#参数调用非托管C ++函数?

出于性能原因,我有一个C#前端和一个C ++后端。 现在我想调用一个C ++函数,例如: void findNeighbors(Point p, std::vector &neighbors, double maxDist); 我想要的是一个C#包装函数,如: List FindNeigbors(Point p, double maxDist); 我可以将像Point []这样的平面数组传递给非托管C ++ dll,但问题是,我不知道要分配多少内存,因为我不知道函数将返回的元素数量… 是否有一种优雅的方式来处理这个没有内存泄漏的麻烦? 谢谢你的帮助! 本杰明

使用托管C ++ / CLI中的C#扩展方法

如果我的术语有点偏离,请原谅我。 我对托管C ++ / CLI的了解非常有限。 我有一个MFC应用程序,使用启用了/ clr选项的DLL。 这个dll使用几个C#dll与使用WCF的服务器通信。 在大多数情况下,这工作正常。 在其中一个C#dll中,我向System.Net.IPAddress类添加了一个扩展方法,该类将检索IPAddress对象的子网掩码(使用UnicastIPAddressInformation类及其IPv4Mask)。 扩展方法在C#方面运行良好,但我无法弄清楚如何在托管C ++ / CLI代码中使用它。 首先,这甚至可能吗? 如果是这样,托管C ++ / CLI端的语法是什么样的? 我必须使用/ clr:pure选项才能使用吗? 以下是扩展方法的示例: using System.Net; using System.Net.NetworkInformation; public static class IPAddressExtensions { public static IPAddress GetSubnetMask(this IPAddress address) { UnicastIPAddressInformation addressInfo = address.GetAddressInformation(); // elided return ((addressInfo != null) ? addressInfo.IPv4Mask : null); } } 在我的托管C […]

Windows Azure未找到C ++ / CLI项目的DLL

我有一个包含非托管C压缩库的C ++ / CLI项目,该项目由调用C ++ Compress函数的MVC3项目引用。 一切都在本地工作正常,但当我将解决方案发布到Azure云时,我得到一个错误,说它无法找到模块/ dll: 无法加载文件或程序集“LZGEncoder.DLL”或其依赖项之一。 指定的模块无法找到。 为什么找不到DLL文件? 它是错误的地方还是正在编译? 有什么方法可以检查吗? 谢谢!