Форум программистов, компьютерный форум CyberForum.ru

LoadLibrary - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.93
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 09:36     LoadLibrary #1
Здравствуйте
Нужно подгрузить мою .dll в память.

C++
1
2
3
#include <windows.h>
 
HMODULE myDLL = LoadLibraryA("my.dll");
не компилится (error LNK1120: 1 неразрешенных внешних элементов)
подскажите как исправить. новичек
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2011, 09:36     LoadLibrary
Посмотрите здесь:

LoadLibrary() не возвращает хэндл Visual C++
LoadLibrary() C++
Delphi [Dll] Выполнение кода при LoadLibrary
LoadLibrary, error 997(Overlapped I/O operation is in progress)
[Решено] LoadLibrary C++ Qt
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
20.07.2011, 12:09     LoadLibrary #21
Цитата Сообщение от noob c++ Посмотреть сообщение
я создаю консольное приложение Win32 (пустое) и пишу в нем.
Это ты теперь создал консольное, до этого было GUI.
Но и тут ты просчитался, теперь ты создаешь Unicode а нужно ANSI.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 12:12  [ТС]     LoadLibrary #22
Цитата Сообщение от lazybiz Посмотреть сообщение
Это ты теперь создал консольное, до этого было GUI.
Но и тут ты просчитался, теперь ты создаешь Unicode а нужно ANSI.
А где это выбирается в VS ?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
20.07.2011, 12:15     LoadLibrary #23
Цитата Сообщение от noob c++ Посмотреть сообщение
Консольное приложение Win32 или Консольное приложение CLR ?
Win32
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
20.07.2011, 12:19     LoadLibrary #24
Цитата Сообщение от noob c++ Посмотреть сообщение
1>c:\users\admin\documents\visual studio 2010\projects\mydll2\mydll2\mydll2.cpp(6): error C2664: LoadLibraryW: невозможно преобразовать параметр 1 из "const char [7]" в "LPCWSTR"
C++
1
2
3
4
5
6
#include <windows.h>
 int main()
{
        HMODULE myDLL = LoadLibrary(L"my.dll");
        return 0;
}
Читай MSDN и пытайся хоть немного думать самостоятельно. Такие ошибки программист обязан уметь самостоятельно исправлять, тем более компилятор _явно_ указал в чем проблема
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 12:27  [ТС]     LoadLibrary #25
Цитата Сообщение от Dejust Посмотреть сообщение
Читай MSDN и пытайся хоть немного думать самостоятельно. Такие ошибки программист обязан уметь самостоятельно исправлять, тем более компилятор _явно_ указал в чем проблема
Может быть вам с первого взгляда все понятно. Я читаю книги и первым делом заглянул на MSDN прежде чем писать сам код. Не подскажете в чем сейчас проблема ? Создал все как писали выше, добавил код из вашего поста:

C++
1
2
3
4
5
6
#include <windows.h>
 int main()
{
        HMODULE myDLL = LoadLibrary(L"my.dll");
        return 0;
}
Код
1>------ Построение начато: проект: mydll3, Конфигурация: Debug Win32 ------
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>c:\users\admin\documents\visual studio 2010\Projects\mydll3\Debug\mydll3.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
20.07.2011, 12:33     LoadLibrary #26
Ок. Возьми тот код который скомпилировался с ошибкой преобразования (в LPCWSTR) и добавь L перед строчкой

