加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 在Delphi中获取DLL调用者信息

发布时间:2020-12-14 04:03:21 所属栏目:Windows 来源:网络整理
导读:在Delphi DLL中需要建立调用者 – 可能是一个简单的“.exe”或DBMS运行时模块 – 这意味着它必须获取在该进程中运行的命令. 我知道CmdLine不起作用,可能是ParamStr(0),并且不能使用“主窗口”技术,因为调用者有时候没有窗口.我怀疑 GetModuleHandle是起点,但
在Delphi DLL中需要建立调用者 – 可能是一个简单的“.exe”或DBMS运行时模块 – 这意味着它必须获取在该进程中运行的命令.

我知道CmdLine不起作用,可能是ParamStr(0),并且不能使用“主窗口”技术,因为调用者有时候没有窗口.我怀疑
GetModuleHandle是起点,但需要帮助才能从那里获得命令执行.

解决方法

我创建了一个测试dll:

library Project2;

uses
  System.SysUtils,System.Classes,Vcl.Forms,Vcl.Dialogs,Winapi.Windows;

{$R *.res}

procedure DoStuff; stdcall;
begin
    ShowMessage(
            'ParamStr(0): '+ParamStr(0)+#13#10+
            'GetCommandLine: : '+GetCommandLine);
end;

exports
    DoStuff;
begin
end.

然后从测试应用程序中调用它:

procedure TForm1.Button1Click(Sender: TObject);
var
    module: HMODULE;
    doStuff: procedure; stdcall;
begin
    module := LoadLibrary('D:TempWin32DebugProject2.dll');
    if module = 0 then
        RaiseLastOSError;
    try
        doStuff := GetProcAddress(module,'DoStuff');

        if @doStuff = nil then
            raise Exception.Create('Could not find export "DoStuff"');

        DoStuff;
    finally
        FreeLibrary(module);
    end;
end;

它会看到命令行,使用两者:

> ParamStr(0)
> GetCommandLine

GetCommandLine显然显示整个命令行,而ParamStr(0)(根据定义)只是进程可执行路径.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读