【问题标题】:Need C Sharp win32, PInvoke API需要 C Sharp win32, PInvoke API
【发布时间】:2010-09-23 18:10:19
【问题描述】:

长期聆听者,第一次来电者。有人知道 Win32API 的良好互操作库吗?

我发现 pinvok.net 没问题。 (FWIW 我按照此处的说明使插件与 MSVS 2010 一起工作: http://www.red-gate.com/supportcenter/GeneralContent.aspx?c=knowledgebase\PInvoke\KB200711000198.htm 并使用 10.0 而不是 9.0)

...来自 MSDN 的 Windows API Code Pack 1.1 似乎没有来自 user32.dll 的基本 Win32 内容,还是我遗漏了什么?

更多细节... 我正在尝试获取一个外部窗口,并使其成为我托管的 System.Windows.Form 中控件的子窗口(在我的主窗体的面板或选项卡中嵌入 GUI)。在这里和谷歌上研究似乎 Win32/user32.dll 是要走的路。我的应用程序是一个启动 3rd 方 GUI(dll 和 exe)的框架。第 3 方代码/表单都是非托管(主要是 MSVC)代码。这些非托管表单是从我的流程层次结构中启动的。如果可能的话,我的偏好是留在 .NET 中。

【问题讨论】:

    标签: c# winapi interop pinvoke


    【解决方案1】:

    可用的最佳互操作库是 .NET Framework。 User32.dll 被 Windows Forms 封装得很好。

    Windows API 代码包专注于封装在 Vista 和 Win7 中添加的 API。这些不是对 user32 的添加,主要是 shell 的东西。

    如果您能具体说明您想使用哪些 user32 API,您可能会得到更好的答案。


    看到编辑后:Win32 SDK 文档明确禁止您尝试做的事情。一个窗口的父级必须属于同一个进程。然而,Windows 中有一些 appcompat hack,旨在支持不存在此限制的 Windows 3.x 程序。因为它不支持线程。

    您可以尝试,但请注意,您会导致保修失效。 P/调用 SetParent()。访问 pinvoke.net 获取您需要的声明。

    【讨论】:

    • Sysinternals procexp.exe 将子窗口的进程显示为我的主进程下的一个节点......这有帮助吗?
    • 它没有。父子进程关系在 Windows 中几乎没有实际优势。唯一的角度是控制台应用程序可以默认继承父控制台。以及由 CreateJobObject 发起的“作业”概念,它允许将进程作为一个组来杀死。在 Vista+ 中彻底搞砸了。顺便说一句,Windows 和 *nix 之间的巨大差异。 Windows 中没有 fork()。
    【解决方案2】:

    大部分 Windows 32 API 在框架本身的 .NET 中公开 - 因此您很少需要 P/Invoke 到 user32.dll。您最好使用框架的托管版本。

    当您确实需要设置 P/Invoke 调用时,pinvoke.net 是调用大多数 Win32 API 所需的特定 API 的绝佳资源。

    【讨论】:

    • Win32 API 的一些包装器的问题在于它们没有很好地暴露出来。 Directory.GetFiles 非常糟糕。为什么当底层 Win32 API 允许流式传输时它返回一个数组?直到版本 4 才修复该问题>
    • @Bear:是的,如果以后编写 API,有几个地方的生活会更好(Directory.GetFiles 早于泛型,所以 IEnumerable 不是一个选项时间...)。但是,我仍然认为,出于各种原因,包括其他人的可维护性、易用性、开发时间等,封装自己的方法而不是使用框架更好,这种情况很少见。
    • @Bear:(并且 Directory.GetFiles() 在 .NET 4 中仍然返回 string[] - 尽管 DirectoryInfo.EnumerateFiles 有效,并且是 .NET 3.5:msdn.microsoft.com/en-us/library/dd413232.aspx
    • @Reed 是的,你说得对,我不是说他们改变了 GetFiles。抱歉,当我说他们已经修复它时,我正在考虑 EnumerateFiles 方法。
    • @Reed。实际上根据您的链接 DirectoryInfo.EnumerateFiles 仅在版本 4 中受支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多