Мой код работает под обычное консольное приложение: Проект->Консольное приложение WIN 32 (В настройках "Консольное приложение" и "Пустой проект"

PS Не разрешенный внешний символ, как я понимаю, это такая функция которая _должна быть_ определена, но на момент компиляции этого сделано не было. В твоем случае это функция main, в зависимости от типа проекта у нее может быть разное имя (main, WinMain, ...)
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 13:15  [ТС]     LoadLibrary #27
Цитата Сообщение от Dejust Посмотреть сообщение
Мой код работает под обычное консольное приложение: Проект->Консольное приложение WIN 32 (В настройках "Консольное приложение" и "Пустой проект"
В том то и дело что я Создаю все именно так: Проект->Консольное приложение WIN 32 (В настройках "Консольное приложение" и "Пустой проект". Создаю в проекте файл .cpp и пишу в него ваш код:
C++
1
2
3
4
5
6
7
#include <windows.h>
 
int main()
{
        HMODULE myDLL = LoadLibrary(L"my.dll");
        return 0;
}
При компиляции вылетает ошибка:
Код
1>------ Построение начато: проект: mydll4, Конфигурация: Debug Win32 ------
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>c:\users\admin\documents\visual studio 2010\Projects\mydll4\Debug\mydll4.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
У всех код компилируется, а у меня нет. Подобно как и с книгами - прочитаешь глав 5 и решаешь создать какое-то приложение. Пишешь код, а он не компилится. Смотришь в книге - все правильно! Но компилятор не хочет это принимать, т.к. в книге все по старому. Хоть 2008 не качай или билдер вообще
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
20.07.2011, 13:18     LoadLibrary #28
ради интереса пробовал указывать полный путь к dll'ке?
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
20.07.2011, 13:19     LoadLibrary #29
В Windows есть две версии стандартных библиотек - для ansi и для юникода
У Вас выбран сейчас юникод, поэтому нужно определить не функцию main, а функцию wmain
Вообще в таких случаях лучше писать

C++
1
2
3
4
5
6
7
#include <windows.h>
#include <tchar.h>
void _tmain()
{
     HMODULE hModule = LoadLibrary(_T("my.dll"));
     return 0;
}
Здесь макрос _tmain подставит нужную версию main, а _T() - нужный вид строки
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 13:44  [ТС]     LoadLibrary #30
попробовал код выше:
C++
1
2
3
4
5
6
7
8
#include <windows.h>
#include <tchar.h>
 
void _tmain()
{
     HMODULE hModule = LoadLibrary(_T("my.dll"));
     return 0;
}
Код
1>------ Построение начато: проект: mydll4, Конфигурация: Debug Win32 ------
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>C:\Users\admin\documents\visual studio 2010\Projects\mydll4\Debug\mydll4.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Добавлено через 20 минут
Цитата Сообщение от Paporotnik Посмотреть сообщение
ради интереса пробовал указывать полный путь к dll'ке?
ради интереса создал пустую длл'ку и закинул ее в каталог с проектом:
C:\Users\admin\documents\visual studio 2010\Projects\mydll4\

Написал так:
C++
1
2
3
4
5
6
7
8
#include <windows.h>
#include <tchar.h>
 
void _tmain()
{
     HMODULE hModule = LoadLibrary(_T("C:\Users\admin\documents\visual studio 2010\Projects\mydll4\my.dll"));
     return 0;
}
Та же ошибка:
Код
1>------ Построение начато: проект: mydll4, Конфигурация: Debug Win32 ------
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>C:\Users\admin\documents\visual studio 2010\Projects\mydll4\Debug\mydll4.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
20.07.2011, 13:54     LoadLibrary #31
noob c++, проблема не в подключении DLL, а в том что у тебя каким-то образом компоновщик не видит входную (main) функцию, хотя ты ее определил.

Попробуй поискать (первая ссылка с топиком о такой же проблеме). Тут к сожалению нельзя кидать ссылки на другие форумы
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 14:15  [ТС]     LoadLibrary #32
Пробежался по всем линкам и понял одно - лучше затереть 2010 и не парится. 2008 скачаю
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
20.07.2011, 14:20     LoadLibrary #33
2010 - зло. Но проблема, думаю, не в студии.
Проект какой - console или win32?
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 14:41  [ТС]     LoadLibrary #34
Консольное win32
В VS 2010 так и написано
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
20.07.2011, 14:50     LoadLibrary #35
у меня в 2010 студии всё работает
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    HMODULE myDLL = LoadLibraryA("D:\\bass.dll");
    if (!myDLL) {
        puts("error loading dll.");
    }
    else {
        puts("loaded.");
    }
 
    getchar();
    return 0;
}
loaded. пишет при валидной дллке.
Melzas
 Аватар для Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
20.07.2011, 14:55     LoadLibrary #36
Странно, что у вас не компилируется. Попробуйте с WinMain написать:
C++
1
2
3
4
5
6
#include <Windows.h>
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HMODULE hModule=LoadLibrary(L"my.dll");
    return 0;
}
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 15:03  [ТС]     LoadLibrary #37
Цитата Сообщение от OstapBender Посмотреть сообщение
у меня в 2010 студии всё работает
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    HMODULE myDLL = LoadLibraryA("D:\\bass.dll");
    if (!myDLL) {
        puts("error loading dll.");
    }
    else {
        puts("loaded.");
    }
 
    getchar();
    return 0;
}
loaded. пишет при валидной дллке.
Тоесть проблема в моем коде. Если мой не правильный, то немогли бы вы прокоментировать свой (что и зачем добавляете), очень хочется разобраться. Буду вам признателен.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
20.07.2011, 15:09     LoadLibrary #38
Попробуйте создать с нуля консольный проект hello, world, все настройки по умолчанию.
Убедитесь, что он компилируется и запускается.
Потом попробуйте мой код из постов выше.
Такое впечатление, что некорректны настройки проекта
Akvarium
2 / 2 / 0
Регистрация: 17.07.2011
Сообщений: 20
20.07.2011, 15:12     LoadLibrary #39
noob c++, попробуй еще измени тут параметр (когда был глюк что ничего не компилилось, помогло. Этот же параметр дает возможность запуска проги на другом компе):
Проект->Свойства->Свойства конфигурации->C/C++->Создание кода->Многопоточная отладка (/MTd).
Как на англ. не знаю...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 16:43     LoadLibrary
Еще ссылки по теме:

Matlab Простейший DLL на С и его loadlibrary in matlab
Assembler Invoke + GetProcAddress & LoadLibrary

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
noob c++
 Аватар для noob c++
3 / 3 / 0
Регистрация: 11.07.2011
Сообщений: 49
20.07.2011, 16:43  [ТС]     LoadLibrary #40
Цитата Сообщение от Melzas Посмотреть сообщение
Странно, что у вас не компилируется. Попробуйте с WinMain написать:
C++
1
2
3
4
5
6
#include <Windows.h>
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HMODULE hModule=LoadLibrary(L"my.dll");
    return 0;
}
Прокоментируйте пожалуйста свой код. Много там всего того что я не знаю. Очень интересно. Спасибо

Добавлено через 4 минуты
p.s. завтра утром попробую все варианты предложенные выше и отпишусь.
Всем спасибо за помощь
Yandex
Объявления
20.07.2011, 16:43     LoadLibrary
Ответ Создать тему
Опции темы

Текущее время: 06:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru