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

Roger571

Известный
58
31
Вопрос скорей всего не по SAMP'у.

На днях мне было необходимо создать графическое приложение. Можно использовать C++ вместе с MFC, либо переехать на QT Creator, либо.. Либо использовать C# вместе с C++. Я бы хотел спросить про третий случай.

Кто нибудь уже пробовал создавать графику в C# и вызывать из C# функции (какие-нибудь системные вычисления) из своей библиотеки C++? Что можно сказать про производительность?

Просто я не сильно доверяю QT Creator из-за незнания самого продукта.
Сам никогда совмещение не практиковал, но есть вариант на крестах написать библиотеку и вызывать ее функции уже из шарпа.
В процессе поиска выяснилось, что это не так и сложно, как мне показалось изначально.
Но т.к. сам я никогда такое не практиковал, то мои советы скорее всего будут с нулевой пользой и я буду выступать твоим личным гуглом.
SO1
SO2
 

liefasm

Новичок
6
0
Сам никогда совмещение не практиковал, но есть вариант на крестах написать библиотеку и вызывать ее функции уже из шарпа.
В процессе поиска выяснилось, что это не так и сложно, как мне показалось изначально.
Но т.к. сам я никогда такое не практиковал, то мои советы скорее всего будут с нулевой пользой и я буду выступать твоим личным гуглом.
SO1
SO2

Хотелось бы встретить человека который бы сравнил производительность программы, которая была написана только на C# и программы которая бы комбинировала два языка.
 

RTD

Потужно
Модератор
399
470
Хук по адресу samp.dll + 0x65C60(это FUNC_SAMP_SENDCMD) конфликтит с SF, вызывая, к примеру из Lua скрипта, функцию
sampSendChat - выбрасывается "opcode '0AF9' call caused an unhandled exception". Есть другой адрес?
 

FYP

Известный
Администратор
1,763
5,906
Хук по адресу samp.dll + 0x65C60(это FUNC_SAMP_SENDCMD) конфликтит с SF, вызывая, к примеру из Lua скрипта, функцию
sampSendChat - выбрасывается "opcode '0AF9' call caused an unhandled exception". Есть другой адрес?
если хук нарушает вызовы хукнутой функции, то проблема однозначно в самом хуке.
 
  • Нравится
Реакции: RTD

index

Известный
126
82
C++:
char* Func()
{
    char i[7] = "cakebou";
    return i;
}
Ты возвращаешь адрес локального массива, это даже не скомпилируется.

C++:
char * foo()
{
    char * bar = new char[7];
    bar = "string";
    return bar;
}
И после использования - не забыть освободить память.
 
  • Нравится
Реакции: Cake_ и liefasm

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
здрасте. почему код выполняет действие, даже не смотря на то, что я нажал кнопку?
C++:
    if (Cvars::teleport && GetAsyncKeyState(Cvars::tp_key))
    {
        IEntity* entity = nullptr;
        if (Cvars::tp == 1) entity->SetPos(Cvars::TeleportPositions1);
        if (Cvars::tp == 2) entity->SetPos(Cvars::TeleportPositions2);
        if (Cvars::tp == 3) entity->SetPos(Cvars::TeleportPositions3);
        if (Cvars::tp == 4) entity->SetPos(Cvars::TeleportPositions4);
    }
 

Stiopko

Известный
Проверенный
307
218
здрасте. почему код выполняет действие, даже не смотря на то, что я нажал кнопку?
C++:
    if (Cvars::teleport && GetAsyncKeyState(Cvars::tp_key))
    {
        IEntity* entity = nullptr;
        if (Cvars::tp == 1) entity->SetPos(Cvars::TeleportPositions1);
        if (Cvars::tp == 2) entity->SetPos(Cvars::TeleportPositions2);
        if (Cvars::tp == 3) entity->SetPos(Cvars::TeleportPositions3);
        if (Cvars::tp == 4) entity->SetPos(Cvars::TeleportPositions4);
    }

Попробуй вот это, у меня в плагинах норм работает
C++:
GetKeyState(VK_ADD) & 0x8000
 

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
Попробуй вот это, у меня в плагинах норм работает
C++:
GetKeyState(VK_ADD) & 0x8000
Попробуй с этим
C++:
BOOL GetMessage(
    LPMSG lpMsg,
    HWND hWnd,
    UINT wMsgFilterMin,
    UINT wMsgFilterMax
);
не, пачаны. этот tp_key пользователь сам выбирает. вот воид выбора кнопки:
C++:
void GUI::hotkey(int& key) noexcept
{
    key ? ImGui::Text("[ 0x%x ]", key) : ImGui::Text("[ key ]");
    if (ImGui::IsItemHovered()) {
        ImGuiIO& io = ImGui::GetIO();
        for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++)
            if (ImGui::IsKeyPressed(i) && i != config.misc.menuKey)
                key = i != VK_ESCAPE ? i : 0;

        for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
            if (ImGui::IsMouseDown(i) && i + (i > 1 ? 2 : 1) != config.misc.menuKey)
                key = i + (i > 1 ? 2 : 1);
    }
}
 

Stiopko

Известный
Проверенный
307
218
не, пачаны. этот tp_key пользователь сам выбирает. вот воид выбора кнопки:
C++:
void GUI::hotkey(int& key) noexcept
{
    key ? ImGui::Text("[ 0x%x ]", key) : ImGui::Text("[ key ]");
    if (ImGui::IsItemHovered()) {
        ImGuiIO& io = ImGui::GetIO();
        for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++)
            if (ImGui::IsKeyPressed(i) && i != config.misc.menuKey)
                key = i != VK_ESCAPE ? i : 0;

        for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
            if (ImGui::IsMouseDown(i) && i + (i > 1 ? 2 : 1) != config.misc.menuKey)
                key = i + (i > 1 ? 2 : 1);
    }
}
C++:
GetKeyState(Cvars::tp_key) & 0x8000
?
 
  • Нравится
Реакции: atizoff

sdfaw

Активный
717
150
void mapMenuTeleport(void)
SF->getSAMP()->registerChatCommand("test", mapMenuTeleport());
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp(50): error C2664: "bool SFSAMP::registerChatCommand(std::string,CommandProc)": невозможно преобразовать аргумент 2 из "void" в "CommandProc"
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp(50): note: Выражение, имеющее тип void, нельзя преобразовать в другой тип


как исправить?
 

ufdhbi

Известный
Проверенный
1,459
866
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp(50): error C2664: "bool SFSAMP::registerChatCommand(std::string,CommandProc)": невозможно преобразовать аргумент 2 из "void" в "CommandProc"
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp(50): note: Выражение, имеющее тип void, нельзя преобразовать в другой тип


как исправить?
убрать войд в аргументе функи?
 

ШPEK

Известный
1,474
525
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp(50): error C2664: "bool SFSAMP::registerChatCommand(std::string,CommandProc)": невозможно преобразовать аргумент 2 из "void" в "CommandProc"
1>C:\Users\admin\Desktop\SFPlugin\SFPlugin\main.cpp(50): note: Выражение, имеющее тип void, нельзя преобразовать в другой тип


как исправить?
void CALLBACK mapMenuTeleport() и
убери скобочки () в регистрации команды

убрать войд в аргументе функи?
Никак не помешает
 
  • Нравится
Реакции: sdfaw