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

Frage Entwicklung C und C++

Mitglied: djevil-ad

djevil-ad (Level 1) - Jetzt verbinden

15.01.2015, aktualisiert 17:29 Uhr, 1598 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
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 ...

Batch & Shell
Vbs - Variable als Parameter an externes Programm übergeben und Rückgabewert in Variable schreiben
gelöst Frage von goodbytesBatch & Shell4 Kommentare

Hallo, ich habe ein vbs-Script, welches alle Dateien eines Verzeichnisse in ein Array schreibt. Mittels eines kleinen Tools kann ...

Neue Wissensbeiträge
MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 11 StundenMikroTik RouterOS4 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 11 StundenSicherheit

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 14 StundenAdministrator.de Feedback9 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Vmware

VMware Desktopprodukte sind verwundbar

Information von Penny.Cilin vor 19 StundenVmware

Die VMware-Anwendungen zum Umgang mit virtuellen Maschinen Fusion, Horizon Client und Workstation sowie die Plattform NSX sind verwundbar. Davon ...

Heiß diskutierte Inhalte
Visual Studio
Vb.net-Tool zum Erzeugen einer Outlook-E-Mail
Frage von ahstaxVisual Studio24 Kommentare

Hallo, ich möchte gerne ein vb.net-Tool schreiben, das am Ende eine Outlook-E-Mail erzeugt. Grundsätzlich ist mir klar, wie das ...

Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server16 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...