• Delphi的TService 服务路径获取 Dll中获取文件路径


    研究delphi服务的路径,试了好几个方法 ,都没取出来,最后发现,要采用取DLL路径的方法


    //一、获取Dll自身路径

    //1)方法一:

    Function GetDllPath(sDllName:string):string;

    var
    ModuleFileName:array[0..255] of char;

    begin
    //{取得dll的实际位置}
    GetModuleFileName(GetModuleHandle(sDllName), @ModuleFileName[0], SizeOf(ModuleFileName));
    Result := ModuleFileName;
    end;

    //2)方法二:

    Function GetDllPath:string;

    var
    ModuleName:string;
    begin
    SetLength(ModuleName, 255);
    //取得Dll自身路径
    GetModuleFileName(HInstance, PChar(ModuleName), Length(ModuleName));
    Result := PChar(ModuleName);

    end;


    // 二、获取调用程序路径

    Function GetExecutPath:string;

    var
    ModuleName:string;
    begin
    SetLength(ModuleName, 255);
    //取得调用Dll程序的路径
    GetModuleFileName(GetModuleHandle(nil), PChar(ModuleName), Length(ModuleName));
    Result := PChar(ModuleName);

    end;

    点击打开链接

    Delphi遍历进程并获取进程路径

    获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName

    功能模块改良版:

    unit UntModulePath;

    interface

    uses
    Windows, SysUtils, PsAPI;

    //获取EXE、Dll模块名称 或 路径
    function GetModuleFileNameDef(GetPath: Boolean = True): string;

    function GetWindowProcHandle(Wnd: HWND; GetPath: Boolean = True): string;

    var
    DllPath: string;

    implementation

    function GetModuleFileNameDef(GetPath: Boolean = True): string;
    var
    ModuleName: array [0..MAX_PATH - 1]of Char;
    begin
    FillChar(ModuleName, Length(ModuleName), 0);
    //取得Dll自身路径
    GetModuleFileName(HInstance, ModuleName, Length(ModuleName));

    if GetPath then
    Result := ExtractFilePath(StrPas(ModuleName))
    else
    Result := StrPas(ModuleName);
    end;


    function GetWindowProcHandle(Wnd: HWND; GetPath: Boolean = True): string;
    var
    pID: Cardinal;
    hProc: THandle;
    ModuleName: array [0..MAX_PATH - 1]of Char;
    begin
    Result := '';
    if Wnd= 0 then
    Exit;

    FillChar(ModuleName, Length(ModuleName), 0);

    GetWindowThreadProcessId(Wnd, pID);
    hProc:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pID);
    if hProc= 0 then
    Exit;
    try
    GetModuleFileNameEx(hProc, 0, ModuleName, Length(ModuleName));
    finally
    CloseHandle(hProc);
    end;
    if GetPath then
    Result := ExtractFilePath(StrPas(ModuleName))
    else
    Result := StrPas(ModuleName);
    end;

    initialization
    DllPath:= GetModuleFileNameDef;

    end.
     
     

  • 相关阅读:
    mixin混合
    python类内部调用自己的成员函数必须加self
    合并/取消合并单元格
    pandas 显示所有的行和列
    pandas 利用openpyxl设置表格样式
    Nowcoder9983G.糖果(并查集)
    Nowcoder9983F.匹配串(思维)
    Nowcoder9983E.买礼物(链表+线段树)
    Nowcoder9983C.重力追击(暴力+少用sqrt)
    Nowcoder9983B.内卷(双指针)
  • 原文地址:https://www.cnblogs.com/zhqian/p/9994619.html
Copyright © 2020-2023  润新知