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

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 3 из 3«123
Форум 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
 
3bl3gamer Дата: Среда, 15.04.2009, 23:08 | Сообщение # 41
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
Quote (Ang3L)
Там ещё много разных фишек и плюшек, которые нужно знать. А ещё, ты уверен что на остнальных 3 компах где не пошло, есть спец. программное обеспечение(типа DirectX только для программирования Frameworks, то, сё.)?

нет.

но ведь всякие ultimate3D и 39dll железонезависимы(ну или ПОЧТИ независимы)!

 
Danox Дата: Среда, 15.04.2009, 23:24 | Сообщение # 42
Болтун
Группа: Проверенные
Сообщений: 213
Статус: Offline
редиструтабл чтоль должен быть установлен или параметр при билде чтоб было все включено не помню уже
 
Ang3L Дата: Среда, 15.04.2009, 23:42 | Сообщение # 43
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (3bl3gamer)
ultimate3D

Ещё как зависимо! Просто они более правильно сделаны, чем твоя длл. biggrin Там макросы, херакросы. Здесь надо изучать мультиплатформеность и другие штучки. Корочь, это не ко мне biggrin


Blogpost
 
WertyXBOCT Дата: Четверг, 16.04.2009, 01:05 | Сообщение # 44
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
3bl3gamer, 39dll построен на винсках, т.е. 39длл это надстройка над надстройка над железом. Потому и железонезависимо. Тоже касается и ультимат3д, там используется или опенгл или дайректХа, а они надстройки над настройками и т.д.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
SRes Дата: Четверг, 16.04.2009, 18:49 | Сообщение # 45
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Тока что попытался сделать дллку для бибиканья сис. блока, не вышло... Ошибка :"Error defining an external function.", причем дллка ангела также не пашет (на первой странице, которая).


Velociped Inc.
 
Ang3L Дата: Четверг, 16.04.2009, 18:56 | Сообщение # 46
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote (SRes)
Тока что попытался сделать дллку для бибиканья сис. блока, не вышло... Ошибка :"Error defining an external function.", причем дллка ангела также не пашет (на первой странице, которая).

Ты оба варианта создания попробовал?
И чем компилишь?


Blogpost
 
SRes Дата: Четверг, 16.04.2009, 18:57 | Сообщение # 47
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Ааа ! Кул работает ! biggrin
Я забыл сделать
Quote
Microsoft Visual Studio 2008 > Project > [project_name] Properties (Alt + F7) > Configuration Properties > C\C++ > Advanced > Compile As > Compile As C Code (/TC)

Верней, вообще не заметил что это надо делать...
...
Хорошо что ты выделил важные части =). Спс за статью.
Чуть не забыл, я делал на 2005 вижуал студио.


Velociped Inc.

Сообщение отредактировал SRes - Пятница, 17.04.2009, 12:47
 
3bl3gamer Дата: Пятница, 21.08.2009, 18:15 | Сообщение # 48
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
так, я всё настроил, до сих пор всё, что я хотел, работало. длл'и я использовал для ускорения вычислений ГМа, то есть я длл'ке задаю параметры, она считает(гораздо быстрее) и отправляе результат обратно ГМу.
теперь я решил сделать чтение файлов через длл, и вот тут-то пошла какая-то фигня...
в фунуции длл'ки такой код:
Code
export double rw()
{
  FILE *stream;
  double tv;
  long list[1];

  stream=fopen("\bin","r");
  tv=fread((char *)list,sizeof(long),1,stream);
  fclose(stream);
   
  return tv;
}

компилится нормально, но при вызове функции ГМом, вылетает. дебаггер говорит, что виновата в этом строка "tv=fread((char *)list,sizeof(long),1,stream);". если её закомментить, тоже вылетает, но теперь на строке "return tv;". смотрел описание fopen и fread на нескольких сайтах, но так и не понял, что я напутал. обьясните плиз, как правильно сделать чтение из файла!

