创建可在另一种语言上调用的 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语言创建窗口的程序。要最简单的,带注释谢谢。