Parameter mit argv übergeben in C-Programm
Hallo, ich mochte einen Parameter an eine Variable übergeben:
Wenn ich
printf(argv[1]);
aufrufe funktioniert es, wenn ich aber
ip.ki.wVk = argv[1];
in die Variable schreiben will geht es nicht?
Fehlermeldung:
assignment makes integer from pointer without a cast [enabled by default]
der parameter argv[1] soll 0x41 übergeben, also programmname.exe 0x41
Ich bin leider kein C-Programmierer und steig da nicht durch.., aber 0x41 ist doch kein integer
int main(int argc, char* argv)
{
INPUT ip;
printf(argv[1]);
// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Press the "A" key
ip.ki.wVk = argv[1]; // virtual-key code for the "a" key 0x41
Wenn ich
printf(argv[1]);
aufrufe funktioniert es, wenn ich aber
ip.ki.wVk = argv[1];
in die Variable schreiben will geht es nicht?
Fehlermeldung:
assignment makes integer from pointer without a cast [enabled by default]
der parameter argv[1] soll 0x41 übergeben, also programmname.exe 0x41
Ich bin leider kein C-Programmierer und steig da nicht durch.., aber 0x41 ist doch kein integer
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 259939
Url: https://administrator.de/contentid/259939
Ausgedruckt am: 15.11.2024 um 11:11 Uhr
12 Kommentare
Neuester Kommentar
Moin,
vermutlich erwartet die Variable ip.ki.wVk einen Pointer
http://charlottehill.com/error/2018.xml
Gruß jodel32
vermutlich erwartet die Variable ip.ki.wVk einen Pointer
http://charlottehill.com/error/2018.xml
Gruß jodel32
Hallo djevil-ad!
Grundsätzlich werden Argumente als ASCII-Zeichen übergeben und müssen je nach Bedarf entsprechend konvertiert werden.
Argv ist eine Pointer-Strukt d.h. Pointer auf Argv der in Argv, Argv[1]... wiederum Pointer auf die einzelnen Argumente beinhaltet.
Wenn Du ein "A" als Argument übergibst, dann bekommst Du über Argv[1] den Buchstaben "A" als Char und wenn Du 0x41 als Argument übergibst, dann bekommst Du dieses ebenfalls als Char "0x41", wobei das "A" in der Byte-Arbeitsspeicheradresse als Hex-Wert 0x41 (dezimal 65) steht. Wenn Du einen Integer brauchst, dann musst Du den Char "A" in einen Integer konvertieren. Bei einem einzelnen Buchstaben sollte es mit = (int) argv[1] möglicherweise auch gehen...
Hexzahlen werden im Format 0x.. angegeben und werden nur innerhalb des Programmcodes als Zahlen interpretiert (Integer, Long...)
Test mal:
ip.ki.wVk = 0x41;
Grüße Dieter
vermutlich erwartet die Variable ip.ki.wVk einen Pointer
Ist ja ein Pointer und so wie ich das sehe will die Variable ja einen Key-CodeGrundsätzlich werden Argumente als ASCII-Zeichen übergeben und müssen je nach Bedarf entsprechend konvertiert werden.
Argv ist eine Pointer-Strukt d.h. Pointer auf Argv der in Argv, Argv[1]... wiederum Pointer auf die einzelnen Argumente beinhaltet.
Wenn Du ein "A" als Argument übergibst, dann bekommst Du über Argv[1] den Buchstaben "A" als Char und wenn Du 0x41 als Argument übergibst, dann bekommst Du dieses ebenfalls als Char "0x41", wobei das "A" in der Byte-Arbeitsspeicheradresse als Hex-Wert 0x41 (dezimal 65) steht. Wenn Du einen Integer brauchst, dann musst Du den Char "A" in einen Integer konvertieren. Bei einem einzelnen Buchstaben sollte es mit = (int) argv[1] möglicherweise auch gehen...
Hexzahlen werden im Format 0x.. angegeben und werden nur innerhalb des Programmcodes als Zahlen interpretiert (Integer, Long...)
Test mal:
ip.ki.wVk = 0x41;
Grüße Dieter
Es wäre mal schön zu wissen von welchem Typ die Variable ip.ki.wVk ist (steht entweder irgendwo in deinem Code oder in der Bibliothek die du benutzt) !
Eine Typumwandlung machst du beispielsweise so:
oder
Ohne den Typ deiner Variablen zu kennen ... ist das hier leider ein Raten ....
Gruß jodel32
Eine Typumwandlung machst du beispielsweise so:
ip.ki.wVk = (int*)argv[1];
ip.ki.wVk = (char*)argv[1];
Gruß jodel32
Hallo djevil-ad.
Dein Denkfehler ist allerdings, dass numerische Argumente auch als Zahl eingehen. Dem ist nicht so. Wie du in der Parameterliste der main() Funktion sehen kannst, kommen Argumente als Array von Charpointern an. (In anderen Sprachen würde man von einem Stringarray reden, in C gibt es aber keinen Stringtyp.) Du musst also vorab konvertieren. Ich schlage die strtol() Funktion zu diesem Zweck vor.
Grüße
rubberman
Ich bin leider kein C-Programmierer und steig da nicht durch..
Warum willst du dann einen Klickbot in C programmieren?aber 0x41 ist doch kein integer
Kommt auf den Kontext an. 0x41 ist die hexadezimale Schreibweise für 65. Warum sollte es also kein Integer sein?Dein Denkfehler ist allerdings, dass numerische Argumente auch als Zahl eingehen. Dem ist nicht so. Wie du in der Parameterliste der main() Funktion sehen kannst, kommen Argumente als Array von Charpointern an. (In anderen Sprachen würde man von einem Stringarray reden, in C gibt es aber keinen Stringtyp.) Du musst also vorab konvertieren. Ich schlage die strtol() Funktion zu diesem Zweck vor.
Grüße
rubberman
also dann noch ein
in den Kopf und dann
Gruß jodel32
#include <stdlib.h>
in den Kopf und dann
ip.ki.wVk = strtol(argv[1],NULL,0);
Gruß jodel32
Naja, so ähnlich. Letztlich bietet strtol() die Möglichkeit Falscheingaben abzufangen, was den eigentlichen Reiz ausmacht.
Ich würde den Spaß etwa so schreiben:
Bei diesem Code reicht es den ASCII Wert zu übergeben. Der Scancode wird mittels Keyboard Layout berechnet.
Grüße
rubberman
Ich würde den Spaß etwa so schreiben:
#ifdef UNICODE
#undef UNICODE
#endif
#ifdef _UNICODE
#undef _UNICODE
#endif
#ifdef WINVER
#undef WINVER
#endif
#define WINVER 0x0501
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char *argv)
{
long lConverted = 0;
char *pchEnd = 0,
szCurrentKbLayout[KL_NAMELENGTH] = {0};
HKL hkl = NULL;
INPUT ip[8] = {{0}};
int i = 0, j = 0, c = 0, ch = EOF;
SHORT sKey = 0;
UINT uScShift = 0,
uScCtrl = 0,
uScAlt = 0,
uCapslock = 0,
rguScanCodes[4] = {0};
if (argc != 2)
return 1;
errno = 0;
lConverted = strtol(argv[1], &pchEnd, 0);
if (*pchEnd || ERANGE == errno || lConverted < 0 || lConverted > 255)
return 1;
ch = (int)lConverted;
BOOL fCapslock = GetKeyState(VK_CAPITAL) & 1;
if (!GetKeyboardLayoutName(szCurrentKbLayout))
return 1;
hkl = LoadKeyboardLayout(szCurrentKbLayout, KLF_ACTIVATE | KLF_NOTELLSHELL | KLF_REPLACELANG | KLF_SETFORPROCESS);
uScShift = MapVirtualKeyEx(VK_SHIFT, MAPVK_VK_TO_VSC, hkl),
uScCtrl = MapVirtualKeyEx(VK_CONTROL, MAPVK_VK_TO_VSC, hkl),
uScAlt = MapVirtualKeyEx(VK_MENU, MAPVK_VK_TO_VSC, hkl),
uCapslock = MapVirtualKeyEx(VK_CAPITAL, MAPVK_VK_TO_VSC, hkl);
for (; i < 8; ++i)
{
ip[i].type = INPUT_KEYBOARD;
ip[i].ki.time = 0;
ip[i].ki.wVk = 0;
ip[i].ki.dwExtraInfo = 0;
ip[i].ki.dwFlags = KEYEVENTF_SCANCODE;
}
if (fCapslock)
{
ip.ki.dwFlags &= ~KEYEVENTF_KEYUP;
ip.ki.wScan = uCapslock;
ip[1].ki.dwFlags |= KEYEVENTF_KEYUP;
ip[1].ki.wScan = uCapslock;
SendInput(2, ip, sizeof(INPUT));
}
if ((sKey = VkKeyScanEx(ch, hkl)) == (SHORT)(-1))
return 1;
if (HIBYTE(sKey) & 1)
rguScanCodes[c++] = uScShift;
if (HIBYTE(sKey) & 2)
rguScanCodes[c++] = uScCtrl;
if (HIBYTE(sKey) & 4)
rguScanCodes[c++] = uScAlt;
rguScanCodes[c++] = MapVirtualKeyEx(LOBYTE(sKey), MAPVK_VK_TO_VSC, hkl);
for (i = 0, j = 2 * c - 1; i < c; ++i, --j)
{
ip[i].ki.dwFlags &= ~KEYEVENTF_KEYUP;
ip[i].ki.wScan = rguScanCodes[i];
ip[j].ki.dwFlags |= KEYEVENTF_KEYUP;
ip[j].ki.wScan = rguScanCodes[i];
}
SendInput(2 * c, ip, sizeof(INPUT));
if (fCapslock)
{
ip.ki.dwFlags &= ~KEYEVENTF_KEYUP;
ip.ki.wScan = uCapslock;
ip[1].ki.dwFlags |= KEYEVENTF_KEYUP;
ip[1].ki.wScan = uCapslock;
SendInput(2, ip, sizeof(INPUT));
}
return 0;
}
Bei diesem Code reicht es den ASCII Wert zu übergeben. Der Scancode wird mittels Keyboard Layout berechnet.
Grüße
rubberman
Hallo djevil-ad.
Ein Minimum an vernünftiger Funktionalität und Fehlerabfrage sollte man schon implementieren. Dein Code geht schon unschön in die Knie, wenn du mal vergisst einen Parameter zu übergeben ...
Grüße
rubberman
108 Zeilen... das ist echt krass, für so ein vermeintlich kleines Projekt...
Das ist eigentlich ein Hauch von Nichts bei einem C Projekt Ein Minimum an vernünftiger Funktionalität und Fehlerabfrage sollte man schon implementieren. Dein Code geht schon unschön in die Knie, wenn du mal vergisst einen Parameter zu übergeben ...
Grüße
rubberman