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



## Thomas Darimont (6. März 2005)

Hallo!

Hier mal ein Beispiel wie man mit SWT WinAPI Funktionen aufrufen kann:
Wir rufen die Funktion LockWorkStation aus der user32.dll auf:

```
/*
 * 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


----------



## maher (6. Mai 2005)

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


----------



## Thomas Darimont (6. Mai 2005)

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


----------



## maher (6. Mai 2005)

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


----------



## Thomas Darimont (9. Mai 2005)

Hallo!

Schau mal hier:
http://www.codeguru.com/Cpp/misc/misc/assemblylanguage/article.php/c3847/
( insbesondere Programm 10)

Gruß Tom


----------



## maher (9. Mai 2005)

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


----------



## maher (9. Mai 2005)

hi
wie kann man c-header unter eclipse 3 erstellen "native-Keyword".
Gruß


----------



## bcosi (10. Mai 2005)

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


----------



## Thomas Darimont (10. Mai 2005)

Hallo!

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

gruß Tom


----------



## Thomas Darimont (10. Mai 2005)

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 

```
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 

```
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


----------

