Tag: pinvoke

P / Invoke,Pinning和KeepAlive最佳实践

在工作中,我们有一个本机C代码,负责读取和写入专有的平面文件数据库。 我有一个用C#编写的包装器,它将P / Invoke调用封装到OO模型中。 自项目启动以来,P / Invoke调用的托管包装器的复杂性大大增加。 有趣的是,当前的包装器做得很好,但是,我认为我实际上需要做更多的事情以确保正确的操作。 答案带来了几个笔记: 可能不需要KeepAlive 可能不需要GCHandle固定 如果您确实使用GCHandle,请尝试…最终该业务(但CER问题未解决) 以下是修订代码的示例: [DllImport(@”somedll”, EntryPoint=”ADD”, CharSet=CharSet.Ansi, ThrowOnUnmappableChar=true, BestFitMapping=false, SetLastError=false)] [ReliabilityContract(Consistency.MayCorruptProcess, Cer.None)] internal static extern void ADD( [In] ref Int32 id, [In] [MarshalAs(UnmanagedType.LPStr)] string key, [In] byte[] data, // formerly IntPtr [In] [MarshalAs(UnmanagedType.LPArray, SizeConst=10)] Int32[] details, [In] [MarshalAs(UnmanagedType.LPArray, SizeConst=2)] Int32[] status); public void Add(FileId file, string […]

C#:如何使用SHOpenFolderAndSelectItems

有人可以举例说明如何使用来自C#的shell函数SHOpenFolderAndSelectItems吗? 我不太懂得如何使用这些函数而无法在pinvoke.net上找到它… = / 说我有三个文件叫 X:\Pictures\a.jpg X:\Pictures\s.jpg X:\Pictures\d.jpg 然后我想打开X:\Pictures文件夹,选择a.jpg , s.jpg和d.jpg 。

如何从C#中调用具有char 作为OUT参数的非托管函数?

说,我有一个暴露在DLL上的函数的原型: int CALLBACK worker (char* a_inBuf, int a_InLen, char** a_pOutBuf, int* a_pOutLen, char** a_pErrBuf, int* a_pErrLen) 我确信从我的C#代码中调用该DLL函数非常容易,但它不适用于此代码: [DllImport(“mydll.dll”)] public static extern int worker( [In, MarshalAs(UnmanagedType.LPArray)] byte[] inBuf, int inputLen, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] outBuf, out int outputLen, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] errBuf, out int errorLen); … int outputXmlLength = 0; int errorXmlLength = 0; byte[] outputXml = […]

枚举所有没有mscoree的AppDomain

如何在不引用mscoree情况下枚举所有进程的域。 可能吗? 我从互联网上的某个地方找到了2007年的解决方案。 但它列举并清空收集。 这是代码: public static class DomainHelper { public static AppDomain[] LoadedDomains { get { var loadedDomains = new List(); var runtimeHost = new CorRuntimeHost() as ICorRuntimeHost; try { var enumeration = IntPtr.Zero; runtimeHost.EnumDomains(out enumeration); try { object nextDomain = null; runtimeHost.NextDomain(enumeration, ref nextDomain); while (nextDomain != null) { loadedDomains.Add((AppDomain) nextDomain); nextDomain = […]

DLLImport Int ** – 如果可以的话,如何做到这一点

我试图使用第三方DLL,它想要一个int **作为方法的参数之一。 它将参数描述为指向内存分配的指针的地址。 对不起任何困惑。 我认为参数是双向的。 DLL用于与FPGA板通信,该方法是在主机PC和PCI板之间建立DMA传输。

如何将void * C API导入C#?

鉴于此C API声明如何将其导入C#? int _stdcall z4ctyget(CITY_REC *, void *); 我已经能够做到这一点: [DllImport(@”zip4_w32.dll”, CallingConvention = CallingConvention.StdCall, EntryPoint = “z4ctygetSTD”, ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr); 当然在C#中,“void *”无法编译。 一些谷歌搜索表明它应该被翻译为“对象”。 这似乎应该工作。 但其他人表示“Void *在C / C ++术语中被称为函数指针,在C#术语中是一个委托”。 在这里,这并不是很有意义,因为它会委托给谁? 通过Google搜索找到的其他API的类似调用使用相应API中的其他函数。 但是在这个API中没有其他调用是有意义的。 该调用的文档显示了一个示例: z4ctyget(&city, “00000”); 这似乎表明甚至可以传递静态值。 它将使用object代替void *进行编译。 我不知道这是否正确,我没有机会对其进行测试(许可问题)。

从C#代码调用delphi DLL函数

我有一个在Delphi 2007中编译的DLL和一个在其他Delphi项目中使用它的例子。 这是代码的一部分: TErrorCallback = function(Msg:PChar):byte of object; TSaveEventCallback = function (Line:PChar; HiCode:PChar; LoCode:PChar; MobileNo:PChar):byte of object; function InitModule(ErrorCallback:TErrorCallback; SaveEventCallback :TSaveEventCallback; MainWindowHandle:THandle; Sock_Event:integer):byte; stdcall; external ‘My.dll’ name ‘InitModule’; function DLLSocketEvent(var msg: TMessage): byte; stdcall; external ‘My.dll’ name ‘DLLSocketEvent’; function InitObjList(Objs: array of PChar; NumObjs: byte; Name: PChar):byte; stdcall; external ‘My.dll’ name ‘InitObjList’; 这是我的C#模拟: class Message […]

将ISO C ++类暴露给C#

我需要向C#公开一些C ++类(我在Linux上构建,使用mono,因此COM不是一个选项) 到目前为止我收集的证据表明,解决这个问题的最佳方法是: 在ISO C ++类周围编写一个包装器C ++ .Net类 从C#中使用C ++ .Net类 我有以下问题: 首先,这是实现将C ++类暴露给C#的目标的“最佳”方式吗? 到目前为止,我还没有看到任何实际显示如何执行此操作的示例 – 任何人都可以建议一些链接,或者代码片段来显示如何为虚拟类完成此操作? 如何从C ++代码向C#代码发送异步消息通知? 理想情况下,我想使C#类引发事件,并将接收到的数据作为参数

如何在.NET中调用DrawThemeTextEx

我需要在Vista / 7玻璃窗口中写一个带有发光的文本,我试图调用API在那里写一些文本。 我在CodeProject中检查了一个很好的示例 ,但问题是我使用的是.NET 1(请不要问:-) 我需要将以下.NET 2代码转换为PInvoke,.NET 1代码。 // using System.Windows.Forms.VisualStyles VisualStyleRenderer renderer = new VisualStyleRenderer( VisualStyleElement.Window.Caption.Active); // call to UxTheme.dll DrawThemeTextEx(renderer.Handle, memoryHdc, 0, 0, text, -1, (int)flags, ref textBounds, ref dttOpts); .NET 1中不存在VisualStyleRenderer类,因此我需要以其他方式获取renderer.Handle 。

是否可以在不使用WMI的情况下获得网络适配器的PnPDeviceId?

我一直试图使用p / invoke setupapi调用获取给定网络适配器的PnPDeviceId但没有成功。 我不情愿地决定使用WMI,如下所示: public static string GetPnpDeviceId(string mac) { ManagementObjectCollection mo = Management.GetCollection(“Win32_NetworkAdapter”, “PNPDeviceID”, “MACAddress = ‘” + mac + “‘”); return GetFirstValueString(mo, “PNPDeviceID”); } public static ManagementObjectCollection GetCollection(string WMIClass, string WMISelect=”*”, string WMIWhere=””) { string qry = “SELECT ” + WMISelect + ” FROM ” + WMIClass + (WMIWhere == “” ? […]