Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Slip84
0 / 0 / 0
Регистрация: 09.02.2018
Сообщений: 1
1

Не загружается DLL. Правила написания DLL

09.02.2018, 12:49. Просмотров 174. Ответов 7

Добрый день!
Вопрос в следующем. Есть код на Си++ с применением классов, раскиданных по нескольким исходникам. Код рабочий, gcc под с++11 его компилирует. Причем в экспорте есть только одна виртуальная функция. Все классы просто объявлены внутри и извне не используются. После сборки dll файла при попытке добавления dll в среде разработки возникает сообщение: cannot load ...dll. Error description provided by operating system: Не найден указанный модуль.
После того, как я закоментировал почти весь код в файлах ошибка пропала и библиотека подгрузилась. Стал по суть чуть убирать комментарии с классов и методов и при это некоторые, казалось бы, безобидные методы вернули ошибку. Даже пустой метод, который ничего не делает. А также я заметил, что подключение <iostream> вызывает такую же ошибку, как ни странно.

В чем может быть дело?
Есть ли какие-то правила и ограничения на исходный код, который не экспортируется и используется сугубо внутри библиотеки dll?
Может это быть вызвано неадекватным поведением антивируса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2018, 12:49
Ответы с готовыми решениями:

Нужен пример написания DLL
Смотрел информацию из msdn, делал все по пунктам, но как то не идет. Можете мне...

Добавление своей dll в список dll подгружаемых процессом чужого процесса
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не...

Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL
День добрый! При запуске моей программы (много моего кода + много разных...

Как узнать путь к загруженной DLL из самой DLL?
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке ...

Dll файл в exe файле. Вшить dll libcurl
Проблема такая что приходится таскать всегда libcurl.dll с собой. Надо все...

7
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
09.02.2018, 13:11 2
Насколько я знаю, экспортировать объектно ориентированные методы нельзя.
Придется добавить функцию, которая не принадлежит к какому-либо классу,
и уже через нее работать с классом.
0
outoftime
║XLR8║
763 / 662 / 212
Регистрация: 25.07.2009
Сообщений: 3,320
Записей в блоге: 5
09.02.2018, 15:08 3
Цитата Сообщение от Slip84 Посмотреть сообщение
Может это быть вызвано неадекватным поведением антивируса?
Это проверить легче всего - просто вырубить его на время.

Пример для линукса

Кликните здесь для просмотра всего текста
myclass.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef __MYCLASS_H__
#define __MYCLASS_H__
 
class MyClass
{
public:
  MyClass();
 
  /* use virtual otherwise linker will try to perform static linkage */
  virtual void DoSomething();
 
private:
  int x;
};
 
#endif
myclass.cc
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
#include "myclass.h"
#include <iostream>
 
using namespace std;
 
extern "C" MyClass* create_object()
{
  return new MyClass;
}
 
extern "C" void destroy_object( MyClass* object )
{
  delete object;
}
 
MyClass::MyClass()
{
  x = 20;
}
 
void MyClass::DoSomething()
{
  cout<<x<<endl;
}
class_user.cc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <dlfcn.h>
#include <iostream>
#include "myclass.h"
 
using namespace std;
 
int main(int argc, char **argv)
{
  /* on Linux, use "./myclass.so" */
  void* handle = dlopen("myclass.so", RTLD_LAZY);
 
  MyClass* (*create)();
  void (*destroy)(MyClass*);
 
  create = (MyClass* (*)())dlsym(handle, "create_object");
  destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");
 
  MyClass* myClass = (MyClass*)create();
  myClass->DoSomething();
  destroy( myClass );
}
Код
g++ -fPIC -shared myclass.cc -o myclass.so
g++ class_user.cc -ldl -o class_user
0
COKPOWEHEU
996 / 692 / 158
Регистрация: 09.09.2017
Сообщений: 2,992
09.02.2018, 15:38 4
Файлик для универсальной работы с динамическими библиотеками
Кликните здесь для просмотра всего текста
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
32
/*
 *  Linux
 */
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
  #ifndef linux
    #define linux 1 //чтобы была всего одна константа, а не десяток
  #endif
  //Linux
  #include <dlfcn.h>
  #define DynLoad(s) dlopen(s, RTLD_LAZY)
  #define DynFunc(lib, name)  dlsym(lib,name)
  #define DynClose(lib) dlclose(lib)
/*
 *  Win 32
 */
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  #ifndef WIN32
    #define WIN32 1
  #endif
  //Win32
  #define _CRT_SECURE_NO_WARNINGS
  #include <windows.h>
  
  #define DynLoad(s) LoadLibrary(s)
  #define DynFunc(lib, name)   GetProcAddress((HINSTANCE)lib, name)
  #define DynClose(lib) FreeLibrary(lib)
 /*
  *  Other systems (unsupported)
  */
#else
  #error "Unsupported platform"
#endif
1
outoftime
║XLR8║
763 / 662 / 212
Регистрация: 25.07.2009
Сообщений: 3,320
Записей в блоге: 5
09.02.2018, 15:46 5
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
универсальной
Ха, Mac OS нету (:
0
COKPOWEHEU
996 / 692 / 158
Регистрация: 09.09.2017
Сообщений: 2,992
09.02.2018, 16:25 6
outoftime, Потому что у меня MacOS нету, как и возможности, необходимости и желания писать под нее. Хотя если приведете вариант реализации - включу.
0
outoftime
║XLR8║
763 / 662 / 212
Регистрация: 25.07.2009
Сообщений: 3,320
Записей в блоге: 5
09.02.2018, 16:31 7
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Хотя если приведете вариант реализации - включу.
Видел темку где различия были только на этапе компиляции. А в целом, я не в теме.
0
COKPOWEHEU
996 / 692 / 158
Регистрация: 09.09.2017
Сообщений: 2,992
09.02.2018, 19:07 8
Гугл считает что macOS признает dlopen / dlsym / dlclose, так что можно добавить в первую ветку или скопировать макросы в третью. Но без тестирования делать это все-таки не хочется
0
09.02.2018, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2018, 19:07

Запись из внедренной dll в другую dll этого процесса
main.cpp #include &lt;Windows.h&gt; extern int writeprocess(); DWORD WINAPI...

Как узнать зависимость DLL-ки от других DLL-ек?
Есть DLL-ка, она в свою очередь подгружает другие DLL-ки, а так же использует...

Обращение к ресурсам DLL из самой DLL
Коллеги, добрый день. Получил следующее задание - Создать библиотеку, DLL...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru