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

Digger Man

Любитель Linux
Модератор
1,635
1,116
Использую в проекте "Use Multi-Byte Character Set". Заметил, что при работе с sqlite3_open (www.sqlite.org) и наличии русских символов в пути к базе возвращает unable to open database file. Как решить проблему?
Ты когда мульти байт используешь, у тебя некоторые буквы на кириллице представляются несколькими байтами,
sqlite3_open ожидает UTF-8, который использует однобайтовую кодировку для ASCII и многобайтовую для не ASCII, включая кириллицу , преобразуй путь к файлу в UTF-8 перед передачей в sqlite3_open, в винапи для этого есть MultiByteToWideChar и обратная WideCharToMultiByte
 
  • Нравится
  • Влюблен
Реакции: Z3roKwq и Leatington

Leatington

Известный
258
71
Ты когда мульти байт используешь, у тебя некоторые буквы на кириллице представляются несколькими байтами,
sqlite3_open ожидает UTF-8, который использует однобайтовую кодировку для ASCII и многобайтовую для не ASCII, включая кириллицу , преобразуй путь к файлу в UTF-8 перед передачей в sqlite3_open, в винапи для этого есть MultiByteToWideChar и обратная WideCharToMultiByte
(обновлено), получилось с помощью следующей функции, спасибо.


