Отлично, ваш вариант помог отвязаться от типа параметра, отвязаться от количества параметров, видимо можно только перегрузкой. Спойлер: Код С++ Код (Text): //Перегруженные функции для вызова любой функции из библиотеки inline auto FuncFromDll(const char* FuncName, HINSTANCE hDll) { typedef LPVOID(WINAPI *newfunc)(); newfunc func = (newfunc)GetProcAddress(hDll, FuncName); auto result = func(); return result; } template <class T1> inline auto FuncFromDll(const char* FuncName,HINSTANCE hDll,T1 a1) { typedef LPVOID( WINAPI *newfunc)(T1); newfunc func = (newfunc)GetProcAddress(hDll, FuncName); auto result = func(a1); return result; } template <class T1,class T2> inline auto FuncFromDll(const char* FuncName, HINSTANCE hDll, T1 a1,T2 a2) { typedef LPVOID(WINAPI *newfunc)(T1, T2); newfunc func = (newfunc)GetProcAddress(hDll, FuncName); auto result = func(a1, a2); return result; } А хотелось бы воедино связать (WPF) + (C++) + (Fasm), но увы пока не получается связать даже WPF с С# .
Да. У меня примерно такой же код, т.е. для каждого к-тва параметров отдельный темплейт. Но повторюсь, я не шарю в С++, мб есть более элегантное решение.
CrawlUp, почитай про variadic template c++, можно написать легкий аналог std::function, который будет инциализироваться указателем на функцию и выставлять через шаблоны колличество и тип параметров.
Прошу прощения, что вмешиваюсь, но используемый способ с вызовом внутри хелпер функции возможен, но можно поступить проще. А именно: Код (C++): template <typename SymbolPtr> SymbolPtr GetExportedSymbolNoThrow(HMODULE module, const char* name) { assert(nullptr != module); assert(nullptr != name); return reinterpret_cast<SymbolPtr>(GetProcAddress(module, name)); } template <typename SymbolPtr> SymbolPtr GetExportedSymbol(HMODULE module, const char* name) { const auto ptr = GetExportedSymbolNoThrow<SymbolPtr>(module, name); if (nullptr == ptr) { std::ostringstream message; message << "Could not locate " << name << " in handle " << module; throw std::runtime_error(message.str()); } return ptr; } //// How to use ////////////////////////////////////////////////////////////////////////////// typedef NTSTATUS (*NtWaitForSingleObjectPtr)( IN HANDLE Handle, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout ); void HowToUse() { // GetExportedSymbolNoThrow const auto ptr = GetExportedSymbolNoThrow<NtWaitForSingleObjectPtr>(GetModuleHandleA("ntdll.dll"), "NtWaitForSingleObject"); if (ptr) { LARGE_INTEGER zero = {}; NTSTATUS status = ptr(anHandle, FALSE, &zero); } // GetExportedSymbol LARGE_INTEGER zero = {}; NTSTATUS status = GetExportedSymbol<NtWaitForSingleObjectPtr>(GetModuleHandleA("ntdll.dll"), "NtWaitForSingleObject")(anHandle, FALSE, &zero); }