Mit SWT Win API Funktionen / Funktionen aus beliebigen DLLs aufrufen.

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Hier mal ein Beispiel wie man mit SWT WinAPI Funktionen aufrufen kann:
Wir rufen die Funktion LockWorkStation aus der user32.dll auf:
Code:
/*
 * Created on 06.03.2005@20:15:07
 *
 * TODO Some Licence info...
 */
package de.tutorials;

import org.eclipse.swt.internal.win32.DLLVERSIONINFO;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;

/**
 * @author Administrator
 * 
 * TODO Explain me
 */
public class SWTLockWorkstationExample {

    public static void main(String[] args) {

        DLLVERSIONINFO dvi = new DLLVERSIONINFO();
        dvi.cbSize = DLLVERSIONINFO.sizeof;
        dvi.dwMajorVersion = 4;
        dvi.dwMinorVersion = 0;

        TCHAR lpLibFileName = new TCHAR(0, "user32.dll", true);
        int hModule = OS.LoadLibrary(lpLibFileName);

        if (hModule != 0) {
            String name = "LockWorkStation\0";
            byte[] lpProcName = name.getBytes();

            int LockWorkStation = OS.GetProcAddress(hModule, lpProcName);
            OS.Call(LockWorkStation, dvi);
            OS.FreeLibrary(hModule);
        }
    }
}

//Edit: noch besser funktioniert das mit JNA:
https://jna.dev.java.net/

Gruß Tom
 
hi, habe ein problem und zwar ich bin neu mit java programmieren und wollt swt-dll
importieren aber ich das beispiel eben gesehen und diese eclipse hatte org.eclispe nicht erkannt.

grüße
 
Hallo!

Annahme du arbeitest unter Eclipse...
Du musst dazu auch das SWT.jar (findest du unter eclipse\plugins\org.eclipse.swt.win32_3.XXXws\win32) in den BuildPath aufnehmen.
-> Rechte Maustaste auf das Projekt -> Kontext menü -> Properties -> java Buld Path -> Add Variable -> Eclipse Home -> extend -> plugins\org.eclipse.swt.win32_3.XXXws\win32\swt.jar

Damit das ganze läuft musst du nicht die entsprechende swt-xxx.dll (findest du unter
eclipse\plugins\org.eclipse.swt.win32_3.0.2\os\win32\x86...) ins winnt\system32 Verzeichnis kopieren. (Oder mit dem netten SWT App Launcher unter Eclipse 3.1) arbeiten.

Gruß Tom
 
Hi Tom!
ich bedanke mich herzlich bei dir für die schnelle Antwort, habe ich gemacht und läuft wunderbar.
Du hast so ein beispiel im netz erstellt "Von API-Functions" benutzen und ist sehr schön zu sehen wie die APIs unter java benutzt werde.
ich habe lange zeit mit diesen APIs "win32" gearbeitet und es war unter visual c++ für die uni. und jetzt brauche ich auch so ähnlich zu programmieren aber unter java und mit dieser
swt-dll kann mann so was auch tun aber die Funktionen heißen hier anders und ausserdem habe ich keine hilfe für swt-dll gefunden, um zu sehen, was jede dieser Funktionen macht.

was ich eigentlich brauch kann man vielleicht aufzählen:
- CPU-eigenschaften auslesen (Type, schnelligkeit, Archithektur, Auslastung und so weiter)
- Arbeitsspeicher (Größe und die Auslastung "wie voll sie sind")
- Benutzer name
- Was aus dem Registry aus lesen
- Welches Betriebssystem hat der Rechnere (windows "95-98-2000-Nt-XP", linux, unix oder solaris)

ich brauch so was für die Uni und ich stehe jetzt einfach so ohne weiteres.
Es wäre nett wenn du weiter helfen würdest.

vielen dank im voraus, Maher
 
Hi Tom!
Danke noch mal. habe eben deine Mail gesehen und habe so einbisschen reingeschaut.
und wollte fragen, "kann man nicht solche API-Funktionen nicht direkt mit Java aufrufen, ohne
C++, oder Assembly zu benutzen". ich meine alles mit java zu programmieren ohne andere Sprache zu benutzen.

Grüße
 
Hallo Tom,

dein SWT-Beispiel funktioniert wunderbar. Wie sieht es aber aus, wenn die Windows API Parameter hat? Wie würde zB ein SWT-Aufruf von ExitWindowsEx aussehen? Diese API besitzt zwei Parameter.

Gruss bcosi
 
Hallo!

Soweit ich weis gabs damit Probleme bzw. hab ich's "damals" nicht hinbekommen... schaue heute Abend nochmal nach...

gruß Tom
 
Hallo!

ich hab da jetzt mal wieder ein wenig herumprobiert und bin leider immernoch nicht viel weiter als damals. Mittels OS.loadLibrary kann man anlog zu C++ Dlls dynamisch laden und dann per OS.GetProcAddress ein Handle auf die aus der dll gewünschte Funktion bekommen. Leider wid's jetzt extrem kompliziert... (zumindest für mich)...
da man mit der Methode
Code:
public static final native int Call (int address, DLLVERSIONINFO arg0);
wie man sieht außer der Adresse der Funktion (die man über GetProcAddress bekommen hat) und der DLLversion keine weiteren Paremeter übergeben kann.
So scheint es zumindest. Jedoch wäre es möglich auf den Parameter Stack der im Speicher liegenden Funktion zuzugreifen und dort entsprechende Werte (vor!) dem Parameteraufruf zu hinterlegen. Dazu gibts ind er Klasse OS auch
so schöne Methoden wie
Code:
public static final native void MoveMemory (int [] Destination, int Source, int Length); ;-)
etc.... es sieht so aus, als ob dieses Konstrukt innerhalb der win32 internal packages des SWT Jars recht häufig verwendet wird. Vielleicht findet man dort irgendwo ein Beispiel...(hab leider auf meiner Suche keins gefunden)
Leider bin ich da derweil mit meinem Latein am Ende... ich weis noch, dass man die Parameter in umgekehrter Reihenfolge (letzter Paremeter zuerst, erster zuletzt) auf den Parameter Stack legen muss aber das will irgendwie nicht so wirklich funktionieren. Habe dazu auch einige C++ Bespiele gesehen, diese verwenden jedoch zur Manipulation des Parameterstacks dieser Funktion Assembler... http://www.codeguru.com/Cpp/W-P/dll/article.php/c115/

aber vielleicht bekomme ich das ja die Tage doch noch hin, also

stay tuned :)

Gruß Tom
 
Zurück