Announcement

Collapse
No announcement yet.

Nicht Delphi 16-Bit DLL in Delphi 4 dynamisch einbinden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nicht Delphi 16-Bit DLL in Delphi 4 dynamisch einbinden

    Hallo Entwickler,

    kann ich in Delphi 4 eine 16-Bit DLL (mit VB oder VC erstellt) dynamisch einbinden ?
    Mein Versuch mit der API-Funktion LoadLibrary scheiterte. Ich bekam den Fehlercode 31
    zurück (über GetLastError). Was muß ich beachten ?

    MfG

    Bernhard Eggersmann

  • #2
    Hallo,

    ohne speziellen Anpassungen kann eine 32-Bit-Anwendung (Delphi 4-Programm) <b>nicht</b> auf eine 16-Bit-DLL zugreifen. Dies gilt allgemein und hat nichts mit Delphi zu tun. Im Forum sollte zu diesem Problem einiges zu finden sein, wenn nach der Zeichenkette "Thunking" gesucht wird.

    Ausserdem hat Microsoft einige undokumentierte API-Funktionen im KERNEL untergebracht:
    <pre>
    procedure QT_Thunk; external kernel32 index 559;
    function LoadLibrary16; external kernel32 index 35;
    procedure FreeLibrary16; external kernel32 index 36;
    function GetProcAddress16; external kernel32 index 37;
    </pre>
    Das folgende Beispiel demonstriert, wird unter Windows 95 der GDI-Ressoucenverbrauch über die 16-Bit-Funktionen ermittelt werden kann:
    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    var
    aHandle : THandle;
    buffer : array [0..$50] of byte;
    begin
    buffer[0] := 0;
    aHandle := 0;
    ahandle := LoadLibrary16('USER.EXE');
    if ahandle < 32 then
    begin
    Showmessage('LoadLibrary16() fehlgeschlagen!');
    Exit;
    end;
    FreeLibrary16(ahandle);
    @userFunc := GetProcAddress16(ahandle, 'GetFreeSystemResources');
    if @userFunc = nil then
    begin
    Showmessage('GetProcAddress16() fehlgeschlagen!');
    Exit;
    end;
    Caption := Format('%.X',[aHandle]);
    asm
    push GFSR_USERRESOURCES
    mov edx, [userFunc]
    call QT_Thunk
    mov [user_fsr], ax
    push GFSR_GDIRESOURCES
    mov edx, [userFunc]
    call QT_Thunk
    mov [gdi_fsr], ax
    end;
    ShowMessage(Format('User %d GDI %d',[user_fsr,gdi_fsr]));
    end;
    </pre>
    &#10

    Comment

    Working...
    X