Вы попались на то, что многие функции WinAPI реализованы в двух вариантах - для строк Unicode (по правильному конечно это wide characters) и ASCII. Для простоты выбора конкретной из них используют директивы препроцессора, одна из которых на этапе компиляции сама подбирает вариацию функции на основе настроек проекта. Т.е. все функции по типу MessageBox на самом деле бывают двух вариантов - MessageBoxA и MessageBoxW, сам MessageBox - это только макрос.Рассчитываю на вашу поддержку.
function main()
local ffi = require('ffi')
ffi.cdef('int SendMessageA(int, int, int, int);')
ffi.C.SendMessageA(9576, 0x1002, 0xFF, 0xFFF)
end
Как сделать так, чтобы по определенной команде в чат писало '/me ' и строку из test.ini файла
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);
А я все думал что это за приставки к названиям функций! Теперь все без ошибок запустилось. Правда раньше я лишь подозревал, а теперь на практике понял, что PID и HWND это разные вещи, к сожалению. Но думаю с этим я уже смогу разобраться. Спасибо!Вы попались на то, что многие функции 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
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("time.ini", pt);
std::string patay = pt.get<std::string>("time.string");
В началокто то сталкивался с такой проблемой? крч установил 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 при попытке сборки проекта
boost 1.69
visual studio 2017
#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
ты грузишь boost ради того чтобы работать с одним INI?кто то сталкивался с такой проблемой? крч установил 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 при попытке сборки проекта
boost 1.69
visual studio 2017
было, не помогаетВ начало
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/
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);
}
Покажи содержимое ini файла в котором читаешьбыло, не помогает
я уже все либы перепробовал, эту тоже. может я что то не так делаю
гружу тут, чтобы сразу увидеть вышло ли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 файла в котором читаешь
std::string str = INI::ReadString("time", "string", 1337, "SAMPFUNCS\\time.INI");
а можно как то не добавлять сообщение в чат если в нем есть определенная строка. например, чтобы не отображались сообщения от определенных игроков
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);
https://blast.hk/threads/23412/можно пример работы с DrawText?