#1 08-08-2009 09:54

Alien
Registered: 12-10-2008
Posts: 564

С++. Вызов функции по адресу.

Пытаюсь написать в 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

#2 08-08-2009 13:59

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: С++. Вызов функции по адресу.

А тип привести?

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

#3 08-08-2009 14:56

Alien
Registered: 12-10-2008
Posts: 564

Re: С++. Вызов функции по адресу.

о, спасибо.=) Так и знал, что что-то подобное надо сделать. Запись длиинная выходит. В жизни бы не додумался так написать.

Offline

#4 08-08-2009 15:45

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: С++. Вызов функции по адресу.

Угу, немаленькая.
Если нужно описать несколько функций с одинаковыми параметрами и способом их передачи - можно воспользоваться typedef.

Offline

#5 12-01-2011 00:44

Sergey81
Registered: 19-12-2008
Posts: 654

Re: С++. Вызов функции по адресу.

Тоже пытаюсь написать 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

#6 22-08-2011 04:08

BritishColonist
Registered: 30-09-2009
Posts: 72

Re: С++. Вызов функции по адресу.

прости, должно быть, мой ответ уже будет неактуальным, но меня давненько не было на форуме grin
начнём с того, что не рекомендуется выполнять код в функции 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

Board footer

Powered by FluxBB