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

LoadLibrary() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.71
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
23.05.2011, 04:09     LoadLibrary() #1
Вызываю LoadLibrary() (файл dll4.dll лежит в каталоге экзешника)
C++
1
HMODULE hdll1 = LoadLibraryA("dll4.dll");
по getlasterror получаю ошибку - 14001 = Приложение не было запущено, поскольку оно некорректно настроено. Повторная установка приложения может решить данную проблему.

или так вызываю
C++
1
2
LPCWSTR pbuft = _T("C:\Documents and Settings\er\Мои документы\Visual Studio 2010\Projects\loaddll4\Debug\dll4.dll");
HMODULE hdll1 = LoadLibrary("pbuft");
по getlasterror получаю ошибку 126 = Не найден указанный модуль.
по моему дело в unicode.
я пишу в ms vs ultimate 2010
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2011, 04:09     LoadLibrary()
Посмотрите здесь:

LoadLibrary() не возвращает хэндл Visual C++
C++ LoadLibrary
Delphi [Dll] Выполнение кода при LoadLibrary
LoadLibrary, error 997(Overlapped I/O operation is in progress)
[Решено] LoadLibrary C++ Qt
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
23.05.2011, 08:53     LoadLibrary() #2
LPCWSTR pbuft = _T("C:\\Documents and Settings\\er\\Мои документы\\Visual Studio 2010\\Projects\\loaddll4\\Debug\\dll4.dll");
HMODULE hdll1 = LoadLibrary(pbuft);

помойму всё делается вот так


а ещё про первую запись забыл сказать когда компилируешь из среды все файлы которых должны запускаться вместе с exe должны лежать вот в этой папке
C:\Documents and Settings\er\Мои документы\Visual Studio 2010\Projects\loaddll4\loaddll4\dll4.dll
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
23.05.2011, 09:16  [ТС]     LoadLibrary() #3
результат такой же
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
23.05.2011, 12:55     LoadLibrary() #4
тогда попробуй положить файл рядом с екзе и запусти екзе двумя кликами
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
24.05.2011, 00:27  [ТС]     LoadLibrary() #5
ничего не получается.
Digit@ll
Brainsbreaker
 Аватар для Digit@ll
832 / 343 / 27
Регистрация: 01.02.2011
Сообщений: 1,483
24.05.2011, 01:47     LoadLibrary() #6
А что это за dll? Выложи ее где-нибудь, чтоб посмотреть.
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
24.05.2011, 02:26  [ТС]     LoadLibrary() #7
простая dll
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "winnt.h"
#include "windows.h"
#include "stdio.h"
 
 
 
    extern "C" __declspec (dllexport) void dllfunc1()
{
    char buf [128];
    sprintf(buf, "Test", 0);
    MessageBoxA(NULL, buf, "Information", 0);
}
Digit@ll
Brainsbreaker
 Аватар для Digit@ll
832 / 343 / 27
Регистрация: 01.02.2011
Сообщений: 1,483
24.05.2011, 07:32     LoadLibrary() #8
MSVS 2008: компилится, грузится, только ничего не выводит.
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
24.05.2011, 08:23  [ТС]     LoadLibrary() #9
какой проект ты создавал
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 13:04     LoadLibrary() #10
Рабочая директория и директория ехе-файла в MSVC по умолчанию не совпадают. На вкладке Debug пропиши рабочую директорию туда же, куда и ехе-файл.

Добавлено через 36 секунд
Цитата Сообщение от korez Посмотреть сообщение
#include "stdafx.h" #include "winnt.h" #include "windows.h" #include "stdio.h" extern "C" __declspec (dllexport) void dllfunc1() { char buf [128]; sprintf(buf, "Test", 0); MessageBoxA(NULL, buf, "Information", 0); }
ОМГ! ЭТО не DLL.
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
24.05.2011, 14:27     LoadLibrary() #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
ОМГ! ЭТО не DLL.
+1

Цитата Сообщение от korez Посмотреть сообщение
простая dll
Вот почитайте о Dynamic-Link Library Entry-Point Function
Digit@ll
Brainsbreaker
 Аватар для Digit@ll
832 / 343 / 27
Регистрация: 01.02.2011
Сообщений: 1,483
24.05.2011, 15:46     LoadLibrary() #12
Цитата Сообщение от korez Посмотреть сообщение
какой проект ты создавал
Консольная dll.

