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

san0

Известный
Друг
411
268
Рассчитываю на вашу поддержку.
Вы попались на то, что многие функции WinAPI реализованы в двух вариантах - для строк Unicode (по правильному конечно это wide characters) и ASCII. Для простоты выбора конкретной из них используют директивы препроцессора, одна из которых на этапе компиляции сама подбирает вариацию функции на основе настроек проекта. Т.е. все функции по типу MessageBox на самом деле бывают двух вариантов - MessageBoxA и MessageBoxW, сам MessageBox - это только макрос.
Это, конечно, весьма не детальное описание, о поддержке широких символов можно почитать тут https://docs.microsoft.com/en-us/windows/desktop/LearnWin32/working-with-strings
В lua Вы, естественно, вручную беспокоитесь о декларировании функций, а это значит, что макроса SendMessage здесь нет, в то время как внешний символ SendMessageA присутствует в составе библиотеки user32.dll.
Lua:
function main()
    local ffi = require('ffi')
    ffi.cdef('int SendMessageA(int, int, int, int);')
    ffi.C.SendMessageA(9576, 0x1002, 0xFF, 0xFFF)
end
 
  • Нравится
Реакции: Belo4ka_belka

Неадекватная сова

Известный
Проверенный
214
158
Как сделать так, чтобы по определенной команде в чат писало '/me ' и строку из test.ini файла
C++:
string ReadStr(std::string _Section, std::string _Key)
{
    char str[256];
    GetPrivateProfileString(_Section.c_str(), _Key.c_str(), NULL, str, sizeof(str), "SAMPFUNCS\\test.ini");
    return str;
}

string UTF8ToANSI(string s)
{
    BSTR    bstrWide;
    char*   pszAnsi;
    int     nLength;
    const char *pszCode = s.c_str();

    nLength = MultiByteToWideChar(CP_UTF8, 0, pszCode, strlen(pszCode) + 1, NULL, NULL);
    bstrWide = SysAllocStringLen(NULL, nLength);

    MultiByteToWideChar(CP_UTF8, 0, pszCode, strlen(pszCode) + 1, bstrWide, nLength);

    nLength = WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, NULL, 0, NULL, NULL);
    pszAnsi = new char[nLength];

    WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL);
    SysFreeString(bstrWide);

    string r(pszAnsi);
    delete[] pszAnsi;
    return r;
}

SFCLEO *SC;

void CALLBACK sendChatMessage(string message) {
    string thmsg = "0C8F: samp process_chat_input \"" + message + "\"";
    SC->callOpcode(thmsg.c_str());
}

Use:
string szStr = "/me " + UTF8ToANSI(ReadStr("", ""));
sendChatMessage(szStr);
 
  • Нравится
Реакции: Imbecil

Belo4ka_belka

Известный
191
7
Вы попались на то, что многие функции WinAPI реализованы в двух вариантах - для строк Unicode (по правильному конечно это wide characters) и ASCII. Для простоты выбора конкретной из них используют директивы препроцессора, одна из которых на этапе компиляции сама подбирает вариацию функции на основе настроек проекта. Т.е. все функции по типу MessageBox на самом деле бывают двух вариантов - MessageBoxA и MessageBoxW, сам MessageBox - это только макрос.
Это, конечно, весьма не детальное описание, о поддержке широких символов можно почитать тут https://docs.microsoft.com/en-us/windows/desktop/LearnWin32/working-with-strings
В lua Вы, естественно, вручную беспокоитесь о декларировании функций, а это значит, что макроса SendMessage здесь нет, в то время как внешний символ SendMessageA присутствует в составе библиотеки user32.dll.
Lua:
function main()
    local ffi = require('ffi')
    ffi.cdef('int SendMessageA(int, int, int, int);')
    ffi.C.SendMessageA(9576, 0x1002, 0xFF, 0xFFF)
