Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Parameter mit argv übergeben in C-Programm

Frage Entwicklung C und C++

Mitglied: djevil-ad

djevil-ad (Level 1) - Jetzt verbinden

15.01.2015, aktualisiert 17:29 Uhr, 1453 Aufrufe, 12 Kommentare

Hallo, ich mochte einen Parameter an eine Variable übergeben:

01.
int main(int argc, char* argv[])  
02.
03.
	 
04.
	INPUT ip; 
05.
	printf(argv[1]); 
06.
 
07.
	 
08.
    // Set up a generic keyboard event. 
09.
    ip.type = INPUT_KEYBOARD; 
10.
    ip.ki.wScan = 0; // hardware scan code for key 
11.
    ip.ki.time = 0; 
12.
    ip.ki.dwExtraInfo = 0; 
13.
  
14.
    // Press the "A" key 
15.
    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
Mitglied: 114757
15.01.2015, aktualisiert 16.01.2015
Moin,
vermutlich erwartet die Variable ip.ki.wVk einen Pointer

http://charlottehill.com/error/2018.xml

Gruß jodel32
Bitte warten ..
Mitglied: Eintagsfliege
16.01.2015 um 01:37 Uhr
Hallo djevil-ad!

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

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[0], 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][0] 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
Bitte warten ..
Mitglied: djevil-ad
16.01.2015 um 10:52 Uhr
@114757

Welches Beispiel davon meinst du?

@Eintagsfliege

Test mal:
ip.ki.wVk = 0x41;

Nein, 0x41 soll ja als parameter argv[] übergeben werden.

Aber wenn ich dich richtig verstehe ist es einfacherl den Parameter als A zu übergeben da dieser dann als 0x41 in den Speicher geschrieben wird.

Habe jetzt geschrieben:

ip.ki.wVk = (*argv[1]);

Da muss ich aber ein A eingeben um ein a zu erhalten...?

Vielleicht ist eiener so nett mir zu sagen wie man es richtig machen würde,
Ich brauch wirklich nur dieses eine programm, da macht es nicht viel Sinn mich allzutief in C einzuarbeiten.
Bitte warten ..
Mitglied: djevil-ad
16.01.2015 um 10:58 Uhr
Edit: nein ich muss ja doch die Keycodes als hex-Werte angeben, wegen der Sonderzeichen.
Bitte warten ..
Mitglied: 114757
16.01.2015, aktualisiert um 11:10 Uhr
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:

ip.ki.wVk  = (int*)argv[1];
oder
ip.ki.wVk  = (char*)argv[1];
Ohne den Typ deiner Variablen zu kennen ... ist das hier leider ein Raten ....

Gruß jodel32
Bitte warten ..
Mitglied: djevil-ad
16.01.2015 um 11:42 Uhr
Das ist der komplette Code:

#define WINVER 0x0602
#include <windows.h>



int main(int argc, char* argv[])
{

INPUT ip;

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
ip.ki.dwFlags = 0; 0 for key press
SendInput(1, &ip, sizeof(INPUT));

Release the "A" key
ip.ki.dwFlags = KEYEVENTF_KEYUP; KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));

Exit normally
return 0;
}
Bitte warten ..
Mitglied: djevil-ad
16.01.2015 um 21:51 Uhr
Ok, der Typ muss ein Word sein, also
muss char in word konvertieren? Aber wie?
Bitte warten ..
Mitglied: rubberman
16.01.2015 um 23:05 Uhr
Hallo djevil-ad.

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
Bitte warten ..
Mitglied: 114757
LÖSUNG 16.01.2015, aktualisiert 17.01.2015
also dann noch ein
#include <stdlib.h>
in den Kopf und dann
ip.ki.wVk = strtol(argv[1],NULL,0);

Gruß jodel32
Bitte warten ..
Mitglied: rubberman
17.01.2015, aktualisiert um 01:56 Uhr
Naja, so ähnlich. Letztlich bietet strtol() die Möglichkeit Falscheingaben abzufangen, was den eigentlichen Reiz ausmacht.

Ich würde den Spaß etwa so schreiben:
01.
#ifdef UNICODE 
02.
#undef UNICODE 
03.
#endif 
04.
#ifdef _UNICODE 
05.
#undef _UNICODE 
06.
#endif 
07.
 
08.
#ifdef WINVER 
09.
#undef WINVER 
10.
#endif 
11.
#define WINVER 0x0501 
12.
#ifdef _WIN32_WINNT 
13.
#undef _WIN32_WINNT 
14.
#endif 
15.
#define _WIN32_WINNT 0x0501 
16.
 
17.
#include <windows.h> 
18.
#include <stdio.h> 
19.
#include <stdlib.h> 
20.
#include <errno.h> 
21.
 
22.
int main(int argc, char *argv[]) 
23.
24.
  long lConverted = 0; 
25.
  char *pchEnd = 0, 
26.
       szCurrentKbLayout[KL_NAMELENGTH] = {0}; 
27.
  HKL hkl = NULL; 
28.
  INPUT ip[8] = {{0}}; 
29.
  int i = 0, j = 0, c = 0, ch = EOF; 
30.
  SHORT sKey = 0; 
31.
  UINT uScShift = 0, 
32.
       uScCtrl = 0, 
33.
       uScAlt = 0, 
34.
       uCapslock = 0, 
35.
       rguScanCodes[4] = {0}; 
36.
 
37.
  if (argc != 2) 
38.
    return 1; 
39.
 
40.
  errno = 0; 
41.
  lConverted = strtol(argv[1], &pchEnd, 0); 
42.
  if (*pchEnd || ERANGE == errno || lConverted < 0 || lConverted > 255) 
43.
    return 1; 
44.
 
45.
  ch = (int)lConverted; 
46.
 
47.
  BOOL fCapslock = GetKeyState(VK_CAPITAL) & 1; 
48.
 
49.
  if (!GetKeyboardLayoutName(szCurrentKbLayout)) 
50.
    return 1; 
51.
 
52.
  hkl = LoadKeyboardLayout(szCurrentKbLayout, KLF_ACTIVATE | KLF_NOTELLSHELL | KLF_REPLACELANG | KLF_SETFORPROCESS); 
53.
 
54.
  uScShift = MapVirtualKeyEx(VK_SHIFT, MAPVK_VK_TO_VSC, hkl), 
55.
  uScCtrl = MapVirtualKeyEx(VK_CONTROL, MAPVK_VK_TO_VSC, hkl), 
56.
  uScAlt = MapVirtualKeyEx(VK_MENU, MAPVK_VK_TO_VSC, hkl), 
57.
  uCapslock = MapVirtualKeyEx(VK_CAPITAL, MAPVK_VK_TO_VSC, hkl); 
58.
 
59.
  for (; i < 8; ++i) 
60.
61.
    ip[i].type = INPUT_KEYBOARD; 
62.
    ip[i].ki.time = 0; 
63.
    ip[i].ki.wVk = 0; 
64.
    ip[i].ki.dwExtraInfo = 0; 
65.
    ip[i].ki.dwFlags = KEYEVENTF_SCANCODE; 
66.
67.
 
68.
  if (fCapslock) 
69.
70.
    ip[0].ki.dwFlags &= ~KEYEVENTF_KEYUP; 
71.
    ip[0].ki.wScan = uCapslock; 
72.
    ip[1].ki.dwFlags |= KEYEVENTF_KEYUP; 
73.
    ip[1].ki.wScan = uCapslock; 
74.
    SendInput(2, ip, sizeof(INPUT)); 
75.
76.
 
77.
  if ((sKey = VkKeyScanEx(ch, hkl)) == (SHORT)(-1)) 
78.
    return 1; 
79.
 
80.
  if (HIBYTE(sKey) & 1) 
81.
    rguScanCodes[c++] = uScShift; 
82.
  if (HIBYTE(sKey) & 2) 
83.
    rguScanCodes[c++] = uScCtrl; 
84.
  if (HIBYTE(sKey) & 4) 
85.
    rguScanCodes[c++] = uScAlt; 
86.
  rguScanCodes[c++] = MapVirtualKeyEx(LOBYTE(sKey), MAPVK_VK_TO_VSC, hkl); 
87.
 
88.
  for (i = 0, j = 2 * c - 1; i < c; ++i, --j) 
89.
90.
    ip[i].ki.dwFlags &= ~KEYEVENTF_KEYUP; 
91.
    ip[i].ki.wScan = rguScanCodes[i]; 
92.
    ip[j].ki.dwFlags |= KEYEVENTF_KEYUP; 
93.
    ip[j].ki.wScan = rguScanCodes[i]; 
94.
95.
 
96.
  SendInput(2 * c, ip, sizeof(INPUT)); 
97.
 
98.
  if (fCapslock) 
99.
100.
    ip[0].ki.dwFlags &= ~KEYEVENTF_KEYUP; 
101.
    ip[0].ki.wScan = uCapslock; 
102.
    ip[1].ki.dwFlags |= KEYEVENTF_KEYUP; 
103.
    ip[1].ki.wScan = uCapslock; 
104.
    SendInput(2, ip, sizeof(INPUT)); 
105.
106.
 
107.
  return 0; 
108.
}
Bei diesem Code reicht es den ASCII Wert zu übergeben. Der Scancode wird mittels Keyboard Layout berechnet.

Grüße
rubberman
Bitte warten ..
Mitglied: djevil-ad
17.01.2015 um 11:14 Uhr
@114757

Danke so funktioniert es!

Die Scancodes sind aber falsch, was wohl an meinem Tastaturlayout liegt..,

@rubberman

Ui, dein Code ist mir unheimlich

108 Zeilen... das ist echt krass, für so ein vermeintlich kleines Projekt...

Aber, nein ich hatte nicht gedacht, dass es als nummerischer Wert eingeht, ich hatte gedacht, das es als char-Array eingeht,
darum wäre ich nicht auf die Idee gekommen es als String zu behandeln,(String to long)

Na ja, wie auch immer, vielen Dank!

Dann scliess ich das Thema jetzt.

Gruss djevil-ad
Bitte warten ..
Mitglied: rubberman
17.01.2015 um 14:37 Uhr
Hallo djevil-ad.

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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Windows Server
gelöst Eventlog gesperrtes Konto, Konto als Parameter übergeben (10)

Frage von pablovic zum Thema Windows Server ...

Batch & Shell
Text-Datei auslesen und Inhalt als Parameter übergeben (1)

Frage von aubm2013 zum Thema Batch & Shell ...

Batch & Shell
gelöst New-ADUser (optional Parameter) (13)

Frage von mc-doubleyou zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (10)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...