问题标签 [pinvoke]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
106070 浏览

c# - 在 c# 代码中使用在 c++ dll 中定义的类

我有一个用 c++ 编写的 dll,我需要在我的 c# 代码中使用这个 dll。搜索后我发现使用 P/Invoke 可以让我访问我需要的函数,但是这些函数是在一个类中定义的,并且使用非静态私有成员变量。所以我需要能够创建这个类的一个实例来正确使用这些函数。如何获得对此类的访问权限以便创建实例?我一直无法找到一种方法来做到这一点。

我想我应该注意 c++ dll 不是我的代码。

0 投票
4 回答
11842 浏览

c# - 如何解决 .NET CF 异常“找不到 PInvoke DLL”?

这是给所有 C# 大师的。我已经为此苦苦挣扎了一段时间,在网上尝试了各种建议,但无济于事。该操作发生在 Windows Mobile 5.0 中。

我有一个名为 MyDll.dll 的 DLL。在 MyDll.h 我有:

MyDll.cpp中MyDllFunction的定义是:

C# 类包含以下声明:

在同一个类中,我通过以下方式调用 MyDllFunction:

这就是该死的东西不断给我“找不到 PInvoke DLL 'MyDll.dll'”的地方。我已经验证我实际上可以在系统调用上执行 PInvoke,例如“GetAsyncKeyState(1)”,声明为:

MyDll.dll 与可执行文件位于同一文件夹中,我也尝试将其放入 /Windows 文件夹中,没有任何更改也没有成功。非常感谢任何建议或解决方案。

0 投票
1 回答
1575 浏览

c# - 将 IHTMLDocument2.Script.InvokeMember() 返回的 COM 对象转换为有用的东西

我正在为 Internet Explorer 扩展使用 C#.NET 中的一些代码,该扩展在浏览器中调用 Javascript 并从 Javascript 调用中获取返回值。当 Javascript 返回一个原始类型或原始类型数组时,我得到了一些我可以处理的东西,但是当 Javascript 返回一个对象时,我得到一个不透明的 COM 对象。

如何获取 COM 对象的内容,或者有更好的方法从 C#.NET 调用 IE?

0 投票
7 回答
79782 浏览

wpf - 如何从可调整大小的窗口中删除最小化和最大化按钮?

WPF 不提供具有允许调整大小但没有最大化或最小化按钮的窗口的能力。我希望能够制作这样一个窗口,这样我就可以拥有可调整大小的对话框。

我知道解决方案将意味着使用 pinvoke,但我不确定该调用什么以及如何调用。搜索 pinvoke.net 并没有发现任何我需要的东西,主要是因为 Windows Forms 确实在其窗口上提供了CanMinimizeandCanMaximize属性。

有人可以指点我或提供有关如何执行此操作的代码(首选 C#)吗?

0 投票
2 回答
4714 浏览

c# - 如何从 HBITMAP 转换为 .NET 的 Bitmap 类?

我正在使用一些使用该CreateDIBSection函数创建位图并返回HBITMAP句柄的 C++ 代码。将此信息导入我的 .NET 程序集的最佳方法是什么?

0 投票
1 回答
1798 浏览

.net - 在 .NET CF 2.0 中,全局键盘挂钩是否会干扰需要按键的 P/Invokes?

我的详细信息:运行 Windows CE 4.2、Compact Framework 2.0 SP1 的定制移动设备。到目前为止,C# 应用程序充分利用了 P/Invokes,没有任何问题。

我写了一个低级键盘钩子(类似于,但不完全相同,这个 CodeProject 帖子),它的工作非常好,但有一个例外。我们的软件所做的一件事是允许访问 Windows CE 的屏幕校准功能。这是您需要点击一系列目标的屏幕,最后按 Esc 取消或 Enter 接受。我们通过 P/Invoke调用这个功能,我认为这个 Win32 API 函数内部发生的按键被我的键盘钩子干扰了。

我的键盘钩子没有做任何密集的事情,也没有改变执行流程,但我认为两者的使用可能从根本上不兼容。当我在运行此屏幕后退出调试器时,当程序关闭时,所有的 Enter 键按下我都尝试一次全部“击中”(此设备会发出咔哒声)。这让我认为钩子没有正确地将按键传递给 Win32 API 函数,就像它正确传递给 .NET 应用程序一样。有什么想法吗?

您是否认为:
a)键盘钩子和需要键盘的 P/Invokes 不兼容,或者
b)我的键盘钩子实现是罪魁祸首,或者
c)它是否完全取决于硬件制造商、驱动程序等?

谢谢你的帮助!

0 投票
3 回答
4147 浏览

c# - 如何使用 DMProcessConfigXML 来配置我的 Windows Mobile 设备?

我想创建一个 C# 程序来配置 Windows Mobile 设备。我在一个名为DMProcessConfigXML的函数上找到了 MSDN 文档,但没有关于如何使用该函数的说明。

如何在我的 Windows Mobile 应用程序中使用此功能?我怀疑这与使用 pinvoke 有关。

谢谢,
保罗

0 投票
5 回答
1881 浏览

.net - .NET WinForms:如何使用需要窗口句柄的 API 调用?

精简版

当我无法保证窗口句柄将保持有效时,如何使用 API 调用?

我可以保证我持有对我的表单的引用(因此不会处理该表单)。这并不能保证表单的句柄将一直保持有效。

即使没有处理表单,表单的窗口句柄如何变得无效

因为窗体的底层 Windows 窗口被破坏并重新创建。

长版

我想 P/Invoke 一个需要 hwnd(窗口句柄)的 API。需要 hWnd 的 API 调用的一些示例是:

IVMRWindowlessControl::SetVideoClippingWindow

发信息

设置剪贴板查看器

设置定时器

IProgressDialog::StartProgressDialog

Shell_NotifyIcon

动画窗口

注意:其中一些 API 调用具有托管等效项,有些则没有 - 但这一事实与我的问题无关。

解释

我可以调用其中一个需要长期窗口句柄的 API 函数,例如:

有人建议上述对 SendMessage 的调用是危险的,因为对窗口句柄的非托管使用。他们建议您将 hwnd 包装在 HandleRef 对象中:

这样:窗口句柄在调用 SendMessage 期间保证保持有效。但它并不总是这样。以下 API 调用需要长期访问窗口句柄:

即使我将句柄包装在 HandleRef 中,表单的窗口句柄仍有可能(在子序列秒、分钟、小时、天、周、月或年)变得无效。当窗体的底层 Windows 窗口被销毁并创建一个新窗口时,就会发生这种情况。尽管事实上我在 HandleRef 中保护了表单的句柄。

我可以说出表单句柄无效的一种方式:

重新创建窗体的窗口,旧的 hwnd 现在无效。

那么问题来了:如何使用需要窗口句柄的 API 调用?

不能做吗?

我期待答案:你不能这样做。只要您需要保留句柄,就无法保护表单的句柄以确保其有效。

这意味着我需要知道句柄何时被销毁,所以我可以告诉 Windows 放手,例如:

然后在创建新句柄时被告知:

除了不存在这样的祖先方法。

替代问题:是否有我可以覆盖的方法,以便我知道窗口的句柄何时即将被销毁,以及它何时刚刚被创建?

不得不打破重新创建句柄的 .NET WinForms 封装是丑陋的,但这是唯一的方法吗?


更新一

处理表单的Close / OnClose事件是不够的,同样如此

  • 处理 IDisposable
  • GC 固定表单

因为我可以在不关闭或处置表单的情况下使表单的底层窗口句柄无效。例如:

注意:销毁了 Windows 窗口句柄,而不是处置它。.NET 中的对象是被处理掉的东西;如果它是一个 Form 对象,则很可能涉及破坏Windows 窗口句柄。

Windows 是 Microsoft 的产品。

窗口是一个带有消息循环的东西,有时可以在屏幕上显示东西。


更新二

me.yahoo.com/a/BrYwg有一个很好的建议,即使用NativeWindow对象充当需要用于侦听消息的 hWnd 的项目的侦听器。这可以用来解决一些问题,例如:

  • 设置剪贴板查看器
  • 设置定时器
  • IProgressDialgo::StartProgressDialog
  • Shell_NotifyIcon

但不适用于

  • 动画窗口
  • 发信息
  • IVMRWindowlessControl::SetVideoClippingWindow
0 投票
3 回答
1440 浏览

c# - 我可以在 .NET 程序集中嵌入一个 win32 DLL,并使用 P/Invoke 对其进行调用吗?

我正在为第三方本机库编写 C# 包装器,我们将其作为 DLL。我希望能够为新程序集分发一个 DLL。我是否可以将 win32 DLL 嵌入到我的 .NET DLL 中,并且仍然使用 P/Invoke 对其进行调用?如果是这样,怎么做?

0 投票
2 回答
489 浏览

windows - P/Invoke 以纠正 Win32 DLL 的版本?

我有一些调用 DBGHELP.DLL 的 P/Invoke 代码。稍后我会将签名添加到 pinvoke.net。

Windows 2003 附带的 DBGHELP.DLL 版本太旧,我的代码需要“Windows 调试工具”版本 6.9 附带的 DBGHELP.DLL 版本。

如何执行以下操作之一?

  • 确保 DllImport 需要最低版本。
  • 找出将加载哪个 DLL,然后获取其版本号。我需要使用 FileVersionInfo,但是如何找出 P/Invoke 将使用的搜索顺序?

也就是说:是否有人拥有使用 FileVersionInfo 来检查最低版本信息的健壮代码?