Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подключение динамической библиотеки, как подключить динамическую библиотеку 
:(
    Опции темы
шарлотта
Дата 1.3.2017, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Здравствуйте! Нужно подключить динамическую библиотеку неявно и явно к программе в Visual 2008.
В динамической библиотеке в sort_mas_merge2.h файле указываю
#pragma once
#ifdef IS_CREATING_DLL
#define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllexport)
#else
#define IMPORT_EXPORT_TRIGER extern "C" __declspec(dllimport)
#endif
IMPORT_EXPORT_TRIGER void MergeSort(int *mas, int first, int last);

в файле sort_mas_merge2.сpp находятся 2 функции - слияния и сортировки слиянием.
Динамическая библиотека создается.

Когда подключаю неявно, пишу
#include "stdafx.h"
#include "sort_mas_merge2.h"
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
#pragma comment (lib, "sort_mas_merge2.lib")
и выдает ошибку
fatal error C1083: Не удается открыть файл include: sort_mas_merge2.h: No such file or directory.
Почему возникает эта ошибка и что сделать для ее исправления?

Когда подключаю явно, пишу
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>
using namespace std;
void (*fun) (int*, int, int);

в функции main
HMODULE h = LoadLibrary(TEXT("sort_mas_merge2.d ll"));
(FARPROC &) fun = GetProcAddress(h, "MergeSort");
if (h == NULL) {
puts ("Ошибка");
} else {
puts ("Библиотека подключена");
}
и потом
fun(mas, 0, n - 1);
FreeLibrary(h);
Выдает "Ошибка", т.е. подключения библиотеки не происходит.
Что нужно исправить?
Буду очень благодарна за помощь! 
PM MAIL   Вверх
vol4ek
Дата 1.3.2017, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



Цитата(шарлотта @ 1.3.2017,  18:00)

Когда подключаю неявно, пишу
#include "stdafx.h"
#include "sort_mas_merge2.h"
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
#pragma comment (lib, "sort_mas_merge2.lib")
и выдает ошибку
fatal error C1083: Не удается открыть файл include: sort_mas_merge2.h: No such file or directory.
Почему возникает эта ошибка и что сделать для ее исправления?

sort_mas_merge2.lib и sort_mas_merge2.h бросаете в папку проекта где .cpp и .h файлы?

Добавлено через 2 минуты и 3 секунды
Цитата(шарлотта @ 1.3.2017,  18:00)
Когда подключаю явно



положите dll в одну папку с exe

Добавлено через 3 минуты и 17 секунд
Цитата(шарлотта @ 1.3.2017,  18:00)
HMODULE h = LoadLibrary(TEXT("sort_mas_merge2.d ll"));

надеюсь это просто опечатка на форуме, а в коде все ок
PM MAIL ICQ   Вверх
шарлотта
Дата 1.3.2017, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Цитата

sort_mas_merge2.lib и sort_mas_merge2.h бросаете в папку проекта где .cpp и .h файлы?

Нет, динамическая библиотека находится в другой папке.
Цитата

положите dll в одну папку с exe

А возможно ли подключение, когда библиотека и проект находятся в разных папках?
Цитата

надеюсь это просто опечатка на форуме, а в коде все ок 

да, здесь все нормально
PM MAIL   Вверх
vol4ek
Дата 1.3.2017, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



Цитата(шарлотта @ 1.3.2017,  19:36)
А возможно ли подключение, когда библиотека и проект находятся в разных папках?

прописать полностью путь к dll. есть еще вариант с регистрацией dll в системе

Добавлено через 6 минут и 16 секунд
Цитата(шарлотта @ 1.3.2017,  19:36)
sort_mas_merge2.lib и sort_mas_merge2.h бросаете в папку проекта где .cpp и .h файлы?

вы меня не поняли наверное.
у Вас есть проект вашей dll. после компиляции получились файлы mydll.dll, mydll.lib, mydll.h
файлы mydll.lib и mydll.h скопируйте в папку проекта вашего приложения (туда, где лежат .cpp и .h файлы)
потом уже используйте
Код

#include "mydll.h"
#pragma comment (lib, "mydll.lib")


PM MAIL ICQ   Вверх
шарлотта
Дата 2.3.2017, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Цитата

прописать полностью путь к dll. есть еще вариант с регистрацией dll в системе

То есть в случае неявного подключения я должна в свойствах в Компоновщике указать Общие -Дополнительные каталоги библиотек - путь до dll и в Компоновщик -Ввод - Дополнительные зависимости - имя dll библиотеки?
Выдает ошибку fatal error LNK1107: недопустимый или поврежденный файл: не удается прочитать по 0x2F8

Цитата

у Вас есть проект вашей dll. после компиляции получились файлы mydll.dll, mydll.lib, mydll.h
файлы mydll.lib и mydll.h скопируйте в папку проекта вашего приложения (туда, где лежат .cpp и .h файлы)
потом уже используйте

Здесь тоже аналогичный вопрос,  возможно ли подключение, когда библиотека и проект находятся в разных папках?

Это сообщение отредактировал(а) шарлотта - 2.3.2017, 21:19
PM MAIL   Вверх
vol4ek
Дата 2.3.2017, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



Цитата(шарлотта @ 2.3.2017,  21:10)

То есть в случае неявного подключения я должна в свойствах в Компоновщике указать Общие -Дополнительные каталоги библиотек - путь до dll и в Компоновщик -Ввод - Дополнительные зависимости - имя dll библиотеки?
Выдает ошибку fatal error LNK1107: недопустимый или поврежденный файл: не удается прочитать по 0x2F8

нет. полный путь при явном подключении. при неявном либо dll находится в одной папке с exe который ее использует либо в путях поиска по умолчанию (переменная PATH в винде). также можете зарегистрировать dll в системе regsvr32 из консоли либо DllRegisterServer() из программы. Может есть еще какие-то способы но мне о них неизвестно
PM MAIL ICQ   Вверх
шарлотта
Дата 2.3.2017, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Да, не так написала. В случае явного подключения выдает такую ошибку
PM MAIL   Вверх
vol4ek
Дата 2.3.2017, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



вот что я имею ввиду полного пути к dll при явном подключении
Код

HISTANCE hlib = LoadLibrary("C:\\Project\\Debug\\MyDll.dll");

PM MAIL ICQ   Вверх
шарлотта
Дата 2.3.2017, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



В этом случае все равно выводит "Ошибка"
PM MAIL   Вверх
vol4ek
Дата 2.3.2017, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



интересно. дайте код dll и приложения

PM MAIL ICQ   Вверх
шарлотта
Дата 2.3.2017, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Это создание библиотеки

Это сообщение отредактировал(а) шарлотта - 10.3.2017, 17:12
PM MAIL   Вверх
шарлотта
Дата 2.3.2017, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Заголовочный файл

Это сообщение отредактировал(а) шарлотта - 10.3.2017, 17:12
PM MAIL   Вверх
шарлотта
Дата 2.3.2017, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Приложение, вызывающее библиотеку

Это сообщение отредактировал(а) шарлотта - 10.3.2017, 17:12
PM MAIL   Вверх
vol4ek
Дата 2.3.2017, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



открывайте .slh и смотрите

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  MergeShortDLL.rar 255,60 Kb
PM MAIL ICQ   Вверх
vol4ek
Дата 2.3.2017, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



явное подключение в папке Release dll и exe

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  usedll.rar 254,77 Kb
PM MAIL ICQ   Вверх
vol4ek
Дата 2.3.2017, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



неявное подключение

Добавлено через 3 минуты и 9 секунд
Код

//MergeShort.dll header file
#pragma once
extern "C" __declspec(dllexport)void MergeSort(int *mas, int first, int last);
extern "C" __declspec(dllexport)void Merge (int *mas, int first, int last);



Код

// DLL cpp file
#include <windows.h>
#include "MergeShort.h"

void MergeSort(int *mas, int first, int last)
{
  if (first < last) 
   {
        MergeSort(mas, first, (first + last) / 2);
        MergeSort(mas, (first + last) / 2 + 1, last);
        Merge(mas, first, last);
   }
}


void Merge (int *mas, int first, int last)
{
int middle, start, final, j, *suplem_mas;
    suplem_mas = new int[100];
    
        middle = (first + last) / 2;
        start = first;
        final = middle + 1; 
        for (j = first; j <= last; j++) 
        { 
            if ((start <= middle) && ((final > last) || (*(mas + start) < *(mas + final)))) 
            {
                *(suplem_mas + j) = *(mas + start);
                start++;
            } else 
            {
                *(suplem_mas + j) = *(mas + final);
                final++;
            }
        }
        for (j = first; j <= last; j++)
        {
            *(mas + j) = *(suplem_mas + j);
        }
    
    delete[]suplem_mas;

}


Добавлено через 4 минуты и 38 секунд
Код

// console app cpp file
#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include "MergeShort.h"
#pragma comment (lib, "MergeShort.lib")
using namespace std;



int *BuildMas (int &n) {    
    int *mas, i;
    puts ("vvod\n");
    scanf ("%d", &n);
    printf ("n = %d\n", n);
    mas = new int [n];
    for (i = 0; i < n; i ++) {
        *(mas + i) = rand() % 21 - rand() % 21;
    }
    return mas;
}

void PrintMas (int *mas, int n) {    
    int i;
    for (i = 0; i < n; i ++) {
        printf ("%4d", *(mas + i));
    }
}

int main() {
    int n, *mas;
    setlocale (0,"russian");
    srand ((unsigned)time(NULL));
    
    mas = BuildMas (n);
    puts ("print mas");
    PrintMas (mas, n);
    printf ("\n");
    MergeSort(mas, 0, n - 1); 
    puts ("print mas");
    PrintMas (mas, n);
    printf ("\n");
    puts ("end");
    delete[] mas;
    getch();
    return 0;
}


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  usedll.rar 256,53 Kb
PM MAIL ICQ   Вверх
vol4ek
Дата 2.3.2017, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



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

Добавлено через 2 минуты и 43 секунды
у меня там опечатка есть в названии функции MergeSort
PM MAIL ICQ   Вверх
шарлотта
Дата 3.3.2017, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Большое Вам спасибо!
Постараюсь разобраться.
PM MAIL   Вверх
шарлотта
Дата 6.3.2017, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



К сожалению, так и не смогла понять, в чем была ошибка. Скопировала файлы .h и .lib  в папку с приложением. Выдает fatal error LNK1104: не удается открыть файл ''I:\информатика.obj''.
А при явном подключении по-прежнему выдает: "Ошибка".
А что надо было поправить в моей исходной программе?

Это сообщение отредактировал(а) шарлотта - 6.3.2017, 00:37
PM MAIL   Вверх
vol4ek
Дата 6.3.2017, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



.h и .lib нужно копировать не в папку приложения, а в папку проекта. в папку приложения нужно копировать .dll
вызовите GetLastError() после LoadLibrary()
мои проекты у вас тоже не собираются?

Добавлено через 3 минуты и 21 секунду
меня смущают иероглифы в строках в ваших исходниках. писали сами или откудато взяли?

Добавлено через 5 минут и 32 секунды
попробуйте собрать вот этот с неявным подключением. проект в аттаче.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  usedll.rar 256,53 Kb
PM MAIL ICQ   Вверх
шарлотта
Дата 9.3.2017, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Большое спасибо Вам за помощь! Удалось подключить динамическую библиотеку!
PM MAIL   Вверх
vol4ek
Дата 9.3.2017, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



как решили?
PM MAIL ICQ   Вверх
шарлотта
Дата 9.3.2017, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



При неявном подключении создала новый проект, и ошибки не выдало.
При явном добавила GetLastError().

Это сообщение отредактировал(а) шарлотта - 9.3.2017, 21:45
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1132 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.