创建可在另一种语言上调用的 win32api(dll) [关闭]

Posted

技术标签:

【中文标题】创建可在另一种语言上调用的 win32api(dll) [关闭]【英文标题】:Creating win32api(dll) that will be callable on another language [closed] 【发布时间】:2013-07-06 22:45:15 【问题描述】:

如何创建可在另一种语言上调用的 win32api(dll)?示例:

当我使用 ruby​​ 时,我应该使用用 C# 或 C++ 编写的 dll。那么如何创建这样的动态库呢?

【问题讨论】:

Windows 上的大多数语言运行时都支持 C api 或 COM 自动化接口。 Ruby 通过它的 ffi 互操作层也不例外,选择你的毒药。 基本上,您制作的任何 DLL 都应该可以从 ruby​​ 调用,所以只需制作一个。 【参考方案1】:

C++ 和 C# Dll 之间存在重要区别。

C++ 允许您公开可以从 ruby​​ 调用的全局函数(使用 __declspec(dllexport)。

C# Dll 包含一个清单,可用于查找所有类型并使用所述 Dll 中的整个对象模型。

我从未尝试过使用 ruby​​ 的后者(即所有类型和类层次结构),但是,如果可能的话,这将是一种只能调用导出函数的首选方法。 IronRuby 显然在导入 .NET 类型时没有问题。

要创建 C++ 库,请选择 Visual C++ Win32 项目,然后在随后出现的对话框中按 Next 以选中 DLL 复选框。否则选择 Visual C# 类库项目。

【讨论】:

那么不可能从 ruby​​ 调用 c# 函数?我试图调用 c# 编译库,但在 ruby​​ 上出现类似“getprocaddress”的错误。 不一定。但请记住,在 C# 中没有像 C++ 中那样的全局函数。函数始终是类/对象的成员。如果函数是静态的,您可以在不先实例化对象实例的情况下调用它。 另外,您不会在 C# 函数上使用 GetProcAddress。这仅适用于不是任何类成员或静态类成员的 C++(实际上是 C)全局函数。 我在 c# 库中的函数不是静态的。所以我们可以说这是问题,对吧? 是的,这是一个开始。但是,在 ruby​​ 中,您应该有一种方法可以从 C# 库中“导入”类层次结构。那可能不会使用 GetProcAddress。【参考方案2】:

你有两种方法。

    如果您的 DLL 是使用本地语言实现的,例如 C/C++。您可以从 DLL 中导出 C 函数并以其他语言调用它。大多数语言都可以直接调用 C 函数,也可以使用语言扩展,例如 Ruby 中的 Win32API。 使用 COM(组件对象模型)。 COM 旨在跨语言工作。这是首选方法,因为它有很多优点。您可以使用 C#、C++、Delphi 和其他语言实现 COM 类,并在其他语言中使用它,如该语言中的普通对象。

【讨论】:

以上是关于创建可在另一种语言上调用的 win32api(dll) [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

求写一个win32api的c语言创建窗口的程序。要最简单的,带注释谢谢。

win32 api是啥

Win32 多线程编程

widnows 使用WIN32 APi 实现修改另一打开程序的窗口显示方式

怎样用python调用vc++编出来的win32 DLL

windows 创建快捷方式 win32API C语言