Так а что это вообще за шняга? О_о

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "winnt.h"
#include "windows.h"
#include "stdio.h"
 
 
 
        extern "C" __declspec (dllexport) void dllfunc1()
{
        char buf [128];
        sprintf(buf, "Test", 0);
        MessageBoxA(NULL, buf, "Information", 0);
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 15:49     LoadLibrary() #13
Это шняга, да.
У тебя нет точки входа. DllMain, например.
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
25.05.2011, 10:39  [ТС]     LoadLibrary() #14
компилятор dllmain создает автоматически или как

Добавлено через 2 часа 13 минут
вот так тоже ничего не входит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// dll4.cpp: определяет экспортированные функции для приложения DLL.
//
 
#include "stdafx.h"
#include "winnt.h"
#include "windows.h"
#include "stdio.h"
//#include "incl.h"
 
    BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)  
{
    switch(dwReason)
    {
        case DLL_PROCESS_ATTACH:
        break;
        case DLL_PROCESS_DETACH:
        break;
        case DLL_THREAD_ATTACH:
        break;
        case DLL_THREAD_DETACH:
        break;
    }
}
 
    extern "C" __declspec (dllexport) void dllfunc1()
{
    char buf [128];
    sprintf(buf, "Test", 0);
    MessageBoxA(NULL, buf, "Information", 0);
}
я вот так пытаюсь скомпилировать он мне даже говорит что
1>C:\Documents and Settings\er\Мои документы\Visual Studio 2010\Projects\dllt1\Debug\dllt1.dll : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>
то есть dllmain уже определена (если ее убрать все скомпилируется)
и компилировал я вот так консольное приложение - dll
Но там еще есть "пустой проект" и "экспорт символов" это зачем.
PB
Просто прогер
1277 / 1064 / 11
Регистрация: 13.03.2009
Сообщений: 2,502
25.05.2011, 16:15     LoadLibrary() #15
Попробуй вызвать DLL из вложения.
В ней одна функция dllfunc1 без аргументов. Формат вызова - stdcall.
Если ее нормально вызовет, то проблема в вашей DLL.
Отпишитесь о результатах.
Вложения
Тип файла: rar dll4.rar (1.3 Кб, 37 просмотров)
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
25.05.2011, 22:02  [ТС]     LoadLibrary() #16
вот так вызываю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "incl.h"
//#include <inclm.h>
 
void nulstruc(statep &struc1);
void rcoin(statep &struc1);
void crpost(statep &struc1);
void changename(statep &struc1);
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 
    //LPCWSTR pbuft = _T("C:\Documents and Settings\er\Мои документы\Visual Studio 2010\Projects\loaddll4\dll4.dll");
 
    char buft [50];
    HMODULE hdll1 = LoadLibraryA("dll4.dll");
    int er = GetLastError();
    sprintf(buft, "%d", er );
    MessageBoxA(NULL, buft, "information", MB_OK);
    //sprintf(buft, "%x", hdll1 );
    //MessageBoxA(NULL, buft, "information", MB_OK);
    FARPROC pdllfunc1 = GetProcAddress(hdll1, "dllfunc1");
    //sprintf(buft, "%x", pdllfunc1 );
    //MessageBoxA(NULL, buft, "information", MB_OK);
    (*pdllfunc1);
    FreeLibrary(hdll1);
 
    return 0;
}
ничего не происходит

Добавлено через 30 минут
PB, если вызываю твою getlasterror = 0, если свою то 127 -Не найдена указанная процедура.

Добавлено через 1 минуту
твоя dll весит 4,5 килобайт моя - 27 килобайт.
ты в чем пишешь и как создаешь проект
PB
Просто прогер
1277 / 1064 / 11
Регистрация: 13.03.2009
Сообщений: 2,502
25.05.2011, 22:16     LoadLibrary() #17
Цитата Сообщение от korez Посмотреть сообщение
PB, если вызываю твою getlasterror = 0, если свою то 127 -Не найдена указанная процедура.
Значит что-то не так в коде твоей dll.

Цитата Сообщение от korez Посмотреть сообщение
твоя dll весит 4,5 килобайт моя - 27 килобайт.
ты в чем пишешь и как создаешь проект
Моя dll на бейсике (PureBasic).
Ее исходник.
Код
ProcedureDLL dllfunc1()
  MessageRequester("Information", "Test")
EndProcedure
Digit@ll
Brainsbreaker
 Аватар для Digit@ll
832 / 343 / 27
Регистрация: 01.02.2011
Сообщений: 1,483
25.05.2011, 22:43     LoadLibrary() #18
А-ну попробуй эту (не архив):

dll4.dll.rar
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 13:26     LoadLibrary()
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
26.05.2011, 13:26  [ТС]     LoadLibrary() #19
Digit@ll, твоя работает но
твое сообщение Test выводится до getlasterror
getlasterror = 1400 = Недопустимый дескриптор окна. потом опять Test.

Добавлено через 5 часов 21 минуту
Digit@ll, в чем тф пишешь и как ты компилировал?
Yandex
Объявления
26.05.2011, 13:26     LoadLibrary()
Ответ Создать тему
Опции темы

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