Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Альтернативный вызов функции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Отследить изменение памяти сторонним процессом http://www.cyberforum.ru/cpp/thread1241864.html
Есть основное приложение1. Есть приложение2, которое считывает и изменяет его память. Надо отследить адреса, действие(чтение или запись), значение до и после действия. Куда копать?
C++ Adobe PDF Library (APDFL) - поместить в формируемый документ картину формата PNG Всем привет! Данная тема, возможно, не вполне подходит для данного раздела, поскольку вопрос, преимущественно имеет отношение к API Adobe PDF, конкретнее, к плюсовому API. Я пишу с... http://www.cyberforum.ru/cpp/thread1241863.html
Электронная подпись+работа с сертификатами C++
Здравствуйте!дали задание,саму суть понял,не могу разобраться,как начать писать программу.помогите кто чем может. Вот само задание: Разработать приложение - утилиту командной строки, или с...
Освобождение динамически созданных переменных (2-ого уровня) C++
И так, продолжу старую тему про динамику. На этот раз есть вот что: #include <iostream> #include <stdio.h> #include <conio.h> #include <math.h> using namespace std;
C++ Как правильно собрать ICU для g++ под Windows? http://www.cyberforum.ru/cpp/thread1238301.html
Не получается собрать ICU для компилятора g++ 4.8.2. Делаю через MSYS. Мои команды:cd D:/Temp/icu/source ./runConfigureICU MinGW --prefix=D:/Temp/dist --enable-static --disable-shared Всегда...
C++ Как из Wav файла получить комплексные значения для быстрого преобразования Фурье? Пишу программу для вывода спектра Wav файла Беру данные из Wav файла, прочел шапку, дошел до самих значений. Как понимаю это амплитудные значения. Дабы получить спектр, нужно использовать... подробнее

Показать сообщение отдельно
StailGot
28 / 23 / 6
Регистрация: 25.08.2013
Сообщений: 41
17.08.2014, 16:47
Цитата Сообщение от DrOffset Посмотреть сообщение
Провел небольшое исследование. VS игнорирует stdcall для прототипа такого вида
Так и должно быть.
The called function cleans the stack, unlike CDECL. This means that STDCALL doesn't allow variable-length argument lists.
Подробнее тут и еще тут.

Альтернативный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <windows.h>
#include <windowsx.h>
#include <iostream>
 
using namespace std;
 
//typedef int( _stdcall *Make_func )( HWND, char *, char *, UINT );
 
//typedef int( _stdcall *Make_func )( ... ); // _stdcall не может иметь переменное число аргументов.
                                             // [url]http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL[/url]
 
template<typename ...Args>
auto get_type( Args ... ) -> int( _stdcall *)( Args... ); // а вот так может.
 
int main()
{
  char fn[] = "MessageBoxA";
  int res = 0;
  HMODULE hMod = LoadLibraryA ( "user32.dll" );
  if ( !hMod )
    cout << "Library not loaded" << endl;
  else
  {
    void * me = GetProcAddress( hMod, fn );
    if ( !me )
      cout << "Function not loaded" << endl;
    else
    {
      using func_type = decltype( get_type((HWND)NULL, "hi", "message", (UINT)NULL) ); // выведем тип функции по ее аргументам
      res = ( (func_type)me ) ( (HWND)NULL, "hi", "message", (UINT)NULL );
 
      cout << res << endl;
    }
    FreeLibrary ( hMod );
  }
  return 0;
}
Добавлено через 12 минут
Упрощенный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <windows.h>
#include <windowsx.h>
#include <iostream>
 
using namespace std;
 
//typedef int( _stdcall *Make_func )( ... ); // _stdcall не может иметь переменное число аргументов.
                                             // [url]http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL[/url]
 
// а вот так может.
template<typename ...Args>
int call( void * fun, Args ... args)
{
 using func_type = int( _stdcall *)( Args... ); // выведем тип функции по ее аргументам
 return ( (func_type)fun ) ( args... );
}
 
 
int main()
{
  char fn[] = "MessageBoxA";
  int res = 0;
  HMODULE hMod = LoadLibraryA ( "user32.dll" );
  if ( !hMod )
    cout << "Library not loaded" << endl;
  else
  {
    void * me = GetProcAddress( hMod, fn );
    if ( !me )
      cout << "Function not loaded" << endl;
    else
    {
      res = call(me, (HWND)NULL, "hi", "message", (UINT)NULL );
      cout << res << endl;
    }
    FreeLibrary ( hMod );
  }
  return 0;
}
3
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru