WinApi "undefined reference to `keybd_event@10'"

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

das wurgel

Betreff: WinApi "undefined reference to `keybd_event@10'"

BeitragFr, Apr 22, 2011 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will einen Tastendruck simulieren, nutze dafür die WinApi-Befehle. Bei mouse_event funktioniert alles, bei keybd_event sagt er mir "undefined reference to `keybd_event@10'".

Ich verstehe nicht warum. Kennt sich jemand besser aus?

Code: [AUSKLAPPEN]
Const VK_LEFT@=$25 'LEFT ARROW key
Const VK_UP@=$26 'UP ARROW key
Const VK_RIGHT@=$27 'RIGHT ARROW key
Const VK_DOWN@=$28 'DOWN ARROW key

Extern "Win32"
   Function WINAPI_mouse_event(dwFlags:Int,dx:Int,dy:Int,dwData:Int)="mouse_event@20"
   Function WINAPI_keybd_event(bVk:Byte, bScan:Byte, dwFlags:Int)="keybd_event@10"
End Extern

WINAPI_keybd_event(VK_UP, 0, 0)
WINAPI_keybd_event(VK_UP, 0, 2)
1 ist ungefähr 3

Lobby

BeitragFr, Apr 22, 2011 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte wohl damit zusammenhängen, dass die Länge der Parameter bei keybd_event 16 anstatt 10 Byte beträgt. Versuche es demnach einmal so in BlitzMax: [AUSKLAPPEN]
Function WINAPI_keybd_event(bVk:Byte, bScan:Byte, dwFlags:Int)="keybd_event@16" 

Viel Spaß.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

das wurgel

BeitragFr, Apr 22, 2011 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, das funktioniert. Smile

Aber ich versteh nicht wieso das 16 Bytes sind. Zwei Bytes, ein Int und ein ULONG_PTR (was auch immer das ist) müssten doch zusammen 10 Bytes ergeben. Es sein denn ein ULONG_PTR braucht 10 Bytes.

Und nochwas:
Hab herausgefunden, dass es nicht gut ist, Parameter hinten wegzulassen, auch wenn man die Anzahl der Bytes angibt, denn sonst verändern sich Werte im Speicher des Programms, die damit überhaupt nichts zu tun haben.
Am richtigsten ist also das hier:
Code: [AUSKLAPPEN]
Function WINAPI_keybd_event(bVk:Byte, bScan:Byte, dwFlags:Int, dwExtraInfo:Int)="keybd_event@16"
1 ist ungefähr 3

das wurgel

BeitragDo, Sep 15, 2011 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetz sagt er bei dem hier "undefined reference to blablabla"
BlitzMax: [AUSKLAPPEN]
Extern "Win32"
Function RegSetKeyValue(hKey:Int, lpSubKey:Byte Ptr, lpValueName:Byte Ptr, dwType:Int, lpData:Byte Ptr, cbData:Int)="RegSetKeyValueA@24"
End Extern

Rem
LONG WINAPI RegSetKeyValue(
__in HKEY hKey,
__in_opt LPCTSTR lpSubKey,
__in_opt LPCTSTR lpValueName,
__in DWORD dwType,
__in_opt LPCVOID lpData,
__in DWORD cbData
);
End Rem

Weis wieder nicht woran es liegt. Weis jemand, was man da alles beachten muss?
1 ist ungefähr 3

Der Eisvogel

BeitragDo, Sep 15, 2011 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutzt du WinXP? Wenn ja, dann wird das nicht gehen, da es den Befehl erst seit Vista gibt.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

das wurgel

BeitragSa, Sep 17, 2011 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Nope. Ich benutze Win 7.
1 ist ungefähr 3

Lobby

BeitragSa, Sep 17, 2011 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Extern in BlitzMax bezieht sich nicht auf das, was das OS, unter dem kompiliert wird, zur Verfügung stellt. Du könntest nun manuell die aktuelle Advapi32.lib und alles was dazu gehört dort hin kopieren, wo es hin müsste (wahrscheinlich ohne, dass es anschließend funktionieren würde), oder es über folgende Methode, welche zugleich auch das Fehlen unter einer älteren Windows-Version abfangen könnte, versuchen:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import pub.Win32


Global RegSetKeyValue(hKey:Int, lpSubKey:Byte Ptr, lpValueName:Byte Ptr, dwType:Int, lpData:Byte Ptr, cbData:Int) "win32"

Local dllHandle:Int = LoadLibraryA("Advapi32.dll")
If dllHandle Then
RegSetKeyValue = GetProcAddress(dllHandle, "RegSetKeyValueA")
End If

If RegSetKeyValue Then
Print "Found function"
Else
Print "Sorry, there was a problem (dll-handle: " + dllHandle + ")"
End If


Ich weiß nicht, ob das für deine Zwecke bereits genügen würde, aber einen Versuch wäre es sicherlich wert.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Der Eisvogel

BeitragSa, Sep 17, 2011 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
In Anbetracht der Tatsache, dass es sich um "Advapi32.dll" handelt, muss die Library manuel nachgeladen werden, darauf hatte ich nicht geachtet.

Um Die Funktion wie gewohnt mittels Extern einzubinden, musst du am Anfang deines Skriptes folgende Zeile schreiben:
BlitzMax: [AUSKLAPPEN]
Import "-ladvapi32"


Erklärung:
Das "-l" sagt BlitzMax, dass es in das "lib" Verzeichnis im BlitzMax Ordner suchen soll, nach der danach genannten Lib, in diesem Fall "advapi32". Solltest du später einmal erneut auf ein ähnliches Problem stoßen, kannst du es wahrscheinlich ebenfalls über das nachladen der Library lösen, dazu einfach gucken, ob sich die entsprechende Datei im Lib Ordner befindet. Die Datei trägt den Namen "libadvapi.a", für andere Libraries musst du einfach das "advapi" mit dem neuen DLL-Namen ersetzten und schon sollte es klappen sofern sich die Datei im Lib-Verzeichnis befindet.
Sollte eine Lib mal nicht in diesem Ordner sein, kannst du sie entweder im Lib-Verzeichnis von MinGW suchen, oder im Windows 7 SDK finden.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

das wurgel

BeitragSa, Okt 01, 2011 0:18
Antworten mit Zitat
Benutzer-Profile anzeigen
@Lobby
Cool, diese Art und weise war mir bisher gänzlich unbekannt.

@Der Eisvogel
Jetzt versteh ich das endlich. Hatte es vorher nur mit "-advapi32" versucht.


Danke an alle Very Happy
1 ist ungefähr 3

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group