You are not logged in.
Pages: 1
Пытаюсь написать в C++ Builder'е asi. Застрял на том, что не получается вызвать функцию по указателю. Ну, как в delphi, к примеру:
var CreatePanel: function(PanelType:Byte;PanelName:Pointer;XPos,YPos, width:Single; columns,interactive,background,alignment:byte):Byte;cdecl; ... @CreatePanel := Ptr($582300);
А на C++ как будет? Вот так:
char __cdecl (*CreatePanel) (char type, char* name ,float XPos, float YPos, float width, char columns,char interactive,char background,char alignment); ... CreatePanel = 0x582300;
...не выходит:rolleyes: Типа можно присваивать только ссылку на уже где-то определенную функцию...
Offline
А тип привести?
char (__cdecl *CreatePanel) (char type, char* name ,float XPos, float YPos, float width, char columns,char interactive,char background,char alignment); ... CreatePanel = (char (cdecl *)(char, char *, float, float, float, char, char, char, char)) 0x582300;
Offline
о, спасибо.=) Так и знал, что что-то подобное надо сделать. Запись длиинная выходит. В жизни бы не додумался так написать.
Offline
Тоже пытаюсь написать asi на с++. Вернее, уже написал, но не пойму как правильно сделать обработчик нажатия клавиши. Исходный код такой:
#include <windows.h> #include <stdio.h> #include "stdafx.h" #include <iostream> #include <dwmapi.h> int aero = 0; BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { break; } case DLL_THREAD_ATTACH: { if (aero == 0) { DwmEnableComposition(1); aero = 1; } if (GetAsyncKeyState(VK_END)) { ExitProcess(0);//system("taskkill /F /T /IM gta_sa.exe &"); } // break; } case DLL_THREAD_DETACH: { break; } case DLL_PROCESS_DETACH: { break; } } return TRUE; }
DwmEnableComposition(1); срабатывает, а вот нажатие END нет. Точнее если нажать END, потом к примеру ESC, процесс завершится. А с первого раза не завершается, почему?
Делал проверку в цикле, срабатывает с первого раза, но например VC запускается, и висит интро экран, в меню не входит.
Last edited by Sergey81 (12-01-2011 04:55)
Offline
прости, должно быть, мой ответ уже будет неактуальным, но меня давненько не было на форуме
начнём с того, что не рекомендуется выполнять код в функции DllMain, лучше создай отдельный поток в приложении и позволь ему (приложению) окончательно запуститься и загрузить остальные библиотеки.
при инжекте библиотеки ul_reason_for_call равняется DLL_PROCESS_ATTACH, а не DLL_THREAD_ATTACH.
а вот тебе 0AB0 на C++:
bool KeyPressed(BYTE key) { return ((GetAsyncKeyState(key)&(1<<16))!=0); }
Last edited by BritishColonist (23-08-2011 00:15)
Offline
Pages: 1