صدا زدن توابع api به وسیله تابعی با تعداد پارامترناحدود! - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

صدا زدن توابع api به وسیله تابعی با تعداد پارامترناحدود!

0 امتیاز

سلام 

متاسفانه عنوان بهتری به ذهنم نرسید.

 

یه تابع دارم که مثل printf تعداد نامعلومی ارگومان داره (مثلا برای printf میدونم چطوری بنویسم) و مشکل اینه که داخل این تابع برحسب نیاز باید این تعداد ارگومانها رو به ترتیب به یه API پاس بدم! و این مشکل منه !
 

* میتونم تموم این پارامترها رو توی stack تابع push کنم و بعد call اما این کار برای 32بیت به خوبی کار میکنه و در 64بیت به خاطر calling convention متفاوت کار نمیکنه . دنبال یه راه جنریک هستم،

مثال:

PVOID Win32_API_Caller(PVOID function_Ptr, UINT ArgCount, ...)
{
	// should be --> return MessageBoxA( 0,  "message", "title", MB_OK);
	
}

 // Call it
 Win32_API_Caller(&MessageBoxA,4, 0,  "message", "title", MB_OK);

 

سوال شده شهریور 21, 1394  بوسیله ی R0b3rtX99 (امتیاز 46)   5 9

1 پاسخ

0 امتیاز
 
بهترین پاسخ
template <typename T,typename... Args>
auto Win32_API_Caller(T fn_Ptr, Args&& ... Arguments)
{
	return fn_Ptr(std::forward<Args>(Arguments)...) ;
}

int main()
{

	typedef int(_stdcall *PMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT);

	PMessageBox _MessageBox = PMessageBox(::GetProcAddress(::GetModuleHandle(_T("user32.dll")), "MessageBoxW"));

	Win32_API_Caller(_MessageBox,HWND(nullptr),_T( "hello"), _T("title"), MB_OK);

}

 

پاسخ داده شده شهریور 22, 1394 بوسیله ی R0b3rtX99 (امتیاز 46)   5 9
...