P.S.: в С++ я полный 0, так что обьясните мне как-нибудь по-проще! smile

 
WertyXBOCT Дата: Пятница, 21.08.2009, 21:10 | Сообщение # 49
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Возьми код из 39sters dll.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
3bl3gamer Дата: Пятница, 21.08.2009, 21:24 | Сообщение # 50
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
Quote (WertyXBOCT)
Возьми код из 39sters dll.

а что это за dll? да и где взять этот код? яндекс по этой длл одну ссылку выдал...
 
WertyXBOCT Дата: Пятница, 21.08.2009, 22:04 | Сообщение # 51
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
39dll везде ее используют для сети, а то что она по той же технологии файлы пишет никто не замечает wink


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
3bl3gamer Дата: Пятница, 21.08.2009, 22:32 | Сообщение # 52
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
Quote (WertyXBOCT)
она по той же технологии файлы пишет

хе, и правда...
не, мне надо загрузить инфу из файла, но не для того, чтобы сразу передать её ГМу, с ней должна и сама длл поработать, а если в процессе ГМ участвовать будет, что смысла никакого нет...
 
WertyXBOCT Дата: Пятница, 21.08.2009, 22:37 | Сообщение # 53
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
А то что 39dll идет вместе с исходником только я один знаю?


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
3bl3gamer Дата: Суббота, 19.03.2011, 13:41 | Сообщение # 54
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
Quote (WertyXBOCT)
А то что 39dll идет вместе с исходником только я один знаю?

ааа... да, она же с открытым кодом... забыл. ладно, спасибо, поковыряем...

Добавлено (19.03.2011, 13:41)
---------------------------------------------
иногда нужно перебросить в длл и обратно много инфы, но ГМ указатели на свои переменные не даёт. вот я и подумал, а почему бы ДЛЛе самой их не "взять"?
допустим, нужен указатель на массив, тогда, теоретически, можно забить в первые несколько элементов этого массива некоторые значения, передать их ДЛЛе, а она бы просмотрела память и нашла бы эти значения.
не знаю точно, как работает подключение дллей, но раз новый процесс при этом не создаётся, всё работает в одном процессе, значит можно из ДЛЛи просмотреть память ГМа как свою. наверно. но вопрос: а куда, собственно, смотреть? точнее в каком диапазоне искать?



Сообщение отредактировал 3bl3gamer - Суббота, 19.03.2011, 13:41
 
NewStrannik Дата: Суббота, 19.03.2011, 15:55 | Сообщение # 55
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
 
Ang3L Дата: Суббота, 19.03.2011, 16:44 | Сообщение # 56
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
NewStrannik, слушай, классная вещь! Я так понял есть доступ ко всему из С++: игровому движку, графике, звуку и т.д.?


Blogpost
 
3bl3gamer Дата: Суббота, 19.03.2011, 17:01 | Сообщение # 57
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
да, похоже на то... и походе на то, что shader.dll использовала эту же либу :-)
 
Ang3L Дата: Суббота, 19.03.2011, 17:57 | Сообщение # 58
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Quote
и походе на то, что shader.dll использовала эту же либу :-)

Ага! cool Я сейчас глянул исходники. Теперь есть полный и тотальный контроль над ГМом.


Blogpost
 
BanShee Дата: Воскресенье, 17.04.2011, 06:36 | Сообщение # 59
Хрен заткнешь
Группа: Проверенные
Сообщений: 381
Статус: Offline
А для Шарпа есть пример?


Этот пост автоматически делает любой тред на 20% круче, если не указано обратное.
 
NewStrannik Дата: Воскресенье, 17.04.2011, 08:22 | Сообщение # 60
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Не совсем то, даже совсем не то, но...
http://stackoverflow.com/questio....-c-or-c


Сообщение отредактировал NewStrannik - Воскресенье, 17.04.2011, 08:23
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Создание DLL на С++ (Microsoft Visual Studio 2008)
Страница 3 из 3«123
Поиск:



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