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

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 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 Дата: Среда, 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, я понял. biggrin У меня нет CodeGear. Но если я откомпилю код у себя, и всё запашет, то проблема будет в настройках компилятора. В противном случае в коде. Я незнаю в чём проблема у тебя.

Добавлено (25.03.2009, 19:52)
---------------------------------------------
P.S.: Там есть готовый проект, используй его. (Если CodeGear прочитает)



Blogpost
 
3bl3gamer Дата: Среда, 25.03.2009, 20:58 | Сообщение # 25
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
да что там выладывать-то... happy

это в длл:

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, уже мучаю С++! biggrin

а можно ли как-нибудь быстро "перебросить" массив(боьшой), созданный длл, в гм, а то через экстернал_колл как-то медленно?

 
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, привыкай к настоящему программированию! biggrin Ты думаешь почему в реадми пишут все видеокарты какие поддерживаются, об обновлений драйверов и т.д.

Железозависимо!

Там ещё много разных фишек и плюшек, которые нужно знать. А ещё, ты уверен что на остнальных 3 компах где не пошло, есть спец. программное обеспечение(типа DirectX только для программирования Frameworks, то, сё.)?



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



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