2013-02-17 12 views
6

Czy można wywołać jądro Native API z aplikacji Delphi? Podobnie jak w systemach baz danych nt i zw.Czy możemy wywołać Native Windows API z Delphi?

+0

ale możemy nazwać nt i ZW syscalls w sposób Program usermode c/C++, są one przeznaczone nie tylko dla kierowców. – n1kita

+1

Formalnie możesz napisać sterownik w Delphi tak jak w c/C++, nie ma ograniczeń językowych. Jedyny praktyczny problem polega na tym, że frameworki sterowników delphi nie istnieją. – kludg

+0

@Serg Nie jestem pewien, czy w Delphi jest praktyczne pisanie sterownika. Jak spakujesz kod? Sterowniki nie są plikami DLL ani EXE. –

Odpowiedz

13

Można rzeczywiście zadzwonić do natywnego API z Delphi.

Delphi nie jest dostarczany z tłumaczeniem nagłówków dla natywnego interfejsu API. Musisz więc podać własne lub użyć wcześniejszego tłumaczenia. Na przykład. tłumaczenie JEDI interfejsu API NT.

+6

Dokładnie, potrzebujesz JwaNative.pas od Jedi Apilib (+1) – Remko

9

Jak mówi David Heffernan, możliwe jest użycie Native API ze trybu użytkownika, a tym samym Delphi. Będziesz potrzebował jednostki JwaNative z Jedi Apilib.

Oto mały przykład wyliczyć procesów z wykorzystaniem Native API: (TProcessList jest potomkiem z TObjectList ale odpowiednia część jest wezwanie do 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; 
+0

Czy jesteś autorem JwaNative? –

+0

@DavidHeffernan: Jestem jednym z administratorów projektu Jedi Apilib ... – Remko

+0

Nie na temat: Czy to ja, czy też naprawdę trudno jest znaleźć JEDI za pomocą wyszukiwarki internetowej. Ilekroć próbuję, zawsze znajduję mnóstwo linków do pozornie wielu różnych stron. I czy istnieje wiele różnych projektów? Być może to mnie wprawia w zakłopotanie. –

Powiązane problemy