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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя http://www.cyberforum.ru/cpp/thread1242580.html
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++
C++ Разделить выпуклый многоугольник на 4 равные части двумя взаимно перпендикулярными прямыми Почти то же, что и тут: http://www.cyberforum.ru/java/thread1022760.html, но хочется решить на C++. А именно: Есть некоторый выпуклый многоугольник, который необходимо разделить на 4 равные части двумя взаимно перпендикулярными прямыми. Входные данные: количество вершин и их координаты в порядке обхода. Координаты не больше 10000, самих координат не больше 1500. Координаты все целочисленные.... http://www.cyberforum.ru/cpp/thread1242320.html
C++ Отследить изменение памяти сторонним процессом
Есть основное приложение1. Есть приложение2, которое считывает и изменяет его память. Надо отследить адреса, действие(чтение или запись), значение до и после действия. Куда копать?
Adobe PDF Library (APDFL) - поместить в формируемый документ картину формата PNG C++
Всем привет! Данная тема, возможно, не вполне подходит для данного раздела, поскольку вопрос, преимущественно имеет отношение к API Adobe PDF, конкретнее, к плюсовому API. Я пишу с использованием этой библиотеки от datalogics некоторое API для формирования PDF-документов. Сбился с ног, пытаясь запихать в формируемый документ (программно, разумеется) картину формата PNG. С JPEG проблем нет,...
C++ Электронная подпись+работа с сертификатами http://www.cyberforum.ru/cpp/thread1241481.html
Здравствуйте!дали задание,саму суть понял,не могу разобраться,как начать писать программу.помогите кто чем может. Вот само задание: Разработать приложение - утилиту командной строки, или с графической оболочкой (на выбор). Утилита должна решать следующие задачи: 1. По серийному номеру находить нужный сертификат из хранилища MY 2. Выводить на экран информацию о владельце, сроке действия, и об...
C++ Освобождение динамически созданных переменных (2-ого уровня) И так, продолжу старую тему про динамику. На этот раз есть вот что: #include <iostream> #include <stdio.h> #include <conio.h> #include <math.h> using namespace std; подробнее

Показать сообщение отдельно
StailGot
27 / 22 / 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;
}
 
Текущее время: 02:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru