Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL Funktionen einer Klasse exportieren (https://www.delphipraxis.net/167791-dll-funktionen-einer-klasse-exportieren.html)

Horst0815 18. Apr 2012 16:35

DLL Funktionen einer Klasse exportieren
 
hab eine Klasse in fremder Unit die so aussieht
Delphi-Quellcode:
Type
  TScanHook = Class
  Public
    constructor Create;
    Procedure InstallHook(dwThreadId: DWord);
    Procedure RemoveHook;
  End;
Die soll jetzt in eine DLL exportieren

Delphi-Quellcode:
type
  CScanHook = class(TScanHook)
  public
    Procedure InstallHook; Override;
    Procedure RemoveHook; Override;
  end;


function CreateMWStObj: CScanHook; stdcall;
begin
  Result := CScanHook.Create;
end;

Procedure CScanHook.RemoveHook; Override; stdcall;
.......................



Procedure CScanHook.InstallHook(dwThreadId: DWord); Override; stdcall;
....................

exports
CreateMWStObj resident;
  InstallHook,
  RemoveHook;
begin

end.

was aber zu
Zitat:

[DCC Fehler] HookDLL.dpr(26): E2170 Eine nichtvirtuelle Methode kann nicht überschrieben werden
führt


weiß jemand weiter

Sir Rufo 18. Apr 2012 17:06

AW: DLL Funktionen einer Klasse exportieren
 
Dann mach die Methoden doch virtuell

Delphi-Quellcode:
type
  TFoo = class
    procedure MyMethod; virtual;
  end;

Horst0815 18. Apr 2012 17:23

AW: DLL Funktionen einer Klasse exportieren
 
Manchmal isses auch einfach Danke erstmal was aber zum nächsten Problem Führt

Delphi-Quellcode:
Procedure CScanHook.InstallHook(dwThreadId: DWord); Override; stdcall;
Zitat:

[DCC Fehler] HookDLL.dpr(104): E2070 Unbekannte Direktive: 'override'

DeddyH 18. Apr 2012 17:36

AW: DLL Funktionen einer Klasse exportieren
 
Override hat allein in der Klassendeklaration zu stehen, nicht aber in der Implementation. BTW: DLL und Klassen, wenn das man gut geht.

himitsu 18. Apr 2012 17:37

AW: DLL Funktionen einer Klasse exportieren
 
Das gibt man ja auch nur in der Klassendeklaration an und nicht in der Implementation.

[edit]
Mist, da wollte ich schon die Klassenvervollständigung vorsachlagen
und dann sah ich ein Starter. :wall:

DeddyH 18. Apr 2012 17:38

AW: DLL Funktionen einer Klasse exportieren
 
Da guttenbergt jemand :tongue:

himitsu 18. Apr 2012 17:45

AW: DLL Funktionen einer Klasse exportieren
 
Der rote kistige Gutenbergwarner funktioniert halt nicht. :cry:

Zitat:

BTW: DLL und Klassen, wenn das man gut geht.
Technisch (nur für den Import) ist das möglich, aber abraten kann man davon nur.

Horst0815 18. Apr 2012 18:49

AW: DLL Funktionen einer Klasse exportieren
 
Ist ne C Project wo ich mir was Borgen will was mich zumnächsten Problem Führt

Code:
LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
//   AfxMessageBox("12345");
      if(g_hHook == NULL)
      {   // Read the data from the shared resources
         DWORD dwData = 0, dwSize = sizeof(DWORD);
         g_obIPC.Lock();
         g_obIPC.OpenIPCMMF();
         g_obIPC.ReadIPCMMF((LPBYTE)&dwData, dwSize);
         g_obIPC.Unlock();
         g_hHook = (HHOOK)dwData;
      }


   if(code>=0)
   {
      //if(wParam==WM_SCANPWD)
      {
           CString strTemp;
         strTemp="catch the Windows Message\n";

            
         MSG *msg=(MSG *)lParam;
         HWND hWnd, hWndPwdDlg;
         hWnd=(HWND)msg->wParam ;
         hWndPwdDlg=(HWND)msg->lParam;

         //MessageBox(hWndPwdDlg,strTemp,"tip",MB_OK);
         char szBuffer[100];
         SendMessage(hWnd,WM_GETTEXT,sizeof(szBuffer),(LPARAM)szBuffer);
         //MessageBox(hWndPwdDlg,"asdf","dafasdf",MB_OK);
           COPYDATASTRUCT cds;
         cds.cbData=sizeof(cds);
         cds.dwData=(DWORD)hWnd;
         cds.lpData =szBuffer;
         SendMessage(hWndPwdDlg, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
         //MessageBox(hWndPwdDlg,"asdf","dafasdf",MB_OK);
         //TRACE("aljflajfl;ajkfla\n");
      
      }
         
   }
   return CallNextHookEx(g_hHook,code,wParam,lParam);
}
übersetzt zu

Delphi-Quellcode:
function GetMsgProc(code: integer; ewParam: WPARAM; elParam: LPARAM): LResult;
// hook code//removal flag//address of structure with message
var
  dwData, dwSize: DWord;
  strTemp: String;
  chWnd, hWndPwdDlg: HWND;
  msg: Windows.TMsg;
  szBuffer: Array [0 .. 99] of AnsiChar;
  cds: COPYDATASTRUCT;
Begin
  // AfxMessageBox("12345");
  if g_hHook = 0 then
  begin // Read the data from the shared resources
    dwData := 0;
    dwSize := sizeof(DWord);
    LockIPCMMF;
    OpenIPCMMF;
    ReadIPCMMF(@dwData, dwSize);
    UnLockIPCMMF;
    g_hHook := dwData;
  end;
  if code >= 0 then
  begin
    if ewParam = WM_SCANPWD then
    begin
      strTemp := 'catch the Windows Message';
      msg.message := elParam;
      chWnd := Windows.PMsg(ewParam)^.message;
      hWndPwdDlg := Windows.PMsg(elParam)^.message;
      MessageBox(hWndPwdDlg, PWideChar(strTemp), 'tip', MB_OK);
      SendMessage(chWnd, WM_GETTEXT, sizeof(szBuffer), LPARAM(@szBuffer));
      // MessageBox(hWndPwdDlg,'asdf','dafasdf',MB_OK);
      cds.cbData := sizeof(cds);
      cds.dwData := chWnd;
      cds.lpData := @szBuffer;
      SendMessage(hWndPwdDlg, WM_COPYDATA, WPARAM(chWnd), LPARAM(@cds));
      // MessageBox(hWndPwdDlg,'asdf','dafasdf',MB_OK);
    end;
  end;
  Result := CallNextHookEx(g_hHook, code, ewParam, elParam);
end;
wird aufgerufen mit

Code:
g_hHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hInstance,dwThreadId);
was ich zu
Delphi-Quellcode:
g_hHook :=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hInstance,dwThreadId);
übersetzt hab

wobei er natürlich bei GetMsgProc meckert

himitsu 18. Apr 2012 18:57

AW: DLL Funktionen einer Klasse exportieren
 
Zitat:

wobei er natürlich bei GetMsgProc meckert
Keine Ahnung.
Währe ja zu praktisch, wenn man uns die Fehlermeldung verraten würde. :roll:
PS: Strg+C funktioniert an sehr vielen Stellen.


Die Aufrufkonvention?
stdcall

Horst0815 18. Apr 2012 19:03

AW: DLL Funktionen einer Klasse exportieren
 
Ja das wars danke, nun hör ich auf für heute


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz