Deine DLL braucht wohl das Handle auf das Windows window um irgendwelche Eigenschaften des Fensters zu aendern. HWND ist der Identifier des Fensters und wird erzeugt wenn der Konstruktor der CWnd -Klasse via create aufgerufen wird. Gespeichert wird in m_hWnd.
Ich wuerde vorschlagen, Du schreibst Deine Konsolenanwendung um in eine dialogfeld basierende Anwendung um. CDialog ist von CWnd abgeleitet und das m_hWnd holst du Dir direkt.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Die DLL holt sich für ihre grafische Oberfläche wohl lediglich das Icon meines Fensters (von dem das HWnd benötigt wird). Ist es möglich, dass ich in meiner (Konsolen~)Anwendung ein unsichtbares Fenster habe, dass der DLL die nötigen Eigenschaften bereitsstellt ?
Wie erstelle ich dann so ein „unabhängiges“ Fenster ?
CFrameWnd *wnd = new CFrameWnd();
wnd->Create(…)
Wie muessen dann die Argumente von Create aussehen ?
Vielen Dank, auch für die erste Antwort,
mfG Lars
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Ich glaube nicht, dass die DLL das Handle nur wegen des Icons benoetigt.
Wozu soll das gut sein? Ich denke eher, dass ueber das handle der CWnd Pointer geholt wird,
um z.B. für einen Dialog den Parent zu bestimmen.
Das mit dem CFrameWnd halte ich für keine gescheite Lösung, aber gut…
Allgemein lautet create folgendermassen:
OK, danke für Deine Antwort, ich glaube, ich muss mal mein Problem umfassender erklären:
Ich moechte einen Twain-Treiber für Java schreiben. Dazu nutze ich JNI (was sonst … ?). Um eine Initialisierung zwischen Anwendung und Twain-Sourcemanager herzustellen, muss die Anwendung dort zu Beginn registriert werden. Dazu fordert die TWAIN-API ein HWnd des AppFensters (NULL endet in Schutzverletzung … schlechte DLL = TWAIN_32.DLL).
Um das HWND von Java-Komponenten zu erhalten, waren bis JDK1.3 zusätzliche Klassen (sun.awt.DrawingSurface, …) vorhanden (deprecated), die jedoch mit dem JDK1.4 ganz verschwanden und in C ausgelagert wurden (/include/jawt.h). Jedoch ist es mir damit nicht möglich, das Handle des JFrames zu bekommen (assertions failure). Alle Beispiele für getHwnd(), die im Netz zu finden sind, beziehen sich lediglich auf java.awt.Canvas (das funktioniert auch). Damit kann aber der Source-Manager nichts anfangen, da er mind. das Icon der Applikation für seine grafische Oberfläche benötigt (Verwendungszweck des Eingescannten).
Also muss ich irgendwoher in meiner JNI-DLL ein Fenster „auftreiben“, das ich an die TWAIN-Methode übergeben kann.
Sorry, tut mir leid.
Wie ich sehe bist Du im Java Forum da besser aufgehoben. Ich habe leider praktisch gesehen so gut wie keine Erfahrungen in Java, die so tief gehen.
ich hab das ganze „hwnd-Abgefrage“ jetzt in einer einzelnen Methode gekapselt, die erstmal über FindWindow(NULL, ); das ganze erfragt. Das funktioniert soweit anständig.
Wenn mir noch was besseres
einfällt, dann kann ich’s ja umändern und werd’s posten.