delphi調用c++的dll中的函數,運行時出現“無法定位程序輸入點”的問題解決+及轉發的其它解決方法


問題: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);
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM