Python 防止Ada-DLL中的名称损坏
在创建ADADDLL时,有没有一种简单的方法可以防止Ada名称被损坏 这是我的.adb代码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
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);
(但是链接名称将以小写形式显示,因此需要更改Pythongetattr()
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_调用”)代码>。这是非常令人困惑的;正如我在那里承认的那样。(我经常把这两个混淆在一起,不得不重新参考文档[或我现在正在工作的源代码],但我知道一个是“损坏的名称”,另一个是“基本名称”。)我不得不使用外部名称,因为这是基本名称,他需要使用链接,因为这是损坏的名称。