Другое С/С++ Вопрос - Ответ

FYP

Известный
Администратор
1,758
5,722
Может херово объяснил. У меня есть, например, .asi плагин. Я хочу следить за тем, как в нем изменяются переменные. Для этого хочу вывести их каким-нибудь образом на экран. Лучше всего - в консольку. Как это можно сделать, как через длл создать консоль? Такую. в которую потом ожно будет сделать cout << DEBUGINFO << endl;
C++:
/* некоторые инклуды лишние, не помню какие из них нужны
#include <Windows.h>
#include <ShellAPI.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <iostream>
*/

void RedirectIOToConsole(void)
{
   const WORD MAX_CONSOLE_LINES = 500;
   int hConHandle;
   long lStdHandle;
   CONSOLE_SCREEN_BUFFER_INFO coninfo;
   FILE *fp;

   // allocate a console for this app
   AllocConsole();

   // set the screen buffer to be big enough to let us scroll text
   GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),
                &coninfo);
   coninfo.dwSize.Y = MAX_CONSOLE_LINES;
   SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
                coninfo.dwSize);

   // redirect unbuffered STDOUT to the console
   lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
   hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
   fp = _fdopen(hConHandle, "w");
   *stdout = *fp;
   setvbuf(stdout, NULL, _IONBF, 0);

   // redirect unbuffered STDIN to the console
   lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
   hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
   fp = _fdopen(hConHandle, "r");
   *stdin = *fp;
   setvbuf(stdin, NULL, _IONBF, 0);

   // redirect unbuffered STDERR to the console
   lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
   hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
   fp = _fdopen(hConHandle, "w");
   *stderr = *fp;
   setvbuf(stderr, NULL, _IONBF, 0);

   // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
   // point to console as well
   std::ios::sync_with_stdio();
}
 
  • Нравится
Реакции: p1cador

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Как сделать такое:
Класс->Группа->функция;
Типа
SFPlugin->Client()->SendMes();

У меня выходит только так:
Класс->Функция;

Хочу свои классы с группами написать, но не выходит.
Учи ООП. Это идет класс в классе. Да простит меня фип, если я не прав.
 

p1cador

cerf
Проверенный
220
359
Может что-то не так понял, но:
добавил функцию
C++:
void RedirectIOToConsole()
потом в bool WINAPI DllMain после выполнения условия DLL_PROCESS_ATTACH добавил
C++:
RedirectIOToConsole();
после чего в след. строке начал поток
C++:
 _beginthread(DLLProject, NULL, NULL);
В DLLProject сделал вывод текста разными способами:
C++:
cout << "Test output to cout" << endl;
cerr << "cerr" << endl;
clog << "clog" << endl;
cout << "cout";
wcout << L"wcout" << endl;
wcerr << L"wcerr" << endl;
wclog << L"wclog" << endl;
fprintf(stdout, "fprintf\n");
printf("printf");
В консоль ничего из этого не выводится. Но там появляется строка "Initialised SoundManager, которая вообще хер пойми откуда берется.
 

Вложения

  • Безымянный.png
    Безымянный.png
    2 KB · Просмотры: 232

FYP

Известный
Администратор
1,758
5,722
@Picador похоже что игра перенаправляет вывод. это как-то можно пофиксить, но как я не знаю, не приходилось аттачить консоль к sa.
 

#WH1SKEY

Новичок
6
0
Порылся, вот че накидал

C++:
class date
{
public:
    bool CMDS()
    {
        // Действие
        return true;
    }
};
class Cedit
{
public:
    date *Client;

};

class Cedit
    *Plugin;

Вот так использую
C++:
Plugin->Client->CMDS();
Программу крашит
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,260
1,740
Порылся, вот че накидал

C++:
class date
{
public:
    bool CMDS()
    {
        // Действие
        return true;
    }
};
class Cedit
{
public:
    date *Client;

};

class Cedit
    *Plugin;

Вот так использую
C++:
Plugin->Client->CMDS();
Программу крашит
потому что под указатель Client не выделена память, а ты обращаешься к нему
и вообще, иди не позорься, почитай нормально о C++, мы тут не собираемся тебя обучать
 

Perojek)0

Известный
205
3
Можно, пожалуйста, пример, как через dll написать что-нибудь в чат?
 

SR_team

like pancake
BH Team
4,720
6,369
Может что-то не так понял, но:
добавил функцию
C++:
void RedirectIOToConsole()
потом в bool WINAPI DllMain после выполнения условия DLL_PROCESS_ATTACH добавил
C++:
RedirectIOToConsole();
после чего в след. строке начал поток
C++:
 _beginthread(DLLProject, NULL, NULL);
В DLLProject сделал вывод текста разными способами:
C++:
cout << "Test output to cout" << endl;
cerr << "cerr" << endl;
clog << "clog" << endl;
cout << "cout";
wcout << L"wcout" << endl;
wcerr << L"wcerr" << endl;
wclog << L"wclog" << endl;
fprintf(stdout, "fprintf\n");
printf("printf");
В консоль ничего из этого не выводится. Но там появляется строка "Initialised SoundManager, которая вообще хер пойми откуда берется.
Вместо cout шли инфу в функцию по адресу 0x00821982, это вывод в который стучит игра
 
  • Нравится
Реакции: p1cador

iAmerican

Известный
Друг
615
257
Можно, пожалуйста, пример, как через dll написать что-нибудь в чат?

ну как то так
C++:
stChatInfo *g_Chat = 0x0;
#define SAMP_FUNC_ADDTOCHATWND                        0x064010

void addMessageToChat(D3DCOLOR cColor, char *szMsg, ...)
{
 
    void(__thiscall *AddToChatWindowBuffer) (const void *_this, int iType, char *szText, char *szPrefix, DWORD cColor, DWORD cPrefixColor) =
        (void(__thiscall *) (const void *, int, char *, char *, DWORD, DWORD)) (dwSAMPAddr + SAMP_FUNC_ADDTOCHATWND);

    va_list ap;
    char tmp[512];
    memset(tmp, 0, 512);
    va_start(ap, szMsg);
    vsnprintf(tmp, sizeof(tmp) - 1, szMsg, ap);
    va_end(ap);

    return AddToChatWindowBuffer((void *) g_Chat, 8, tmp, NULL, cColor, 0x00);
}
 
  • Нравится
Реакции: Perojek)0