3

在创建 Ada DLL 时,是否有一种简单的方法可以防止 Ada 名称被破坏?

这是我的 .adb 代码

with Ada.Text_IO;
package body testDLL is
   procedure Print_Call is
   begin
      Ada.Text_IO.Put_Line("Hello World");
   end Print_Call;

   function Add_Nums(A,B : in Integer) return Integer is
   begin
      return A + B;
   end Add_Nums;

end testDLL;

我的 .ads

package testDLL is
   procedure Print_Call;
   pragma export (dll, Print_Call, "Print_Call");

   function Add_Nums(A,B : in Integer) return Integer;
   pragma export (dll, Add_Nums, "Add_Nums");
end testDLL;

我的蟒蛇

import ctypes

TestDLL = ctypes.WinDLL ("libTestDLL.dll")
Print_Call = getattr(TestDLL, "Print_Call@0")
Print_Call()

您可以看到我必须在函数名称的末尾添加“@0”,但是当我将相同的代码移动到不同的编译器时,这似乎发生了变化。这给我带来了一些问题。我需要一个标准的修改格式或一种方法来一起删除修改。

4

2 回答 2

5

您可以通过编译指示的 Link_Name 和 External_Name 参数控制对象名称,如下所示:

pragma Export (C, Print_Call, "Print_Call", "Print_Call");

或者,如果您使用的是 Ada2012,您可以使用方面来指定这些:

function Add_Nums(A,B : in Integer) return Integer
    with Export, Convention => Ada, Link_Name => "Add_Nums";

以下涵盖了 Ada 的接口编译指示:http: //www.ada-auth.org/standards/12rm/html/RM-J-15-5.html

该线程涵盖了一些讨论,揭示了两者的差异: https ://groups.google.com/forum/?fromgroups=#!searchin/comp.lang.ada/opengl/comp.lang.ada/6IVlMbtvrrU/mv3UUiDg5RwJ

于 2012-11-07T18:51:08.587 回答
3

显然(第 77 节)该约定DLL是 的同义词StdCall,据我了解,这会导致您报告的名称混乱。

你可以用约定做得更好C

pragma Export (C, Print_Call, "Print_Call");

甚至

pragma Export (C, Print_Call);

(但链接名称将小写,因此您需要更改 Pythongetattr()调用)。

我假设调用序列处理堆栈/参数的方式没有区别。

于 2012-11-07T16:09:01.513 回答