Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

GetProcAddress - не пойму

18K
09 февраля 2007 года
22b
16 / / 09.02.2007
Добрый день не могу разобрасться с ф-ей
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;
}


Заранее спасибо за ответ....
5.9K
09 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
 
Код:
typedef VOID (*MYPROC)(LPTSTR);
/*
...
*/
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);
5.9K
09 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
да и загрузив библиотеку выгрузи её
18K
09 февраля 2007 года
22b
16 / / 09.02.2007
Переписал ф-ю
вот что получилсь
Код:
#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;
}

при компиляции все ок. при запуске программы выскакивает ошибка в exe, причем после того как уже файл закачан.........

не понятно в чем причина, ведь я зделал выгрузку библиотеки как и гвоорили мне.....
18K
09 февраля 2007 года
22b
16 / / 09.02.2007
может быть я не правильно выгружаю dll?
5.9K
09 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
ох не досмотрел MSDN
не просто не правильная сигнатура функции на которую ссылается указатель и поэтому у тебя была ошибка указателя стека


Код:
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;
}

так все корректно
18K
09 февраля 2007 года
22b
16 / / 09.02.2007
ой спасибо вам!!!!!!

вот размер только получился 22кб уменьшить бы как нить до 4-5 было бы здорово.... где бы почитать чего по этому вопросу
395
12 февраля 2007 года
RelB
367 / / 09.11.2002
Цитата: 22b
ой спасибо вам!!!!!!

вот размер только получился 22кб уменьшить бы как нить до 4-5 было бы здорово.... где бы почитать чего по этому вопросу

Выставляем в свойствах линкера:
Ignore All Default Libraries - YES
Generate Debug Info - NO
Entry Point - main

При этом будет собираться только в релизе, для того чтобы и в дебаге собиралось необходимо поиграться еще с отключением всяких различных дебажных ран-тайм проверок.

У меня под 2005 студией получается ровно 2кб. И я считаю что многовато... можно бы еще поиграться с объединением секций...

P.S. Вот вам, приверженцы АСМа приложение под Win32, написанное на VisualC++ и при этом занимает 2 кб., в которых все равно еще куча свободного места.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог