Tag: pinvoke

C ++和C#互操作性:P / Invoke与C ++ / CLI

在找到C#和C ++之间的互操作方法的过程中,我发现这篇文章解释了P / Invoke。 我读了很多文章声称C ++ / CLI不是精确的C ++,需要一些努力来修改原始的C ++代码。 我想问一下,当我想要从C#对象中使用一些C ++对象(代码/数据)时,最佳方法是什么。 看起来为了使用P / Invoke,我应该提供C风格的API。 这是真的吗? 我的意思是,有没有办法将C ++对象导出到C#,如带有P / Invoke的SWIG? 或者,我是否必须将SWIG用于此目的? 将C ++更改为C ++ / CLI有多难? 与将C ++重写为C#相比,是否值得尝试? C ++设计得很好,所以将它实现到C#并不是很重要。 (关于主题问题)还有其他方法吗? 我的意思是,如果我想使用C ++中的C#代码,有没有办法这样做?

如何设置C ++函数以便p / invoke可以使用它?

希望这是一个无脑的简单问题,但它表明我缺乏C ++的专业知识。 我是一名C#程序员,过去我和其他人的C ++ / C dll一起完成了P / Invoke的大量工作。 但是,这次我决定自己编写一个包装器C ++ DLL(非托管),然后从C#调用我的包装器dll。 我遇到的问题是我无法定义可以通过p / invoke找到的C ++函数。 我不知道这是什么语法,但这是我到目前为止所做的: extern bool __cdecl TestFunc() { return true; } 最初我只是有这个,但它也没有用: bool TestFunc() { return true; } 然后在C#方面,我有: public const string InterfaceLibrary = @”Plugins\TestDLL.dll”; [DllImport( InterfaceLibrary, CallingConvention = CallingConvention.Cdecl, EntryPoint = “TestFunc” ), SuppressUnmanagedCodeSecurity] internal static extern bool TestFunc(); 所有东西都编译,但是当我执行这个C#p […]

SendMessage与WndProc

我正在尝试扩展TextBox控件以添加水印function。 我在CodeProject上找到的例子是使用导入的SendMessage函数。 [DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = false)] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); void SetWatermark() { SendMessage(this.Handle, 0x1501, 0, “Sample”); } 我想知道为什么不使用受保护的WndProc void SetWatermark() { var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni(“Sample”) }; WndProc(ref m); } 两者似乎都很好。 […]

C#P在64位系统上调用user32.dll

从64位应用程序中ping 64位Windows上的user32.dll是不对的? 我成功完成了很多次并且从未出现过错误,但这似乎是矛盾的。 我应该寻找user64.dll吗?

访问Delphi DLL抛出exceptionexception

当我调用Dll方法时,它有时会引发exception,有时则不会。 我这样称呼它: public class DllTest { [DllImport(@”MyDll.dll”)] public extern static string MyMethod(string someStringParam); } class Program { static void Main(string[] args) { DllTest.MyMethod(“SomeString”); } } 我有时得到的例外是: AccessViolationException 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 有没有人知道我为什么有时会得到这个例外? 为什么有时会顺利运行?

正确的方法来组织SIZE_T *?

