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