Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual C++
Перезагрузить страницу Создание DLL файла на С++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
DungeonLords DungeonLords вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2009
По умолчанию Создание DLL файла на С++ - 01.11.2009, 16:39

Скажите, как сделать файл .dll.
Ответить с цитированием
  (#2 (permalink)) Старый
winamp winamp вне форума
Member
 
Сообщений: 262
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.08.2008
По умолчанию 01.11.2009, 17:13

оч. просто:
создаёшь новый проект (win32 console).
выбираешь пункт "dll".
компилишь как обычный exe-шник
Ответить с цитированием
  (#3 (permalink)) Старый
Odin_KG Odin_KG вне форума
Member
 
Сообщений: 956
Сказал(а) спасибо: 0
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 28.01.2007
По умолчанию 01.11.2009, 18:03

еще надо завести def-файл где перечислить имена функций, которые будут доступны для вызова в DLL.

если предполагается коммерческая библиотека, которая будет передаваться другим пользователям, то лучше ее собрать в старой версии, например, в MS С++6.0. Если же библиотека не зависит от Windows, т.е. не использует WinAPI, то лучше вообще выбросить MS-среду и собрать DLL на GCC, например, в Codeblocks-е (делать DLL можно и в VS, но собирать окончательный release лучше именно в GCC). Это позволит библиотеке не зависеть от всяких там фреймворков, редистрибутивов и прочей дребедени, которые скорее всего не установлены на машине пользователя.
Ответить с цитированием
  (#4 (permalink)) Старый
winamp winamp вне форума
Member
 
Сообщений: 262
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.08.2008
По умолчанию 01.11.2009, 20:40

Цитата:
еще надо завести def-файл где перечислить имена функций, которые будут доступны для вызова в DLL.
не надо. Не надо вводить публику в заблуждение.

Цитата:
если предполагается коммерческая библиотека, которая будет передаваться другим пользователям, то лучше ее собрать в старой версии, например, в MS С++6.0. Если же библиотека не зависит от Windows, т.е. не использует WinAPI, то лучше вообще выбросить MS-среду и собрать DLL на GCC, например, в Codeblocks-е (делать DLL можно и в VS, но собирать окончательный release лучше именно в GCC). Это позволит библиотеке не зависеть от всяких там фреймворков, редистрибутивов и прочей дребедени, которые скорее всего не установлены на машине пользователя.
в VC, конечно, имеется наворот с манифестами, но его можно обойти без особых изворотов:
http://contradictioncollapse.blogspot.com/...msvcr90dll.html
Ответить с цитированием
  (#5 (permalink)) Старый
Odin_KG Odin_KG вне форума
Member
 
Сообщений: 956
Сказал(а) спасибо: 0
Поблагодарили 17 раз(а) в 16 сообщениях
Регистрация: 28.01.2007
По умолчанию 01.11.2009, 22:02

Цитата:
не надо.
ну, можно, конечно, помечать отдельно требуемые функции, но, по-моему, def куда лучше.

Цитата:
Не надо вводить публику в заблуждение.
Вот мне делать нечего, как только вводить кого-то в заблуждение. Я отвечаю на вопрос исходя из своего опыта. Если у вас другой опыт, так это ваше личное дело. Спорить мне на эту тему совершенно не хочется - не нравится мой ответ, так делайте по-своему, мне это совершенно безразлично.

Цитата:
в VC, конечно, имеется наворот с манифестами, но его можно обойти без особых изворотов:
Делайте как знаете. Я нашел для себя способ который решает все проблемы, которые возникают после сборки библиотеки в VS и меня это вполне устраивает. Лично я уже сыт по горло решениями от MS и надеяться на нее не собираюсь. Собранная по вашей схеме DLL может на Win98 работать без дополнительных инсталляций? Если будет, тогда этот способ имеет право на жизнь, иначе можно его выбросить на свалку.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
DungeonLords DungeonLords вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2009
По умолчанию 01.11.2009, 23:24

Цитата:
оч. просто:
создаёшь новый проект (win32 console).
выбираешь пункт "dll".
компилишь как обычный exe-шник
Отлично,, только я пытаюсь сделать ode.dll из исходников движка физики ODE: http://sourceforge.net/projects/opende/files/

Иными словами проект, win32 console или нет, у меня уже есть. Я выполняя построение проекта, но никакой DLL не выходит. Что нужно изменить в меню, искал но не нашёл ничего подходящего?
Ответить с цитированием
  (#7 (permalink)) Старый
Shunix Shunix вне форума
Member
 
Сообщений: 1,355
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.06.2002
По умолчанию 01.11.2009, 23:32

Написание и использование DLL в различных средах
Ответить с цитированием
  (#8 (permalink)) Старый
DungeonLords DungeonLords вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2009
По умолчанию 02.11.2009, 00:55

"Осталось просто скомпилировать DLL в какой-нибудь каталог. Перед компиляцией не забудьте полностью указать свойства проекта (вкладка "MAKE" - версия библиотеки, её имя и т.д.) и протестировать вашу библиотеку. При компиляции VB создает 3 файла с расширениями .dll/.lib/.exp. Первый файл и является нужной нам динамической библиотекой."
Гламурно произнёс слово "МЭЭЭЙЙК" и заметил, что у меня русский Visual. Как это меню будет по русский, у этого слова очень много вариантов перевода?
Ответить с цитированием
  (#9 (permalink)) Старый
Денисrf Денисrf вне форума
Member
 
Сообщений: 57
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.10.2009
По умолчанию 02.11.2009, 22:57

Может мог бы кто нибудь выложить исходник dll и консольного (любого) приложения которое использует dll рабочее?
Ответить с цитированием
  (#10 (permalink)) Старый
Денисrf Денисrf вне форума
Member
 
Сообщений: 57
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.10.2009
По умолчанию 03.11.2009, 00:40

Делаю уже до тупого просто, может кто подскажет где ошибка?

хедер dll

Код:
#define EXPORT extern "C" __declspec (dllexport)
    EXPORT int CALLBACK MyFunction(char *str);
cpp dll

Код:
#include <windows.h> 
#include "iostream"
#include "XDLL.h"  
    
EXPORT int CALLBACK MyFunction(char *str) 
    { 
        std::cout<<str;
        //MessageBox(NULL,str,”Function from DLL”,MB_OK); 
        return 1; 
    }

Исполнительный файл:

Код:
#include "stdafx.h"
#include "windows.h"
#include "iostream"
#include "conio.h"
#include "stdio.h"
//#include "XDLL.h"
typedef int (WINAPI *PFN_MyFunction)(char *str);
typedef int (*My_Function)(char *str);
//typedef int (*MYPROC)(LPTSTR); 
using namespace std;


void main()
{
    HINSTANCE hXDll;
    if ((hXDll=::LoadLibrary(TEXT("C:\\Documents and Settings\\Admin\\Мои документы\\Visual Studio 2008\\Projects\\XDLL\\Debug\\XDLL.dll")))==NULL)
        cout<<"PPC";
    My_Function AdressFunctii;
    AdressFunctii=(My_Function)::GetProcAddress(hXDll,"MyFunction");
    
    int a=(*AdressFunctii)("");
    FreeLibrary(hXDll);


    
    cout<<"I'm warking";
    
    getch();
    return;
}

Ошибка:
Первый этап обработки исключения в "0x00000000" в "Iksperement.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000".
Необработанное исключение в "0x00000000" в "Iksperement.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000".


Жесть.
Ответить с цитированием
  (#11 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 03.11.2009, 02:28

А под отладчиком пройти и посмотреть, что происходит - религия не позволяет?
На каком операторе хотя бы возникает исключение?
Ответить с цитированием
  (#12 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 03.11.2009, 11:31

Очевидно, что LoadLibrary либо GetProcAddress возвращает NULL.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Денисrf Денисrf вне форума
Member
 
Сообщений: 57
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.10.2009
По умолчанию 03.11.2009, 17:25

Ошибка в строке (я не верующий) -

Код:
int a=(*AdressFunctii)("");
Цитата:
Очевидно, что LoadLibrary либо GetProcAddress возвращает NULL.
Нет я специально поставил условие

Код:
if ((hXDll=::LoadLibrary(TEXT("C:\\Documents and Settings\\Admin\\Мои документы\\Visual Studio 2008\\Projects\\XDLL\\Debug\\XDLL.dll")))==NULL)
        cout<<"PPC";
"РРС" не выводится значет не NULL.
Ответить с цитированием
  (#14 (permalink)) Старый
winamp winamp вне форума
Member
 
Сообщений: 262
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.08.2008
По умолчанию 03.11.2009, 22:23

кстати, в msdn написан след. прототип:
Код:
HMODULE WINAPI LoadLibrary(
  __in  LPCTSTR lpFileName
);
Ответить с цитированием
  (#15 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 03.11.2009, 22:33

Цитата:
Ошибка в строке (я не верующий) -
Код:
int a=(*AdressFunctii)("");
Убедились, что AdressFunctii не равен нулю? Тогда какая-то нестыковка в конвенциях вызова.
Переходите в ассемблерный код - и далее внутрь процедуры. Многое станет ясно.

Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание полноценного exe файла torsion91 Visual C++ 3 18.12.2009 14:48
Создание WAVE-файла xHEADx С/С++ 2 03.04.2008 03:59
Создание файла с расширением .h Andrey~&#33; Вопросы начинающих программистов 7 10.05.2007 20:30
Создание исполняемого файла na_tanke Assembler 3 25.03.2007 18:47
Создание потока без файла 0xEEd С/С++ 7 17.03.2006 16:05
Создание файла help в С++ perunir C++ Builder 4 25.03.2005 17:52
Создание файла импорта DLL Андрей А. C++ Builder 0 08.06.2004 13:02
создание файла на сервере... kaiser Zaido PHP 1 15.03.2004 18:52
Создание com файла на приложении alexgeo Assembler 9 26.02.2004 20:15
Создание INI-файла к приложению chainick C++ Builder 13 18.02.2004 00:10
Создание AVI файла на приложении Anonymous Delphi 0 23.01.2004 16:15
создание текстового файла Anonymous PHP 3 23.09.2003 20:14



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов