Python 防止Ada-DLL中的名称损坏

Python 防止Ada-DLL中的名称损坏,python,dll,ada,name-mangling,Python,Dll,Ada,Name Mangling,在创建ADADDLL时,有没有一种简单的方法可以防止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 beg

在创建ADADDLL时,有没有一种简单的方法可以防止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;
我的.广告

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'添加到函数名的末尾,但当我将相同的代码移动到不同的编译器时,这种情况似乎有所改变。这给我带来了一些问题。我需要一个标准的损坏格式或一种方法来删除所有的损坏一起

(第77节)约定
DLL
StdCall
的同义词,据我所知,这会导致您报告的那种名称混乱

使用约定
C
,您可能会做得更好:

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

pragma Export (C, Print_Call);
(但是链接名称将以小写形式显示,因此需要更改Python
getattr()
call)


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

您可以通过pragma的Link\u name和External\u 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的接口术语:

本主题包含一个小讨论,揭示了两者的区别:

“另一种编译器”-您尝试过哪些编译器?我认为Google线程的主旨是您(Shark8)需要使用外部名称方面。看起来Python使用的是Link_名称;所以Jon可以编写
pragma导出(DLL,Print_调用,Linker_Name=>“Print_调用”)。这是非常令人困惑的;正如我在那里承认的那样。(我经常把这两个混淆在一起,不得不重新参考文档[或我现在正在工作的源代码],但我知道一个是“损坏的名称”,另一个是“基本名称”。)我不得不使用外部名称,因为这是基本名称,他需要使用链接,因为这是损坏的名称。