| Создание 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
| Дата: Среда, 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 Ещё как зависимо! Просто они более правильно сделаны, чем твоя длл.  Там макросы, херакросы. Здесь надо изучать мультиплатформеность и другие штучки. Корочь, это не ко мне
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
|
Ааа ! Кул работает ! Я забыл сделать 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, так что обьясните мне как-нибудь по-проще!
|
| |
| | |
|
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 везде ее используют для сети, а то что она по той же технологии файлы пишет никто не замечает
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 использовала эту же либу :-) Ага!  Я сейчас глянул исходники. Теперь есть полный и тотальный контроль над ГМом.
Blogpost
|
| |
| | |
|
BanShee
| Дата: Воскресенье, 17.04.2011, 06:36 | Сообщение # 59 |
Хрен заткнешь
Группа: Проверенные
Сообщений: 381
Статус: Offline
|
А для Шарпа есть пример?
Этот пост автоматически делает любой тред на 20% круче, если не указано обратное.
|
| |
| | |
|
NewStrannik
| Дата: Воскресенье, 17.04.2011, 08:22 | Сообщение # 60 |
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
|
Сообщение отредактировал NewStrannik - Воскресенье, 17.04.2011, 08:23 |
| |
| |
|
|