問題:delphi找不到dll中的函數,出現“無法定位程序輸入點”的問題,如下圖所示。
分析:這是因為dll庫開放的函數名和代碼中的函數名不一致導致的,比如Platform_Init的函數名生成dll后變為_Platform_Init@0之類的問題,查看dll接口名可用dependency工具。
因為我是做delphi調用廠家提供的Dll,不能改dll,所以我的解決辦法是將我的delphi程序中函數的聲明部分改為和dependency工具中函數名一致
====================================================以下是轉發的原文。==========================
轉自https://www.cnblogs.com/ycloneal/p/5715537.html
轉:Delphi無法正確動態調用C++ dll庫的幾個原因
本文說明delphi調用C++DLL庫的幾個問題,並給出解決方法。
問題一:delphi找不到dll中的函數,出現“無法定位程序輸入點”的問題,
分析:這是因為dll庫開放的函數名和代碼中的函數名不一致導致的,比如myfunc的函數名生成dll后變為_myfunc@12之類的問題,查看dll接口名可用dependency工具。
解決方法:①使用傳統的模塊定義文件 (.def);
②使用extern "C"注明接口函數;
③使用stdcall注明接口函數
詳見: http://www.cnblogs.com/fishseewater/archive/2010/10/05/1844292.html
問題二:依賴DLL庫找不到,比如vcruntime140.dll或vcruntime140.dll
原因:使用VS生成DLL庫,如果未使用release生成dll,且采用MD的方式會依賴VS自身的DLL,導致第三方使用出問題。
解決方法:①將生成方式由Debug改為release;
②生成dll的項目設置由MD改為MT。
詳見:https://msdn.microsoft.com/zh-cn/library/2kzt1wy3.aspx
問題三:delphi調用函數時參數傳入有誤,比如傳如字符串在DLL中與delphi不同
分析:這和函數參數的入棧方式有關,跨語言最好采用stdcall
解決方法:①將dll接口函數設置為stdcall;
②DELPHI調用函數聲明時也要注明stdcall,如下
myfunc: Function(cs:pchar):integer;Stdcall;
問題四:delphi的函數指針在dll中調用出錯
分析:原因不明,筆者經歷中,如以下代碼,setCallback函數聲明為
setCallback: Function(backfunc: PbackFunc):Pointer;
則DLL中無法正常調用回調,如果將setCallback函數聲明改為
setCallback: PbackFunc;
則DLL中可以正常調用。
type PbackFunc = procedure(message1:pchar); Stdcall; procedure handle_message(const pardata:pAnsiChar);stdcall; begin showmessage(pardata); Sleep(1000); exit; end; //setCallback: Function(backfunc: PbackFunc):Pointer; setCallback: PbackFunc; setCallback(@handle_message);