C++:
std::string CP1251_to_UTF8(const char* str)
{
    std::string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(1251, 0, str, -1, 0, 0);
    if (!result_u) { return 0; }
    wchar_t* ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(1251, 0, str, -1, ures, result_u)) {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(65001, 0, ures, -1, 0, 0, 0, 0);
    if (!result_c) {
        delete[] ures;
        return 0;
    }
    char* cres = new char[result_c];
    if (!WideCharToMultiByte(65001, 0, ures, -1, cres, result_c, 0, 0)) {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}


Код:
std::string res = CP1251_to_UTF8(path.c_str());

sqlite3* users;
if (sqlite3_open(res.c_str(), &users))
{
    std::cout << "Error! Code: #2. Text: " << sqlite3_errmsg(users) << "." << std::endl;
}
 
  • Нравится
Реакции: Z3roKwq

Musaigen

abobusnik
Проверенный
1,583
1,302
(обновлено), получилось с помощью следующей функции, спасибо.


C++:
std::string CP1251_to_UTF8(const char* str)
{
    std::string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(1251, 0, str, -1, 0, 0);
    if (!result_u) { return 0; }
    wchar_t* ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(1251, 0, str, -1, ures, result_u)) {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(65001, 0, ures, -1, 0, 0, 0, 0);
    if (!result_c) {
        delete[] ures;
        return 0;
    }
    char* cres = new char[result_c];
    if (!WideCharToMultiByte(65001, 0, ures, -1, cres, result_c, 0, 0)) {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}


Код:
std::string res = CP1251_to_UTF8(path.c_str());

sqlite3* users;
if (sqlite3_open(res.c_str(), &users))
{
    std::cout << "Error! Code: #2. Text: " << sqlite3_errmsg(users) << "." << std::endl;
}
мемори лик в 19 строке, и вроде функцию можно укоротить в два вызова (но это не точно)
 

Digger Man

Любитель Linux
Модератор
1,635
1,116
и вроде функцию можно укоротить в два вызова (но это не точно)
можно, если wstring и wstring_convert юзать

по поводу мемори лика, можно просто перед каждым ретерном добавить delete[] ures/cres
 
  • Нравится
Реакции: Leatington

AkeGGa.biz

Новичок
11
6
qq, как имитировать нажатие Y?
от этого стоит защита:
c++:
keybd_event(key, 0, KEYEVENTF_KEYDOWN,0);
sleep(10)
keybd_event(key, 0, KEYEVENTF_KEYUP,0);
дайте варики что юзать
 

Digger Man

Любитель Linux
Модератор
1,635
1,116
qq, как имитировать нажатие Y?
от этого стоит защита:
c++:
keybd_event(key, 0, KEYEVENTF_KEYDOWN,0);
sleep(10)
keybd_event(key, 0, KEYEVENTF_KEYUP,0);
дайте варики что юзать
SendInput() в вин апи есть
input.ki.wScan = MapVirtualKey('Y', MAPVK_VK_TO_VSC);

input.ki.wVk = 'Y';
 
  • Нравится
Реакции: Z3roKwq

ARMOR

kjor32 is legend
Модератор
4,851
6,081
Как можно получить название кнопок диалога без хука на CDIalog::Show? Облазил всю структуру CDialog и подструктур в ней, но нихуя.
 

RTD

Нестандартное звание
Модератор
391
414
Как можно получить название кнопок диалога без хука на CDIalog::Show? Облазил всю структуру CDialog и подструктур в ней, но нихуя.
 
  • Влюблен
Реакции: ARMOR

solution

Участник
40
9
как реализовать запуск входа на сервер(открытие гташки) на плюсах? пробовал отправять с цмдху samp.exe с ником/айпи/портом = подключение к :7777, gta_sa.exe = дало одиночку. буду благодарен <3
 

etereon

MQ-Team
Проверенный
323
837
как реализовать запуск входа на сервер(открытие гташки) на плюсах? пробовал отправять с цмдху samp.exe с ником/айпи/портом = подключение к :7777, gta_sa.exe = дало одиночку. буду благодарен <3
Тебе надо ещё инжектить samp.dll в гта, samp.exe перехватывает поток игры при запуске и вызывает из него LLA
 
  • Нравится
Реакции: Z3roKwq

AkeGGa.biz

Новичок
11
6
Если SAMP то CObject + 0x14
я про сф апи. Для 3д текстов что то типо такого, для объектов похожее найти не могу:

с++:
            for (int i = 0; i < SAMP_MAX_3DTEXTS; i++)
            {
                if (SF->getSAMP()->getNetGame()->pools->textLabelPool->iIsListed[i] != 1)
                    continue;
                std::string strdialogText(SF->getSAMP()->getNetGame()->pools->textLabelPool->textLabel[i].text);
                if (strdialogText.find("НАШ ТЕКСТ") != std::string::npos) {
                        float labelposX = SF->getSAMP()->getNetGame()->pools->textLabelPool->textLabel[i].position[0];
                        float labelposY = SF->getSAMP()->getNetGame()->pools->textLabelPool->textLabel[i].position[1];
                }
            }


object:
for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
            {
                if(SF->getSAMP()->getNetGame()->pools->objectPool->isListed[i] != 1)
                    continue;
            }
 

ARMOR

kjor32 is legend
Модератор
4,851
6,081
я про сф апи. Для 3д текстов что то типо такого, для объектов похожее найти не могу:

с++:
            for (int i = 0; i < SAMP_MAX_3DTEXTS; i++)
            {
                if (SF->getSAMP()->getNetGame()->pools->textLabelPool->iIsListed[i] != 1)
                    continue;
                std::string strdialogText(SF->getSAMP()->getNetGame()->pools->textLabelPool->textLabel[i].text);
                if (strdialogText.find("НАШ ТЕКСТ") != std::string::npos) {
                        float labelposX = SF->getSAMP()->getNetGame()->pools->textLabelPool->textLabel[i].position[0];
                        float labelposY = SF->getSAMP()->getNetGame()->pools->textLabelPool->textLabel[i].position[1];
                }
            }


object:
for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
            {
                if(SF->getSAMP()->getNetGame()->pools->objectPool->isListed[i] != 1)
                    continue;
            }
C++:
SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[0];
Попробуй. Я не шарю в ваших SF'ах
 
  • Нравится
Реакции: why ega и AkeGGa.biz

AkeGGa.biz

Новичок
11
6
нужен гм кар, как можно реализовать?

lua:
if enable and isCharInAnyCar(PLAYER_PED) then
    setCarProofs(storeCarCharIsInNoSave(PLAYER_PED), true, true, true, true, true)
end
а на сф апи как? (5,5,1 (r3))