GetProcAddress - не пойму
GetProcAddress делаю как в примере MSDN ничего не помогает вылазит ошибка:
Код:
main.cpp(14): error C2197: 'MYPROC' : too many arguments for call through pointer-to-function
вот выкладываю сам код:
Код:
#include "windows.h"
typedef VOID (*MYPROC)(LPTSTR);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MYPROC ProcAdd;
ProcAdd = (MYPROC) GetProcAddress(LoadLibrary(TEXT("urlmon.dll")), "URLDownloadToFileA");
if (ProcAdd!=NULL)
{
//beep(100,100);
(ProcAdd)(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
}
//GetProcAddress(LoadLibrary("urlmon.dll"),"URLDownloadToFile");
//if (pFunction!=NULL)
//{
// pFunction(NULL,"http://microsoft.com/","C:\\123.htm",NULL,NULL);
//}
return 0;
}
typedef VOID (*MYPROC)(LPTSTR);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MYPROC ProcAdd;
ProcAdd = (MYPROC) GetProcAddress(LoadLibrary(TEXT("urlmon.dll")), "URLDownloadToFileA");
if (ProcAdd!=NULL)
{
//beep(100,100);
(ProcAdd)(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
}
//GetProcAddress(LoadLibrary("urlmon.dll"),"URLDownloadToFile");
//if (pFunction!=NULL)
//{
// pFunction(NULL,"http://microsoft.com/","C:\\123.htm",NULL,NULL);
//}
return 0;
}
Заранее спасибо за ответ....
Код:
typedef VOID (*MYPROC)(LPTSTR);
/*
...
*/
MYPROC ProcAdd;
/*
...
*/
ProcAdd(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
/*
...
*/
MYPROC ProcAdd;
/*
...
*/
ProcAdd(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
разницу видешь ты содал указатель на функцию с одним параметром а потом пытаешься передать ей пять параметров
ошибка говорит сама за себя
должно быть так если исходить из MSDN
Код:
typedef VOID (*MYPROC)(LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD , LPBINDSTATUSCALLBACK);
/*
...
*/
MYPROC ProcAdd;
/*
...
*/
ProcAdd(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
/*
...
*/
MYPROC ProcAdd;
/*
...
*/
ProcAdd(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
да и загрузив библиотеку выгрузи её
вот что получилсь
Код:
#include "windows.h"
typedef VOID (*MYPROC)(LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD , LPBINDSTATUSCALLBACK);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MYPROC ProcAdd;
HMODULE Lib = LoadLibrary(TEXT("urlmon.dll"));
if(Lib!=NULL)
{
ProcAdd = (MYPROC) GetProcAddress(Lib, "URLDownloadToFileA");
if (ProcAdd!=NULL)
{
//beep(100,100);
(ProcAdd)(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
}
FreeLibrary(Lib);
}
return 0;
}
typedef VOID (*MYPROC)(LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD , LPBINDSTATUSCALLBACK);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MYPROC ProcAdd;
HMODULE Lib = LoadLibrary(TEXT("urlmon.dll"));
if(Lib!=NULL)
{
ProcAdd = (MYPROC) GetProcAddress(Lib, "URLDownloadToFileA");
if (ProcAdd!=NULL)
{
//beep(100,100);
(ProcAdd)(NULL,"http://microsoft.com","C:\\123.htm",NULL,NULL);
}
FreeLibrary(Lib);
}
return 0;
}
при компиляции все ок. при запуске программы выскакивает ошибка в exe, причем после того как уже файл закачан.........
не понятно в чем причина, ведь я зделал выгрузку библиотеки как и гвоорили мне.....
может быть я не правильно выгружаю dll?
не просто не правильная сигнатура функции на которую ссылается указатель и поэтому у тебя была ошибка указателя стека
Код:
typedef HRESULT (__stdcall*MYPROC)(LPUNKNOWN, LPCSTR, LPCSTR, DWORD, LPBINDSTATUSCALLBACK);
int main(int argc, char* argv[])
{
MYPROC ProcAdd(NULL);
HMODULE hLib = LoadLibrary(TEXT("urlmon.dll"));
HRESULT hr (0);
if (hLib)
{
ProcAdd = (MYPROC) GetProcAddress(hLib, "URLDownloadToFileA");
if (ProcAdd) hr = ProcAdd(NULL, "http://www.google.com", "C:\\123.htm", 0, NULL);
FreeLibrary(hLib);
}
return hr;
}
int main(int argc, char* argv[])
{
MYPROC ProcAdd(NULL);
HMODULE hLib = LoadLibrary(TEXT("urlmon.dll"));
HRESULT hr (0);
if (hLib)
{
ProcAdd = (MYPROC) GetProcAddress(hLib, "URLDownloadToFileA");
if (ProcAdd) hr = ProcAdd(NULL, "http://www.google.com", "C:\\123.htm", 0, NULL);
FreeLibrary(hLib);
}
return hr;
}
так все корректно
вот размер только получился 22кб уменьшить бы как нить до 4-5 было бы здорово.... где бы почитать чего по этому вопросу
Цитата: 22b
ой спасибо вам!!!!!!
вот размер только получился 22кб уменьшить бы как нить до 4-5 было бы здорово.... где бы почитать чего по этому вопросу
вот размер только получился 22кб уменьшить бы как нить до 4-5 было бы здорово.... где бы почитать чего по этому вопросу
Выставляем в свойствах линкера:
Ignore All Default Libraries - YES
Generate Debug Info - NO
Entry Point - main
При этом будет собираться только в релизе, для того чтобы и в дебаге собиралось необходимо поиграться еще с отключением всяких различных дебажных ран-тайм проверок.
У меня под 2005 студией получается ровно 2кб. И я считаю что многовато... можно бы еще поиграться с объединением секций...
P.S. Вот вам, приверженцы АСМа приложение под Win32, написанное на VisualC++ и при этом занимает 2 кб., в которых все равно еще куча свободного места.