Создание DLL на С++ - Общие вопросы разработки игр - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 3123»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Создание DLL на С++ (Microsoft Visual Studio 2008)
Создание 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) Компилим наш исходник. Всё! biggrin

Вот пример, простой функций сложения:

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. Например, с его помощью можно создать объект определённого класса. И управлять им с помощью функций определённым в дллке. Например, вы можете реализовать работу с памятью. Да и другие интересные вещи. А главное, можно существенно повысить скорость! biggrin Для этого придётся использовать метод 4.2), а не 4.1)

P.P.S.: Работа с другими компиляторами, настройками не гарантируется!



Blogpost
 
Danox Дата: Понедельник, 16.03.2009, 00:29 | Сообщение # 2
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
Но придется писать на C а я хочу на c++
Я тут продвинулся пишем так
Code
#define export extern "C" __declspec (dllexport)

вместо
Code
#define export __declspec (dllexport)

То есть выполняем кусок кода на C остальное на c++
Все работает. Ну и билдим теперь как не c код а c++ код
Ang3L я думаю так лучше =)


Сообщение отредактировал Danox - Понедельник, 16.03.2009, 00:46
 
Ang3L Дата: Понедельник, 16.03.2009, 12:17 | Сообщение # 3
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Вроде как работает. Так будет правильнее всего. Для ГМ нужен "С", мы его предоставили, а всё остальное будем делать на С++. Всё с ДЛЛ наконец-то разобрались.


Blogpost
 
WertyXBOCT Дата: Понедельник, 16.03.2009, 12:32 | Сообщение # 4
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
У меня тот твой проект только С++. Си код там почти не работает (что странно)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Ang3L Дата: Понедельник, 16.03.2009, 17:05 | Сообщение # 5
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (WertyXBOCT)
У меня тот твой проект только С++. Си код там почти не работает (что странно)

Не понял, расширение у файла reger.c, и компилятор опознаёт его как С код и компилирует соответственно, без надобности настраивать проект.

Добавлено (16.03.2009, 17:05)
---------------------------------------------
Ща попробовал работу с классами и списками. Всё отлично работает! т.е. код работает как С++.

Прикрепления: test_dll.rar(13Kb)


Blogpost
 
Danox Дата: Понедельник, 16.03.2009, 17:19 | Сообщение # 6
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
Это дебаг версия ддлки?
Размер большой для такой дллки у меня определение коорд мышки и возврат цвета 7 кб весит релиз. дебаг в 4 раза больше зачем то не пойму я визуал.
И give source =)))


Сообщение отредактировал Danox - Понедельник, 16.03.2009, 17:28
 
Ang3L Дата: Понедельник, 16.03.2009, 17:43 | Сообщение # 7
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Я хз почему такой большой. Это релиз версия. Ты уж извини я новичок в этой области. Попробуй сам откомпиль, мож у тя меньше получится.
Прикрепления: Source.rar(1Kb)


Blogpost
 
WertyXBOCT Дата: Понедельник, 16.03.2009, 21:49 | Сообщение # 8
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
На самом деле ему пофигу какое расширение, в настройках то указано что С++.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Ang3L Дата: Понедельник, 16.03.2009, 22:53 | Сообщение # 9
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (WertyXBOCT)
На самом деле ему пофигу какое расширение, в настройках то указано что С++.

Да, но возращать то нужно как "С". Поэтому если без "#define export extern "C" __declspec (dllexport)" и с принудиловкой работать не будет. Корочь, какая разница, всё работает отлично.


Blogpost
 
3bl3gamer Дата: Воскресенье, 22.03.2009, 16:00 | Сообщение # 10
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
хммм... не, я, конечто, в ентом деле почти ничего не понимаю, что я в свою длл вписать не пробовал, гм ничего не понимал: пишет Error defining an external function и всё.
более того, ту же ошибку он выдаёт и на test dll, выложенный Ang3L'ом!
че-то я конкретно недопонимаю...

Добавлено (22.03.2009, 15:58)
---------------------------------------------
ха! скачал пример с gmphysics, дак и в нём та же ошибка! и как понимать сие?!

Добавлено (22.03.2009, 16:00)
---------------------------------------------
а ultimate3D как работал, так и работает!

 
Ang3L Дата: Воскресенье, 22.03.2009, 16:05 | Сообщение # 11
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
3bl3gamer, попробуй екзешник запустить.

Quote (3bl3gamer)
дак и в нём та же ошибка! и как понимать сие?!

Мы ещё не доконца поняли, но я думаю проблема в старости ГМ, а не в длл. Он не преспособлен ко всем вариантам дллки
Прикрепления: 7121676.rar(978Kb)


Blogpost
 
3bl3gamer Дата: Воскресенье, 22.03.2009, 16:38 | Сообщение # 12
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
сори, в гмфизикс ошибок нет, это я ступил.
не, ехе то же выдаёт

Добавлено (22.03.2009, 16:38)
---------------------------------------------
Ang3L, у тебя-то работает? smile

 
Ang3L Дата: Воскресенье, 22.03.2009, 16:59 | Сообщение # 13
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
3bl3gamer, ну ессесно. Я по второму способу делаю. Мне ща влом компилить. Возьми исходник и откомпиль его в 2 вариантах. Потом получившуюся дллку подставь и попробуй.


Blogpost
 
3bl3gamer Дата: Воскресенье, 22.03.2009, 17:24 | Сообщение # 14
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
не, всё-таки странно, почему один и тот же пример на у тебя работает, а у меня - нет
 
Ang3L Дата: Воскресенье, 22.03.2009, 18:10 | Сообщение # 15
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (3bl3gamer)
не, всё-таки странно, почему один и тот же пример на у тебя работает, а у меня - нет

Я и говорю, что голову долго ломал над этим. На форум ЙоЙо лазил, но ничё не нашёл. У всех всё норм компилилось и работало, а у меня нет. Частично разобрались с вопросом.

P.S.: У меня на компе столько всего поставлено...



Blogpost
 
3bl3gamer Дата: Воскресенье, 22.03.2009, 18:49 | Сообщение # 16
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
Quote (Ang3L)
У всех всё норм компилилось и работало, а у меня нет

ну щас-то всё работает! а как ты этого добился?
 
Ang3L Дата: Воскресенье, 22.03.2009, 19:34 | Сообщение # 17
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
в первом посте расписано.


Blogpost
 
3bl3gamer Дата: Воскресенье, 22.03.2009, 20:29 | Сообщение # 18
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
да на С я-то переключился, да не работает всё равно...
а может лучше длл не на С писать, а на дельфи какой-нть иль ещё на чём?
 
WertyXBOCT Дата: Воскресенье, 22.03.2009, 23:22 | Сообщение # 19
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Я не люблю делфи.
Но на нем очень просто писать дллки, в хелпе ГМа написан шаблончик.
А сам делфи противная штука с ужасным синтаксисом КАК Я НЕНАВИЖУ СЛОВА BEGIN И END!!!


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Ang3L Дата: Понедельник, 23.03.2009, 00:14 | Сообщение # 20
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (3bl3gamer)
да на С я-то переключился, да не работает всё равно... а может лучше длл не на С писать, а на дельфи какой-нть иль ещё на чём?

Ты сделал и один вариант и второй? И не работает?


Blogpost
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Создание DLL на С++ (Microsoft Visual Studio 2008)
Страница 1 из 3123»
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход