C++ и dll на ассемблере

Тема в разделе "LANGS.C", создана пользователем CrawlUp, 18 фев 2019.

  1. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Отлично, ваш вариант помог отвязаться от типа параметра, отвязаться от количества параметров,
    видимо можно только перегрузкой.

    Код (Text):
    1. //Перегруженные функции для вызова любой функции из библиотеки
    2. inline auto FuncFromDll(const char* FuncName, HINSTANCE hDll)
    3. {
    4.     typedef LPVOID(WINAPI *newfunc)();
    5.     newfunc func = (newfunc)GetProcAddress(hDll, FuncName);
    6.     auto result = func();
    7.     return result;
    8. }
    9.  
    10. template <class T1>
    11. inline auto FuncFromDll(const char* FuncName,HINSTANCE hDll,T1 a1)
    12. {
    13.     typedef LPVOID( WINAPI  *newfunc)(T1);
    14.     newfunc func = (newfunc)GetProcAddress(hDll, FuncName);
    15.     auto result = func(a1);
    16.     return result;
    17. }
    18. template <class T1,class T2>
    19. inline auto FuncFromDll(const char* FuncName, HINSTANCE hDll, T1 a1,T2 a2)
    20. {
    21.     typedef LPVOID(WINAPI *newfunc)(T1, T2);
    22.     newfunc func = (newfunc)GetProcAddress(hDll, FuncName);
    23.     auto result = func(a1, a2);
    24.     return result;
    25. }

    А хотелось бы воедино связать (WPF) + (C++) + (Fasm), но увы пока не получается связать даже WPF с С# :).
     
  2. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Да. У меня примерно такой же код, т.е. для каждого к-тва параметров отдельный темплейт. Но повторюсь, я не шарю в С++, мб есть более элегантное решение.
     
    Последнее редактирование модератором: 22 фев 2019
  3. Quasar3с48

    Quasar3с48 New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2019
    Сообщения:
    3
    CrawlUp, почитай про variadic template c++, можно написать легкий аналог std::function, который будет инциализироваться указателем на функцию и выставлять через шаблоны колличество и тип параметров.
     
  4. 9600bps

    9600bps New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2019
    Сообщения:
    1
    Прошу прощения, что вмешиваюсь, но используемый способ с вызовом внутри хелпер функции возможен, но можно поступить проще.
    А именно:

    Код (C++):
    1. template <typename SymbolPtr>
    2. SymbolPtr GetExportedSymbolNoThrow(HMODULE module, const char* name)
    3. {
    4.     assert(nullptr != module);
    5.     assert(nullptr != name);
    6.     return reinterpret_cast<SymbolPtr>(GetProcAddress(module, name));
    7. }
    8.  
    9. template <typename SymbolPtr>
    10. SymbolPtr GetExportedSymbol(HMODULE module, const char* name)
    11. {
    12.     const auto ptr = GetExportedSymbolNoThrow<SymbolPtr>(module, name);
    13.     if (nullptr == ptr)
    14.     {
    15.         std::ostringstream message;
    16.         message << "Could not locate " << name << " in handle " << module;
    17.         throw std::runtime_error(message.str());
    18.     }
    19.  
    20.     return ptr;
    21. }
    22.  
    23. //// How to use //////////////////////////////////////////////////////////////////////////////
    24.  
    25. typedef NTSTATUS (*NtWaitForSingleObjectPtr)(
    26.   IN HANDLE         Handle,
    27.   IN BOOLEAN        Alertable,
    28.   IN PLARGE_INTEGER Timeout
    29. );
    30.  
    31. void HowToUse()
    32. {
    33.     // GetExportedSymbolNoThrow
    34.     const auto ptr = GetExportedSymbolNoThrow<NtWaitForSingleObjectPtr>(GetModuleHandleA("ntdll.dll"), "NtWaitForSingleObject");
    35.     if (ptr)
    36.     {
    37.         LARGE_INTEGER zero = {};
    38.         NTSTATUS status = ptr(anHandle, FALSE, &zero);
    39.     }
    40.  
    41.     // GetExportedSymbol
    42.     LARGE_INTEGER zero = {};
    43.     NTSTATUS status = GetExportedSymbol<NtWaitForSingleObjectPtr>(GetModuleHandleA("ntdll.dll"), "NtWaitForSingleObject")(anHandle, FALSE, &zero);
    44. }
    45.