【问题标题】:Can we call Native Windows API from Delphi?我们可以从 Delphi 调用 Native Windows API 吗?
【发布时间】:2013-02-01 23:27:33
【问题描述】:

是否可以从 Delphi 应用程序中调用内核 Native API?像 nt 和 zw 系统调用。

【问题讨论】:

  • 但我们可以在用户模式的 c/c++ 程序中调用 nt 和 zw 系统调用,它们不仅适用于驱动程序
  • 形式上你可以像c/c++一样在Delphi中编写驱动程序,没有语言限制。唯一实际的问题是delphi驱动框架不存在。
  • @Serg 我不确定在 Delphi 中编写驱动程序是否实用。你如何打包代码?驱动程序不是 DLL 或 EXE 文件。
  • re Delphi 驱动程序:stackoverflow.com/questions/2263474/…

标签: windows delphi winapi delphi-7 system-calls


【解决方案1】:

您确实可以从 Delphi 调用本机 API。

Delphi 不附带原生 API 的标头翻译。因此,您需要提供自己的翻译,或使用预先存在的翻译。例如。 NT API 的 JEDI 翻译。

【讨论】:

  • 没错,你需要 Jedi Apilib 的 JwaNative.pas (+1)
【解决方案2】:

正如 David Heffernan 所说,完全可以从用户模式使用 Native API,从而使用 Delphi。您将需要来自Jedi Apilib 的 JwaNative 单元。

下面是使用 Native API 枚举进程的小例子: (TProcessList 是 TObjectList 的后代,但相关部分是对 NtQuerySystemInformation 的调用)

function EnumProcesses: TProcessList;
var
  Current: PSystemProcesses;
  SystemProcesses : PSystemProcesses;
  dwSize: DWORD;
  nts: NTSTATUS;
begin
  Result := TProcessList.Create;

  dwSize := 200000;
  SystemProcesses := AllocMem(dwSize);

  nts := NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
      SystemProcesses, dwSize, @dwSize);

  while nts = STATUS_INFO_LENGTH_MISMATCH do
  begin
    ReAllocMem(SystemProcesses, dwSize);
    nts := NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
      SystemProcesses, dwSize, @dwSize);
  end;

  if nts = STATUS_SUCCESS then
  begin
    Current := SystemProcesses;
    while True do
    begin
      Result.Add(TProcess.Create(Current^));
      if Current^.NextEntryDelta = 0 then
        Break;

      Current := PSYSTEM_PROCESSES(DWORD_PTR(Current) + Current^.NextEntryDelta);
    end;
  end;

  FreeMem(SystemProcesses);
end;

【讨论】:

  • 您是 JwaNative 的作者吗?
  • 题外话:是我,还是真的很难通过网络搜索找到JEDI。每当我尝试时,我总是会发现大量指向看似很多不同网站的链接。有很多不同的项目吗?也许这就是让我感到困惑的地方。
  • @Remko 我确定我可以翻译一些 C 标头。听起来很有趣。我非常想参与的 JEDI 项目是JclExprEval,主要是因为我在使用它并发现了一些错误并提出了一些改进建议。我已经在 J​​EDI 错误跟踪器上报告了它们,但我怀疑代码没有活跃的维护者。我该如何参与?
  • @Tom 你的意思是演示like this one?也许您的 websearch-fu 很弱? ;) ...实际上有很多样本。但这是真的,JEDI 是一团糟。它非常分散,很难找到所需的信息。这在 Borland 时代并不完全好,但至少在当时它不那么碎片化了。同样在 JEDI 中,我们过去看到了很多想法,但很少愿意投入自己的时间和精力。当然我是从大约 15 年前的经验说的,所以它可能不代表今天。
  • @Tom:我知道,这意味着我 5 年没有接触过 Delphi 比 5 年前长。只是认为向您指出示例代码会很好,您或未来的访问者可能会从中受益。
猜你喜欢
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多