Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2009, 20:50   #1
happy_horror
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 15
По умолчанию чем компилировать dll?

Привет всяк сюда входящему.


Сам вопрос в заголовке, в дополнение хочу сказать:

Стоит у меня и Microsoft Visual Studio и Borland C++ builder - но ни в одной из сред не могу скомпилировать длл (в студии вообще не нашёл проекта типа "длл", а борланд билдер вместо компиляции длл собирает фаил-проект). Если вышеуказанными программами скомпилировать длл можно, то прошу подсказать "как"?


P.S. уверен, что в обоих средах можно создавать длл, но похоже мешает лишь нехватка опыта работы с обеими программами
happy_horror вне форума Ответить с цитированием
Старый 29.03.2009, 20:58   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

По крайней мере в Дельфи скомпилировать DLL-ку можно только вкупе с программулиной, которая эту самую DLL вызывает, но никак не самостоятельно.
Впрочем, об этом довольно популярно сказано в хэлпе...
А у вас просто не хватило терпения туда залезть и почитать.

З.Ы. Старайтесь тщательнее выбирать раздел для размещения своей следующей темы.
Ей-богу, эта ваша тема ну никак не для раздела "Паскаль"...

Последний раз редактировалось mihali4; 29.03.2009 в 21:05.
mihali4 вне форума Ответить с цитированием
Старый 29.03.2009, 21:09   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

В Visual Studio создаёте проект Win32 и там в визарде будет выбор, нужно вам на выходе Программа (*.exe), Статическая библиотека (*.lib) или Динамическая библиотека (*.dll)
pu4koff вне форума Ответить с цитированием
Старый 29.03.2009, 21:40   #4
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Не знай у меня в делфе dll-ки компилируются без exe-шника, и что может помешать ей скомпилится, ну ни как отсутствие exe -файла !

Кстати, согласен с pu4koff и в делфе такое есть и в Builder-e тоже.

Последний раз редактировалось uberchel; 29.03.2009 в 21:42.
uberchel вне форума Ответить с цитированием
Старый 29.03.2009, 23:12   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Не знаю, как там у вас, а у меня:
sshot-1.jpg
Цитата:
Сообщение от pu4koff Посмотреть сообщение
Ну это по F9. А если именно компилить по F7, то dll будет сгенерирована.
...но без гарантий работоспособности в составе...

Последний раз редактировалось mihali4; 29.03.2009 в 23:21.
mihali4 вне форума Ответить с цитированием
Старый 29.03.2009, 23:16   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну это по F9. А если именно компилить по F7, то dll будет сгенерирована.
pu4koff вне форума Ответить с цитированием
Старый 30.03.2009, 21:17   #7
happy_horror
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 15
По умолчанию

мерси боку, как собрать длл теперь понятно, но возникла другая проблема:

у меня исходный код (или скорее его представление) на паскале, а длл-ки только на С или С++ собираются

собственно нужна помощь в переводе небольшого кусочка кода из паскаля в С или С++


Код:
var
	global_s : string;//глобальная переменная типа "строка"


function ReturnName : string; stdcall;//функция длл, которая в качестве аргумента возвращает значение глобальной переменной 's'
begin
  result := s;
end;

function GetName(var name : string) : stdcall;//функция, которая в качестве аргумента принимает строку и сохраняет её в глобальную переменную 's'
begin
  s := name;
end;


exports GetName,ReturnName;//экспортируем обе функции

begin
end.

P.S. если это уже выходит за рамки данной темы, то могу оформить новую

P.S. 2 не успел я ещё постигнуть С++, но перевод даже такого небольшого кода даром не пропадёт
happy_horror вне форума Ответить с цитированием
Старый 30.03.2009, 21:35   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1. не используйте делфийские строки в интерфейсе длл. Только какой-нибудь PChar.
2. Как-то так (писал тут, так что мог где-то лохануться ):
Код:
// DllMain.h

#define DllExport extern "C" __declspec(dllexport)

extern std::string global_s;

DllExport const char* ReturnName();
DllExport void GetName(const char *name); // Зачем там модификатор var в Delphi аналоге я так и не понял

// DllMain.cpp

std::string global_s;

const char* ReturnName()
{
  return global_s.c_str();
}

void GetName(const char *name)
{
  global_s.assign(name);
}
pu4koff вне форума Ответить с цитированием
Старый 30.03.2009, 23:16   #9
happy_horror
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 15
По умолчанию

извиняюсь за свою неграмотность - студия изначально под длл создаёт такой макет:

Код:
// 1.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif
т.е. вот этот код:

Код:
// DllMain.h

#define DllExport extern "C" __declspec(dllexport)

extern std::string global_s;

DllExport const char* ReturnName();
DllExport void GetName(const char *name); // Зачем там модификатор var в Delphi аналоге я так и не понял

// DllMain.cpp

std::string global_s;

const char* ReturnName()
{
  return global_s.c_str();
}

void GetName(const char *name)
{
  global_s.assign(name);
}
мне нужно положить по соответствующим фаилам DllMain.cpp и DllMain.h?
happy_horror вне форума Ответить с цитированием
Старый 30.03.2009, 23:35   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну можете раскидать по уже имеющимся stdafx.h и 1.cpp в соответсвии с моим примером. DllMain - это точка входа как WinMain. Там можете добавить инициализацию, подобно делфийскому блоку begin..end. Только не забудьте проверять значение ul_reason_for_call, а то будете инициализировать библиотеку не по делу.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите компилировать программу tony2009 Общие вопросы C/C++ 11 31.03.2009 23:05
Как компилировать в Си? Bogood Общие вопросы C/C++ 10 22.02.2009 20:23
компилировать не выходит 3.14oner Общие вопросы по Java, Java SE, Kotlin 5 08.11.2008 18:36
научите компилировать в borland для с DOS Помощь студентам 23 28.10.2007 14:29
Что такое DLL и с чем его едят?? Илюха Общие вопросы Delphi 5 06.10.2007 10:43