Перейти к содержанию

Запись в файл из dll


Рекомендуемые сообщения

Короче инжектю dll'ку и нужно что б там она записывала в .txt файл данные.

 

Я вот пишу вот так вот, но не работает,сразу креш...

bool WriteToFile(char* filePath, char* content){    ofstream outf;    try    {        outf.open(filePath, std::ofstream::out | std::ofstream::app);    }    catch (...){}    if (outf.fail())    {        MessageBox(0, "False", "", 0);        outf.close();        return false;    }    else        outf.write(content, sizeof(content));    outf.close();    return true;}

И через FILE *outf; тоже пробовал..

Тупо креш.. И дело даже не в "char* content и wchar_t* content", ибо я для теста тупо пишу "wwwwwwww", и все равно креш...

Использую я эту функцию в хуке другой в игре, и она там довольно часто юзается, но пишет благополучно только первые данные, второй раз уже "outf == NULL" и креш...

Ссылка на комментарий
Поделиться на другие сайты

Опять-таки, посмотри типы переменных, точно ли у тебя char, а не wchar_t передается. Далее, попробуй объявить outf за пределами функции (можешь вообще в глобальной области). И наконец, попробуй записать таким образом:

outf << content;
И да, главное - проверь, правильный ли путь к файлу передается в функцию, скорее всего, дело именно в этом.
Ссылка на комментарий
Поделиться на другие сайты

Короче посмотрел в самой функции что там творится пошагово, и вот такая штука:

Аргумент "filePath" я делаю так:

//Переменные глобальные:string DllPath = "c:\\programm\\release";char* logFileName = "\\log.txt";// Вызов функцииWriteToFile(strcat((char*) DllPath.data(), logFileName), "Test1");

Ну и оказывается что конкатенация в c++ совсем не такая как в c# штоли...

Ибо первый раз "filePath = c:\\programm\\release\\log.txt".

А вот второй раз "filePath = c:\\programm\\release\\log.txt\\log.txt".

 

Вот такая вот фигня... Походу не ту функцию я выбрал для конкатенации...


Во общем сделал что б полный путь создавался один раз при инжекте, и дальше уже просто использовался.

А функцию записи в файл написал вот так:

bool WriteToFile(char* filePath, char* content){	ofstream outfile;	outfile.open(filePath, ios_base::app);	if (!outfile.is_open())	{		outfile.close();		return false;	}	else		outfile << content;	outfile.close();	return true;}

Работает нормально, но вот как просто соединять char* строки, что бы оригиналы не изменялись я вот только вот так нугуглил:

char* one = "one";char* two = "two";char* three = "three";char* four = "four";string result = string(one) + string(two) + string(three) + string(four);
Ссылка на комментарий
Поделиться на другие сайты

wsprintf - для форматирования вывода. В качестве выхода используется буфер, который создаешь, в качестве входа - произвольный набор переменных. В общем, почитай про эту функцию на МСДН, и пользуйся )

Ссылка на комментарий
Поделиться на другие сайты

Ну да, эта функция хоть отдаленно похожа на человеческую конкатенацию... Но создание буферов этих везде и всюду меня уже реально начинает поднапрягать...

Спасибос за инфу в любом случае, все лучше чем то, как делал я...

 

з.ы.

// Конкатенация времени(собственно для этого и нужна была )char sb[512];wsprintf(sb, "%d-%d-%d", time->tm_hour, time->tm_min, time->tm_sec);

Ну и вот еще маленький вопросец, как все таки правильно будет:

char sb[512];tm* time = GetCurrentDateTime(); // Получаем указатель на структуру времени// Вот так?wsprintf(sb, "%d-%d-%d", time->tm_hour, time->tm_min, time->tm_sec);// Или можно так?wsprintf(sb, "%d-%d-%d", GetCurrentDateTime()->tm_hour, GetCurrentDateTime()->tm_min, GetCurrentDateTime()->tm_sec);

Правильно ли я понимаю что в 1м случаем создается указатель на указатель, а во втором используется сразу указатель который вернет функция?

Или это одно и тоже во обще?

 

Ну и еще нужно ли писать

delete[] sb;

Или тут как в c#, после выхода из функции все локальные переменные удаляются автоматом?

Ссылка на комментарий
Поделиться на другие сайты

Можно как угодно, но с точки зрения правильного использования ресурсов верным будет 1й вариант.

Потом, каким образом ты хочешь удалить статическую память?

delete предназначен только для объектов созданных через new.


Ну да, эта функция хоть отдаленно похожа на человеческую конкатенацию... Но создание буферов этих везде и всюду меня уже реально начинает поднапрягать...

 

Так ты сделай функцию FormatDate и в ней производи нужные тебе операции, передавай ей указатель или ссылку на строку, куда хочешь получить результат и всё.

 

P.S. Почитай про время жизни и область видимости переменных в C++.

 

Небольшой пример кода под винду:

#include <iostream>#include <time.h>#include <string>void GetCurrentTime(tm* tm){	time_t t = time(0);	localtime_s(tm, &t);}void FormatTime(tm* pTime, std::string* pString){	char buffer[64];	sprintf_s(buffer, "%d-%d-%d", pTime->tm_hour, pTime->tm_min, pTime->tm_sec);	pString->assign(buffer);}int _tmain(int argc, _TCHAR* argv[]){	tm currTime;	std::string timeString;	GetCurrentTime(&currTime);	FormatTime(&currTime, &timeString);	printf(timeString.c_str());	return 0;}
Ссылка на комментарий
Поделиться на другие сайты

Не ну я думал типа что при каждом вызове функции будет выделятся память...

void fonc1(){       char sb[512];}

По этому и спросил, а то я так понимаю с++ больше гибок но и более ответственен для программиста язык.. Ну в принципе все понял, почитаю о локальных переменных..

Ссылка на комментарий
Поделиться на другие сайты

Не ну я думал типа что при каждом вызове функции будет выделятся память...

void fonc1(){       char sb[512];}

По этому и спросил, а то я так понимаю с++ больше гибок но и более ответственен для программиста язык.. Ну в принципе все понял, почитаю о локальных переменных..

Есть язык еще более гибкий, чем С++ - ассемблер)

Тебе еще нужно читать про статичную и динамическую память (именно её нужно освобождать).

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.