我有以下C ++函数定义,我试图通过托管代码通过PInvoke调用: bool FooBar(SIZE_T* arg1); 我的管理声明如下: [DllImport(“mydll”, SetLastError=true, CharSet=CharSet.Unicode)] private static extern bool FooBar(ref uint arg1); 有些人可能会注意到我最终做的同样的错误。 这不是64位便携式。 SIZE_T的大小可变(32-64位),指针也是如此。 在托管大小上,指针正确转换为64位,但uint没有,并且您最终可以在arg1的高位中使用垃圾。 这是一个特别持久的错误,因为垃圾通常只是零:( 我已经开始工作的唯一解决方案是以下管理声明: [DllImport(“mydll”, SetLastError=true, CharSet=CharSet.Unicode)] private static extern bool FooBar(ref IntPtr arg1); 这当然有效,因为IntPtr可以正确地改变它的大小。 在我的代码中,我只是将IntPtr视为一个整数,它可以工作,虽然它看起来像一个丑陋的黑客。 在我看来,应该有一些方法来正确指定,也许使用UnmanagedType.SysUInt,但我一直无法提出任何其他工作解决方案。

如何编组一个可变大小的结构数组? C#和C ++互操作帮助

我有以下C ++结构 struct InnerStruct { int A; int B; }; struct OuterStruct { int numberStructs; InnerStruct* innerStructs; }; 还有一个C ++函数 OuterStruct getStructs(); 我如何将其编组为C#? C#定义的位置 struct OuterStruct { InnerStruct[] innerStructs; };

隐藏另一个应用的任务栏按钮

我希望能够从任务栏隐藏另一个应用程序的窗口,而不隐藏窗口本身。 具体来说,我想在Alt + Tab列表中运行,可见,可用的几个不同的Web浏览器,但不占用任务栏上的空间。 (如果有人好奇为什么:我编写了一个仪表板应用程序,它使用Vista的DwmRegisterThumbnail API一次显示多个窗口的实时预览 – 如果你愿意,那就是一种“画中画”。此时,还有任务栏按钮对于那些窗口似乎是多余的。) 我知道更改其他窗口的样式以包含WS_EX_TOOLWINDOW会将其隐藏在任务栏中,我首先尝试了这个。 但是,正如预期的那样,它有一些我不想要的副作用:标题栏变得更短(不是很糟糕,我猜)并且最小化和最大化按钮消失了(不好)。 我还必须隐藏并重新显示窗口以使任务栏识别出更改,这会导致重新绘制工件,当我对IE窗口进行操作时。 我的下一个想法是,由于默认情况下窗口与所有者隐藏在任务栏中,也许我可以将其他窗口更改为我的所有。 但MSDN 非常清楚 “创建一个拥有的窗口,应用程序无法将窗口的所有权转移到另一个窗口。” 我发现这个问题与我的问题类似,但它特别关注来自您自己的流程的窗口,您可以完全控制窗口所有权。 有没有人知道隐藏任务栏按钮的任何其他方法,这将适用于来自另一个进程的窗口? 更新: Tormod通过ITaskbarList让我走上了正确的轨道 – 它非常棒。 pinvoke.net页面有一些错误(错误的GUID,按字母顺序而不是按接口顺序声明的方法),但我编辑了它,进行了更正,还添加了一个如何通过其coclass实例化ITaskbarList的示例。 更新2:如果您使用DeleteTab隐藏窗口的任务栏按钮,然后将其设置为活动窗口(例如,通过SetForegroundWindow或Alt + Tab),它的任务栏按钮将重新出现。 为了保持任务栏按钮隐藏,我不得不添加一个计时器并继续调用DeleteTab。 只要您不介意任务栏按钮在窗口聚焦时重新出现,这很有效。

从磁盘编号中检索虚拟磁盘文件名

当我在diskpart中列出虚拟磁盘时: DISKPART> list vdisk VDisk ### Disk ### State Type File ——— ——– ——————– ——— —- VDisk 0 Disk 2 Attached not open Fixed C:\Disk.vhd 对我来说有趣的部分是文件名。 如果我知道磁盘号,我试图找到相应的函数,它会给我文件名(在File列下)。 理想情况下,我会给“ \\?\ PhysicalDrive2 ”,我会得到“ C:\ Disk.vhd ”作为结果。 我已经尝试过: 使用diskpart和解析输出 – 因为它是未记录的格式,它可以随时更改。 这不是我所依赖的。 常规VHD API – 没有函数将磁盘号作为参数。 Microsoft.Storage.Vds.dll – 有一些枚举通过每个驱动器(例如Service.Providers),但没有属性/函数可以给我源文件的名称。 虽然我现在可以确定例如驱动器D:是虚拟驱动器,但我仍然无法知道附加了哪个.vhd文件。 知道哪个function可能是什么?

通过pInvoke在C#中IMetroMode :: IsLauncherVisible?

在Windows 8的C#中,我如何pInvoke IMetroMode :: IsLauncherVisible方法? 该方法的详细信息可在此处找到: http : //msdn.microsoft.com/en-us/library/windows/desktop/hh404166(v = vs.85).aspx