Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 10:59   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию Не получается найти функцию в dll

Приветствую! dll загружается, но функцию найти не получается.

Работаю в Visual C++ 2008 Express Edition

Пример взят отсюда: http://wasm.ru/article.php?article=1001017

main.c
Код:
#include <windows.h>
#include <tchar.h>

LPCTSTR LibName = _T("DLLSkeleton.dll");
LPCSTR FunctionName = "TestHello";
LPCTSTR DllNotFound = _T("Cannot load library");
LPCTSTR AppName = _T("Load Library");
LPCTSTR FunctionNotFound = _T("TestHello function not found");

HMODULE hLib;
FARPROC TestHelloAddr;
void (*TestHello)(void);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    hLib = LoadLibrary(LibName);
    if (hLib == NULL) {
        MessageBox(NULL, DllNotFound, AppName, MB_OK);
        return FALSE;
    }

    TestHelloAddr = GetProcAddress(hLib, FunctionName);
    if (TestHelloAddr == NULL) {
        MessageBox(NULL, FunctionNotFound, AppName, MB_OK);
        return FALSE;
    }

    (FARPROC)TestHello = TestHelloAddr;

    (*TestHello)();

    FreeLibrary(hLib);

    return TRUE;
}
DLLSkeleton.dll:
Код:
#include <windows.h>
#include <tchar.h>

void TestHello(void);

LPCTSTR AppName = _T("DLL Skeleton");
LPCTSTR HelloMsg = _T("Hello, you're calling a function in this DLL");
LPCTSTR LoadMsg = _T("The DLL is loaded");
LPCTSTR UnloadMsg = _T("The DLL is unloaded");
LPCTSTR ThreadCreated = _T("A thread is created in this process");
LPCTSTR ThreadDestroyed = _T("A thread is destroyed in this process");

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, LoadMsg, AppName, MB_OK);
        break;
    case DLL_THREAD_ATTACH:
        MessageBox(NULL, UnloadMsg, AppName, MB_OK);
	    break;
    case DLL_THREAD_DETACH:
        MessageBox(NULL, ThreadCreated, AppName, MB_OK);
        break;
    case DLL_PROCESS_DETACH:
        MessageBox(NULL, ThreadDestroyed, AppName, MB_OK);
        break;
    }

    return TRUE;
}

void TestHello(void)
{
    MessageBox(NULL, HelloMsg, AppName, MB_OK);

    return;
}

Последний раз редактировалось 8Observer8; 01.06.2012 в 11:04.
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 03:02   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Имя твоей функции по всей видимости "декорированно".
Чтобы экпортировать имя функции в Длл без декорации, нужно создать EXPORT файл.
PS. Ты всегда можешь проверить таблицу экспорта длл-ины с помощью
http://www.dependencywalker.com/
rlib вне форума Ответить с цитированием
Старый 02.06.2012, 05:53   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Экспорт-файл это файл .lib? Я правильно понимаю? А как его создать?

У меня инициализация указателя на функцию неправильная.

Вместо:
Код:
(FARPROC)TestHello = TestHelloAddr;
Нужно:
Код:
TestHello = (void(*)(void))TestHelloAddr;

Последний раз редактировалось 8Observer8; 02.06.2012 в 11:28.
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 22:11   #4
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Можно почитать здесь:
http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx
rlib вне форума Ответить с цитированием
Старый 02.06.2012, 22:54   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

rlib, большое спасибо!

При создании dll (в файле "DLLSkeleton.dll") вместо:

Код:
void TestHello(void);
нужно:
Код:
__declspec(dllexport) void __cdecl TestHello(void);
P.S. Exporting from a DLL Using __declspec(dllexport) --> http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx

Последний раз редактировалось 8Observer8; 02.06.2012 в 23:17.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Як вызвать функцию из dll в C# ? Dr.Pauliss Помощь студентам 5 26.09.2011 12:42
Не получается вызвать функцию! Ce4kok Общие вопросы Delphi 5 25.05.2011 22:27
Не получается найти решение san050 Помощь студентам 7 24.11.2010 12:26
Не получается протабулировать функцию(Basic C++). sawer5 Общие вопросы C/C++ 4 28.11.2009 12:35
Помогите написать функцию плиз.Не получается Clockgen Microsoft Office Excel 2 14.12.2008 22:01