首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Delphi DLL 取得自身路徑而非呼叫端 EXE 路徑的正確方法

     編輯:程式設計疑難解答

問題場景

Delphi 開發 DLL 供 C# 呼叫時,GetCurrentDir 取得的是呼叫端 EXE 所在目錄,而非 DLL 自身目錄。

解決方案:GetModuleFileName API

function GetDLLPath: string;
var
  Buffer: array[0..MAX_PATH] of Char;
  Len: Integer;
begin
  Len := GetModuleFileName(HInstance, Buffer, MAX_PATH);
  SetString(Result, Buffer, Len);
  Result := ExtractFilePath(Result); // 只要目錄部分
end;

關鍵點解析

函數參數回傳說明
GetModuleFileNameHInstance (DLL 模組句柄)完整路徑含檔名HInstance 為 DLL 自身載入基址
GetCurrentDir無目前工作目錄隨呼叫端進程而變
ParamStr(0)無EXE 完整路徑僅適用於 EXE,DLL 中回傳呼叫端 EXE 路徑

C# 呼叫端對應處理

[DllImport("MyDelphi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void GetDLLPath(StringBuilder path, int capacity);

// 使用
var sb = new StringBuilder(260);
GetDLLPath(sb, sb.Capacity);
string dllDir = Path.GetDirectoryName(sb.ToString());

跨平台注意事項

  • Windows:MAX_PATH = 260,長路徑需加 \\?\ 前綴
  • 路徑分隔符:Windows 用 \,跨平台建議用 PathDelim 常數
  • Unicode:Delphi 2009+ 預設 Unicode,C# CharSet.Ansi 需對應 AnsiString
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved