| Создание DLL на С++ |
|
Ang3L
| Дата: Вторник, 10.03.2009, 20:13 | Сообщение # 1 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Благодаря Великому и Неподражаемому, Danox'у, мы нашли в чём проблема. Проблема заключалось в том что код надо компилить, в принудительном порядке, как С код. Параметр /ТС. Microsoft Visual Studio 2008 > Project > [project_name] Properties (Alt + F7) > Configuration Properties > C\C++ > Advanced > Compile As > Compile As C Code (/TC) Что же нужно чтобы сделать ДЛЛ на С++ для ГМ? 1) Создать пустой проект. 2) В Configuration Properties > General > Configuration Type поставить Dynamic Library (*.dll) 3) Создать файл исходников. Какое расширение выбрать? В случае, если хотите следовать пункту 4.1), то без разницы, а так только *.с . Но лучше, в любом случае, *.с . Так будет понятнее. А здесь выбираем: либо способ 4.1, либо способ 4.2 В этом файле написать строку: 4.1) Или такую: Quote #define export __declspec (dllexport) Следовать совету, тот что в самом вверху. Переключить на принудительную компиляцию как С код. Здесь мы определяем, что слово "export" будет означать "__declspec (dllexport)" 4.2) Или такую: #define export extern "C" __declspec (dllexport) 5) Компилим наш исходник. Всё! Вот пример, простой функций сложения: Quote export double add(double a, double b) { return (a + b); } Сначала пишем волшебное слово " export", потом что возращает функция ( double), потом название функций (add) и её параметры. Слово " export" пишем перед каждой функцие что мы хотим использовать непосредственно в ГМ. И последнее, что надо знать: В ГМ 2 типа переменных: ty_real и ty_string. Соответсвенно, в С++: double и char*. ty_real = double ty_string = char* Пример с возращаемой строкой: Quote export char* number() { return "Number"; } Специфику С++ оставляю на ваши плечи. P.S.: Хочу добавить, если не догадаетесь. Хотя в сам ГМ нельзя вернуть класс, указатель и т.д. Можно оперировать с ним в "воздухе". Так сказать, ход конём. Функций без слова export будут использоваться только внутри dll. Например, с его помощью можно создать объект определённого класса. И управлять им с помощью функций определённым в дллке. Например, вы можете реализовать работу с памятью. Да и другие интересные вещи. А главное, можно существенно повысить скорость! Для этого придётся использовать метод 4.2), а не 4.1) P.P.S.: Работа с другими компиляторами, настройками не гарантируется!
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Среда, 25.03.2009, 19:18 | Сообщение # 21 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Quote (Ang3L) Ты сделал и один вариант и второй? И не работает? ну да... хотя пробовал я это не на Microsoft Visual Studio, а на CodeGear. может в нём ещё чего включить надо?
|
| |
| | |
|
Ang3L
| Дата: Среда, 25.03.2009, 19:24 | Сообщение # 22 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
3bl3gamer, выложи тут исходники на С, и проект ГМ6 готовый. Я посмотрю в чём дело. P.S.: Мы ещё не все настройки узнали. Единтсвенное что я те могу повторить, это то что ГМ не полностью поддерживает ДЛЛки и надо подстраиватся под его формат. Т.е. выходной код должен интерпретироваться как С и выходные данные могут быть char* и double. А так же стек должен быть: dll_cdecl или dll_stdcall. Это все данные которые мы знаем.
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Среда, 25.03.2009, 19:47 | Сообщение # 23 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Quote (Ang3L) Ты сделал и один вариант и второй? И не работает? ну да... вот только делал я это не на Вижуал Студио, а на CodeGear. может, в нём ещё чего-то включить надо?
|
| |
| | |
|
Ang3L
| Дата: Среда, 25.03.2009, 19:52 | Сообщение # 24 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
3bl3gamer, я понял.  У меня нет CodeGear. Но если я откомпилю код у себя, и всё запашет, то проблема будет в настройках компилятора. В противном случае в коде. Я незнаю в чём проблема у тебя. Добавлено (25.03.2009, 19:52) --------------------------------------------- P.S.: Там есть готовый проект, используй его. (Если CodeGear прочитает)
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Среда, 25.03.2009, 20:58 | Сообщение # 25 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
да что там выладывать-то... это в длл: Code #define export __declspec (dllexport)
export double add(double a, double b) { return (a + b); } в гм: Code global.mmm = external_define('Project1.dll','add',dll_cdecl,ty_real,2,ty_real,ty_real) Добавлено (25.03.2009, 20:58) ---------------------------------------------
Quote (Ang3L) Но если я откомпилю код у себя, и всё запашет, то проблема будет в настройках компилятора. а что ж с твоим примером? у тебя он работает, у меня нет! а ведь там компилятор не при чём!
|
| |
| | |
|
Danox
| Дата: Среда, 25.03.2009, 21:10 | Сообщение # 26 |
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
|
Code #define export extern "C" __declspec (dllexport) Создай новый емпти прожект добавь cpp-ку напиши Code #define export extern "C" __declspec (dllexport)
export double add(double a, double b) { return (a + b); } все будет ок
|
| |
| | |
|
Ang3L
| Дата: Среда, 25.03.2009, 23:06 | Сообщение # 27 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote (3bl3gamer) #define export __declspec (dllexport) Там же чётко написано, если ты используешь эту строчку, то код компилится как с++. Тебе надо насильно переключить в С. Как это сделать написано в первом посте. Или использовать метод Danox'а. Внимательнее читай.
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Суббота, 28.03.2009, 13:32 | Сообщение # 28 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
ну естессно, я пробовал обе строчки!
|
| |
| | |
|
Ang3L
| Дата: Суббота, 28.03.2009, 13:52 | Сообщение # 29 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
3bl3gamer, ну а настройки изменил? в первом случае нужен ключ /TC
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Суббота, 28.03.2009, 14:22 | Сообщение # 30 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Quote (Ang3L) 3bl3gamer, ну а настройки изменил? в первом случае нужен ключ /TC эээ... нет. в кодгиар я этого не нашёл. а как расшифровывается ТС?
|
| |
| | |
|
Ang3L
| Дата: Суббота, 28.03.2009, 15:31 | Сообщение # 31 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote (3bl3gamer) а как расшифровывается ТС? Скорее всего Type C, а /TP Type C(P)P. Quote (3bl3gamer) в кодгиар я этого не нашёл. Должно быть, это основной параметр. Ищи. Или просто расширение сделай *.с должно помочь. Quote (3bl3gamer) эээ... нет. Вот видишь, а это основной пункт. С него начинается пост. Не внимательно читаешь. НАДО КОМПИЛИТЬ КАК "С" КОД!!!. В этом проблема. Пункт 4.1) подрузамевает что ты весь проект компилишь как С и соотвтественно о С++ прелестях можно забыть. Пункт 4.2) позволяет вывести код как С, а внутри ДЛЛки использвать как С++. Это позволит пользоваться классами. P.S.: Читать внимательно пост №1! Пункты 4.1) и 4.2) взаимоисключаемы. Т.е. если ты сделал одно, не надо делать другое.
Blogpost
|
| |
| | |
|
Danox
| Дата: Суббота, 28.03.2009, 16:16 | Сообщение # 32 |
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
|
Господи пусть компилит как cpp код главное вставить экстерн с Вот тебе небольшая ддлка Code #define export extern "C" __declspec (dllexport)
#include <windows.h>
POINT pos;
//получаем коорд мышки export double MULTI_get_pos_x(double)
{ GetCursorPos(&pos); return(pos.x); }
export double MULTI_get_pos_y(double)
{ GetCursorPos(&pos); return(pos.y); } Будет работать в гамаке как часы.
Сообщение отредактировал Danox - Суббота, 28.03.2009, 16:17 |
| |
| | |
|
3bl3gamer
| Дата: Воскресенье, 29.03.2009, 20:42 | Сообщение # 33 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Quote (Ang3L) НАДО КОМПИЛИТЬ КАК "С" КОД!!!. В этом проблема. а выбор между С и С++ кодгиар предлагает сразу при создании проекта, так что я пробовал и на С, и на С++ но всё же, Quote а что ж с твоим примером? у тебя он работает, у меня нет! а ведь там компилятор не при чём! Добавлено (29.03.2009, 20:42) --------------------------------------------- закачал седьмой делфи. всё пашет.
Сообщение отредактировал 3bl3gamer - Суббота, 28.03.2009, 18:38 |
| |
| | |
|
Ang3L
| Дата: Воскресенье, 29.03.2009, 20:51 | Сообщение # 34 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote (3bl3gamer) а выбор между С и С++ кодгиар предлагает сразу при создании проекта, так что я пробовал и на С, и на С++ Значит ещё какая настройка. Пока работает на MSVC++ и MinGW вродь. Quote (3bl3gamer) закачал седьмой делфи. всё пашет. Прально, не фиг мучатся с С++. Тем боле, ГМ на дельфи, значит совместимость больше.
Blogpost
|
| |
| | |
|
3bl3gamer
| Дата: Воскресенье, 29.03.2009, 22:23 | Сообщение # 35 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Quote (Ang3L) Прально, не фиг мучатся с С++. ну, это ещё не известно, с чем мне придётся больше мучаться... Добавлено (29.03.2009, 22:23) --------------------------------------------- ЕССС!!! я домучал этот С! всё заработало! не знаю, в чём была проблема, но сейчас всё работает. правда компилил не кодгиар, а вижуал студио 2005
|
| |
| | |
|
Danox
| Дата: Воскресенье, 29.03.2009, 23:57 | Сообщение # 36 |
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
|
c не мечай делай так #define export extern "C" __declspec (dllexport) и мучай с++ Кстати Ang3L экстерн с пишут когда создают любую дллку не только для гм потому что если делать экспорт на cpp то в названиях функций cpp меняет названия и не будет работать вот так
Сообщение отредактировал Danox - Воскресенье, 29.03.2009, 23:58 |
| |
| | |
|
3bl3gamer
| Дата: Суббота, 04.04.2009, 19:12 | Сообщение # 37 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
Danox, уже мучаю С++! а можно ли как-нибудь быстро "перебросить" массив(боьшой), созданный длл, в гм, а то через экстернал_колл как-то медленно?
|
| |
| | |
|
Danox
| Дата: Воскресенье, 05.04.2009, 00:38 | Сообщение # 38 |
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
|
врятли почитаю потом
|
| |
| | |
|
3bl3gamer
| Дата: Воскресенье, 12.04.2009, 20:15 | Сообщение # 39 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
|
так, вот ещё одна поблема. сделал медкую длл, проверял на 6 компах. работало нолько на 3!!! почему так? обидно всё-таки!
|
| |
| | |
|
Ang3L
| Дата: Воскресенье, 12.04.2009, 22:20 | Сообщение # 40 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
3bl3gamer, привыкай к настоящему программированию!  Ты думаешь почему в реадми пишут все видеокарты какие поддерживаются, об обновлений драйверов и т.д. Железозависимо! Там ещё много разных фишек и плюшек, которые нужно знать. А ещё, ты уверен что на остнальных 3 компах где не пошло, есть спец. программное обеспечение(типа DirectX только для программирования Frameworks, то, сё.)?
Blogpost
|
| |
| |
|
|