Einzelnen Beitrag anzeigen

Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#11

Re: Wie stelle ich sicher dass ich nichts von VCL verwende

  Alt 31. Okt 2008, 10:08
Zitat von Luckie:
Hat dein Thread ein Fenster und eine Nachrichtenschleife?
Da bin ich jetzt etwas überfragt. Ich habe ein Fenster Handle...

Die Objekt Variable meines Notifyer ist in der DLL global definiert. Das Notifyer Objekt wird in einer "init" Funktion (welche immer als erstes aufgerufen werden muss wenn man andere Funktionen der DLL verwenden möchte) erstellt.

Das Notifyer Objekt reagiert auf die WM:

Delphi-Quellcode:
constructor TNotifyUSB.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FWindowHandle := AllocateHWnd(WndProc);
  USBNotifyRegister;
  ...
end;


function TNotifyUSB.USBNotifyRegister: Integer;
var
  dbi : DEV_BROADCAST_DEVICEINTERFACE;
  Size : Integer;
  r : Pointer;
  ret : Integer;

begin
  ret := DLL_CO_USB_NOTIFY_REGISTER_FAILED;

  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := nil;

  r := RegisterDeviceNotification(FWindowHandle,
                                  @dbi,
                                  DEVICE_NOTIFY_WINDOW_HANDLE);
  if Assigned(r) then ret := 0; // ??? Retwert anpassen

  Result := ret;
end;



procedure TNotifyUSB.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_DEVICECHANGE) then
  begin
    try
      WMDeviceChange(Msg);
    except
      Application.HandleException(Self);
    end;
  end
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
Ich mache nur die DLL. Es kann sein dass eine Funktion der DLL in einem Thread aufgerufen wird, muss aber nicht. Das weiß ich leider nicht.
  Mit Zitat antworten Zitat