Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: djevil-ad

djevil-ad (Level 1) - Jetzt verbinden

15.01.2015, aktualisiert 17:29 Uhr, 1662 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: 116301
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?

@116301

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 ..
Ähnliche Inhalte
Visual Studio

C-Sharp Klasse als Parameter an Function übergeben

gelöst Frage von mayho33Visual Studio

Hallo @ All Ich beiße mir schon wieder die Zähne aus und hoffe aufs Neue auf eure Unterstützung mit ...

Batch & Shell

Powershell: Anführungszeichen in Parameter mit übergeben

Frage von tralvellerBatch & Shell3 Kommentare

Hallo zusammen, ich erstelle mir gerade ein Powershell-Skript welches mit Parameter arbeitet und zum Beispiel einen Pfad mit Leerzeichen ...

Batch & Shell

Anführungszeichen aus übergebenen Parametern entfernen

gelöst Frage von RaidManBatch & Shell2 Kommentare

Hallo Kenner und Könner, bin gerade dabei eine Batch zu basteln die Textdateien (detail infos) ändern soll dazu wollte ...

Microsoft Office

EXCEl Externes Programm mit Hyperlink öffnen, am besten noch bestimmten Zellinhalt als Parameter übergeben

gelöst Frage von FahrradMicrosoft Office15 Kommentare

Hallo zusammen, ich hoffe hier ein paar Excel Spezies können mir weiterhelfen :o) Ich möchte in einer Excel Tabelle ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 19 StundenWindows 103 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 22 StundenAdministrator.de Feedback16 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 2 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Windows Netzwerk
Backup über WAN
Frage von petereWindows Netzwerk11 Kommentare

Hallo, ich muss aus einem entfernten WAN (synchrone 1Gbit) Daten sichern. Dabei handelt es sich sowohl um wenige große ...