end
А я все думал что это за приставки к названиям функций! Теперь все без ошибок запустилось. Правда раньше я лишь подозревал, а теперь на практике понял, что PID и HWND это разные вещи, к сожалению. Но думаю с этим я уже смогу разобраться. Спасибо!
 

Cake_

Потрачен
Проверенный
263
313
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как получить координаты пикапе в зоне стрима?
 

Imbecil

Новичок
15
0
кто то сталкивался с такой проблемой? крч установил Boost

C++:
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("time.ini", pt);
std::string patay = pt.get<std::string>("time.string");

пишу это, чтобы прочитать time.ini и получить значение строки. и вылазит куча ошибок в boost'e при попытке сборки проекта
27909

boost 1.69
visual studio 2017
 

Cake_

Потрачен
Проверенный
263
313
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
кто то сталкивался с такой проблемой? крч установил Boost

C++:
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("time.ini", pt);
std::string patay = pt.get<std::string>("time.string");

пишу это, чтобы прочитать time.ini и получить значение строки. и вылазит куча ошибок в boost'e при попытке сборки проекта
27909

boost 1.69
visual studio 2017
В начало
C++:
#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
 
  • Нравится
Реакции: Imbecil

Harryss

Участник
233
26
кто то сталкивался с такой проблемой? крч установил Boost

C++:
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("time.ini", pt);
std::string patay = pt.get<std::string>("time.string");

пишу это, чтобы прочитать time.ini и получить значение строки. и вылазит куча ошибок в boost'e при попытке сборки проекта
27909

boost 1.69
visual studio 2017
ты грузишь boost ради того чтобы работать с одним INI?
если да, специально для тебя
https://blast.hk/threads/22983/
 

Imbecil

Новичок
15
0
В начало
C++:
#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
было, не помогает
ты грузишь boost ради того чтобы работать с одним INI?
если да, специально для тебя
https://blast.hk/threads/22983/
я уже все либы перепробовал, эту тоже. может я что то не так делаю

C++:
SF->getSAMP()->registerChatCommand("time", time_command);
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
    initialized = true;
    std::string str = INI::ReadString("time", "string", 1337, ".\\time.INI");
    const char* result = &str[0];
    SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), result);
}
гружу тут, чтобы сразу увидеть вышло ли
upload_2019-4-7_15-52-57.png

просто пустая строка
 

Неадекватная сова

Известный
Проверенный
214
158
было, не помогает

я уже все либы перепробовал, эту тоже. может я что то не так делаю

C++:
SF->getSAMP()->registerChatCommand("time", time_command);
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
    initialized = true;
    std::string str = INI::ReadString("time", "string", 1337, ".\\time.INI");
    const char* result = &str[0];
    SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), result);
}
гружу тут, чтобы сразу увидеть вышло ли
Посмотреть вложение 27935
просто пустая строка
Покажи содержимое ini файла в котором читаешь
 

Imbecil

Новичок
15
0
а можно как то не добавлять сообщение в чат если в нем есть определенная строка. например, чтобы не отображались сообщения от определенных игроков
 

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
можно пример работы с DrawText?
 

Неадекватная сова

Известный
Проверенный
214
158
а можно как то не добавлять сообщение в чат если в нем есть определенная строка. например, чтобы не отображались сообщения от определенных игроков
C++:
bool CALLBACK incomingRPC(stRakNetHookParams * params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
            DWORD color;
            DWORD strlen;
            char string[2048];
            params->bitStream->ResetReadPointer();
            params->bitStream->Read(color);
            params->bitStream->Read(strlen);
            params->bitStream->Read(string, strlen);
            string[strlen] = '\0';
           
            if (strlen > 10) { //Если символов в строке больше 10, значит не показывать строку
                return false;
            }
           
            if (strstr(string, "Vasya_Pupok") != 0) { //Если найдена произвольная строка, тогда не показывать ее
                return false;
            }
    }
   
    return true;
}

SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);

можно пример работы с DrawText?
https://blast.hk/threads/23412/
 
  • Нравится
Реакции: atizoff и Imbecil