IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Моя первая DLL для DarkBasic pro, Приму критику!!
Vova
сообщение 12.4.2011, 18:00
Сообщение #1


Активный участник
***

Группа: Пользователи
Сообщений: 569
Регистрация: 27.8.2009
Из: Москва
Пользователь №: 65609



Прикрепленный файл  Моя_первая_DLL_для_DarkBasic_pro.pdf ( 279,68 килобайт ) Кол-во скачиваний: 916


Господа пилотная версия приму критику и замечания... так же приму любые предложения по улучшению и посильную помощь ибо всего знать я не могу.

Спасибо..


--------------------
Scio me nihil scire

Function OffSetSprite_to_M(spriteOffSet)
Offset Sprite spriteOffSet,sprite width(spriteOffSet)/2,sprite height(spriteOffSet)/2
EndFunction
Перейти в начало страницы
 
+Цитировать сообщение
Илья
сообщение 7.4.2014, 16:40
Сообщение #2


Активный участник
***

Группа: Пользователи
Сообщений: 137
Регистрация: 6.4.2009
Из: Россия г.Смоленск
Пользователь №: 65577



Прошу прощения за некрофилию, но, считаю тему актуальной!
Почитал - всё очень здорово, и требует более детального изучения!

По поводу:
Цитата
?rndx@@YAHHH@Z – это собственно указатель на нашу функцию
( если кто то знает как расшифровать эти загадочные буковки милости прошу на
форум либо в почту мне, спасибо! )

Осмелюсь предположить, что сие можно извлечь из транслированного имени внутри dll, имя rndx "искажено" сишным транслятором, из-за особенности сборки (в принципе, грамотными публикациями функций можно достичь минимального "искажения" - пишу экспортом через "C" - получаю полностью идентичные имена внутри dll). К чему я это... - даже если мена исказились - можно почитать как именно в ".def" файле сишных исходников или, если совсем не лень - прочитать точки входа в dll (но тут есть проблема - если имена слишком сильно "покаверкало", можно не отличить функции друг от друга biggrin.gif )

И да, таким образом,

Цитата
"RangedRand[%LLL%?rndx@@YAHHH@Z%"


в идеале можно записать как:

Цитата
"RangedRand[%LLL%rndx%"

(долго искал забугорные мануалы)

Vova, спасибо за статейку! Правда, хотелось бы ещё услышать про "Valid calling formats" для дебагера, дабы наши plugins-ы не уступали пиндосским)))

ph34r.gif доберусь до дома - буду много шаманить по этому поводу...


--------------------
Проекты ArtMetal - немного музыкального творчества))
Перейти в начало страницы
 
+Цитировать сообщение
Илья
сообщение 10.7.2014, 9:45
Сообщение #3


Активный участник
***

Группа: Пользователи
Сообщений: 137
Регистрация: 6.4.2009
Из: Россия г.Смоленск
Пользователь №: 65577



Цитата
Осмелюсь предположить, что сие можно извлечь из транслированного имени внутри dll

Практика показала, что экспорт из чистого VC++, написанного ТОЛЬКО руками (без прекомпиляции, заголовков и прочих "упрощений") с использованием экспорта на C и объявлением заголовка экспортируемых функций - позволяет записать в dll именно то имя функции которое пишется на c++))

То есть, можно делать экспорт без искажений, более того, DBP всё прекрасно понимает.

Так что:
1. Перед публикацией функции, объявляем её в хедере для экспортируемой dll. Описание экспортируемой функции происходит на C++, непосредственный экспорт на C
2. Переменную типа String на input берём за (const char*), на output за (char*)

Так что, всю схему, действительно, можно упростить до:
Код
"RangedRand[%LLL%rndx%"

"Имя[%Параметры%Адрес%Комментарий"


--------------------
Проекты ArtMetal - немного музыкального творчества))
Перейти в начало страницы
 
+Цитировать сообщение
Vova
сообщение 10.7.2014, 10:58
Сообщение #4


Активный участник
***

Группа: Пользователи
Сообщений: 569
Регистрация: 27.8.2009
Из: Москва
Пользователь №: 65609



Цитата(Илья @ 10.7.2014, 10:45) *
2. Переменную типа String на input берём за (const char*), на output за (char*)

Код
"RangedRand[%LLL%rndx%"


Да похоже на правду, надо будет сесть переписать все это дело и оформить во вторую часть =) и для примера чего то придумать =)


--------------------
Scio me nihil scire

Function OffSetSprite_to_M(spriteOffSet)
Offset Sprite spriteOffSet,sprite width(spriteOffSet)/2,sprite height(spriteOffSet)/2
EndFunction
Перейти в начало страницы
 
+Цитировать сообщение
Илья
сообщение 10.7.2014, 12:11
Сообщение #5


Активный участник
***

Группа: Пользователи
Сообщений: 137
Регистрация: 6.4.2009
Из: Россия г.Смоленск
Пользователь №: 65577



Кстати, есть замечания по поводу 1 части!

1. Не надо создавать заголовок и объявлять define-ы, только ради того чтобы компилятор их сам подставил, пользователю достаточно знать, что он должен присвоить коду ресурса значение, а то получается, что ты его нагружаешь лишней информацией)) то есть, достаточно создать 1 файл ресурсов и прямо в нём расписать коды ресурсов, без хедера на ресурсы и его include!

например:
Код
STRINGTABLE
{
129 "INI_OpenFile[%LSL%INI_OpenFile%INI_OpenFile(string,integer)"
130 "INI_GetValue[%SS%INI_GetValue%INI_GetValue(key as string) as string"
131 "INI_GetItemCount[%L%INI_GetItemCount%INI_GetItemCount(filename as string, pathFlag as integer)"
132 "INI_GetItemValue[%SL%INI_GetItemValue%INI_GetItemValue(filename as string, pathFlag as integer)"
133 "INI_GetItemKey[%SL%INI_GetItemKey%INI_GetItemKey(filename as string, pathFlag as integer)"
}

вместо ссылок на define:
Код
STRINGTABLE
{
IDS_STRING1 "INI_OpenFile[%LSL%INI_OpenFile%INI_OpenFile(string,integer)"
IDS_STRING2 "INI_GetValue[%SS%INI_GetValue%INI_GetValue(key as string) as string"
IDS_STRING3 "INI_GetItemCount[%L%INI_GetItemCount%INI_GetItemCount(filename as string, pathFlag as integer)"
IDS_STRING4 "INI_GetItemValue[%SL%INI_GetItemValue%INI_GetItemValue(filename as string, pathFlag as integer)"
IDS_STRING5 "INI_GetItemKey[%SL%INI_GetItemKey%INI_GetItemKey(filename as string, pathFlag as integer)"
}

а затем ещё и создавать хедер, который будет эти дифайны описывать, как советует твой самоучитель))
2. Есть нюанс! Когда пишем в C++, не забываем, что наличие такой вещи как ПЕРЕГРУЗКА обязывает создать функцию, которая возвращает значение во 2 экземпляре по void-у, ибо, если функция OpenTextFile(filename) возвращает логический 1, или 0, то пользователь DBP, будучи не осведомлён что "так нельзя" попытается не считывать значение, а просто вызовет функцию (ему не важно что файл не удалось открыть, просто важно содержимое функции), так вот, dbp будет использовать эту функцию ТОЛЬКО В ТОМ СЛУЧАЕ, если значение из функции прочитается!

наглядно покажу:

Код
OpenTextFile(FilenName) // Ошибка, такой функции нет!

Код
a=OpenTextFile(FileName) // Успех! функция действительно есть!


сишники поймут почему), так что, обезопасываем себя! перегружаем функцию для DBP:

Код
int OpenTextFile(const char* filename);
void OpenTextFile(const char* filename);


Если нужны оптимизированные примеры - могу подсобить, что нужно пояснить и выложить исходники, правда, пишу в VC2012, исходники и проекты в нём, но код будет работать и на более древних версиях (раньше под C++Bulder 6 писал)


--------------------
Проекты ArtMetal - немного музыкального творчества))
Перейти в начало страницы
 
+Цитировать сообщение
Vova
сообщение 10.7.2014, 13:49
Сообщение #6


Активный участник
***

Группа: Пользователи
Сообщений: 569
Регистрация: 27.8.2009
Из: Москва
Пользователь №: 65609



Цитата(Илья @ 10.7.2014, 13:11) *
Кстати, есть замечания по поводу 1 части!
......................................



blink.gif Ну мужик ты даешь, разобрал так разобрал... в свое оправдание могу сказать, что я не сишник tongue.gif

Если есть желание обновить пример welcome - лишним точно не будет...

Открыл pdf почитал, что писал тогда - мама кто это был, не я чур не я =)


--------------------
Scio me nihil scire

Function OffSetSprite_to_M(spriteOffSet)
Offset Sprite spriteOffSet,sprite width(spriteOffSet)/2,sprite height(spriteOffSet)/2
EndFunction
Перейти в начало страницы
 
+Цитировать сообщение
Илья
сообщение 11.7.2014, 11:35
Сообщение #7


Активный участник
***

Группа: Пользователи
Сообщений: 137
Регистрация: 6.4.2009
Из: Россия г.Смоленск
Пользователь №: 65577



Ну, если успею за выходные - распишу пример и как нужно настроить свой VC++.
В чём соль - если плагин чистая математика - проблем нет, но, если добавляются строки, массивы и объекты DBP - нужно подключить пакет SDK для плагинов DBP и, естественно, нужен DirectX SDK (замечу - пользователь плагина и самой программы, использующей плагин, ни в чём таком не нуждается! то - сугубо технические нужды для "создателя плагина") Ссылки на них могу дать, как ставить опишу.

Зачем? скажете вы - да всё просто, есть несколько нюансев, связанных, как я понял, с трансляцией кода DBP в ASM - простые строки (const char*) и (char*) непосредственно в DBP обязаны быть переданы в специфическом формате (указатель на область памяти), и, даже если нам, как создателям плагина, не нужны всякие там навороты вроде передачи анимации в функцию, для кодирования простейшей строки и обработки её в dll плагине, нужно подключить всё вышеперечисленную архитектуру.

Написав что достаточно указать именно const char* и char* - я ошибался, так как плагины использовал как внешние, а не зашитые в программу, так вот, если нужно использовать dll как внешнюю часть кода - пожалуйста, const char* и char*, если же плагин содержит обработку строк и его надо закинуть в папку user-plugins, и зашить в наш будущий проект - нужно попотеть)))

Так что, отпишусь позже.


--------------------
Проекты ArtMetal - немного музыкального творчества))
Перейти в начало страницы
 
+Цитировать сообщение
Илья
сообщение 21.7.2014, 15:44
Сообщение #8


Активный участник
***

Группа: Пользователи
Сообщений: 137
Регистрация: 6.4.2009
Из: Россия г.Смоленск
Пользователь №: 65577



За эти дни более детально описал возможности и способ работы с плагинами, если будут замечания, вопросы или предложения - отвечу!

Vova, надеюсь, используешь фрагменты моих рассуждений во 2 части))

За ранее говорю - описание кода по части c++ - НЕТ, ибо это другая степь, не связанная с вопросом!

Архив с исходными кодами: здесь
Прикрепленные файлы
Прикрепленный файл  Плагины.rtf ( 10,07 мегабайт ) Кол-во скачиваний: 98
 


--------------------
Проекты ArtMetal - немного музыкального творчества))
Перейти в начало страницы
 
+Цитировать сообщение
Илья
сообщение 22.7.2014, 15:18
Сообщение #9


Активный участник
***

Группа: Пользователи
Сообщений: 137
Регистрация: 6.4.2009
Из: Россия г.Смоленск
Пользователь №: 65577



Ещё несколько исходников плагинов, на примере которых можно чему то научиться))

Debug_PlugIn v3.00.002.140722160300[C++]
Utils_Files_PlugIn v2.01.010.140722151725[C++]
Utils_Math_PlugIn v2.01.010.140722110400[C++]
Utils_String_PlugIn v2.01.010.140722125830[C++]
Utils_System_PlugIn v2.01.010.140722154400[C++]

и, не забываем keywords'ы

Debug:
Код
[LINKS]
Debug_MessageBox==title as string, text as string

Utils_Files:
Код
[LINKS]
txtPrintf==(filename as string, text as string) as integer | filename as string, text as string
txtClear==(filename as string) as integer | filename as string

Utils_System:
Код
[LINKS]
sysDate==(void) as string
sysTime==(void) as string
sysDateFormat==(format as string) as string

Utils_Math:
Код
[LINKS]
hex==(str as string) as integer
fltToInt==(val as float) as integer
intToFlt==(val as integer) as float
GetDistanceAbs3DFlt==(x1 as float, y1 as float, z1 as float, x2 as float, y2 as float, z2 as float) as float
GetDistanceAbs2DFlt==(x1 as float, y1 as float, x2 as float, y2 as float) as float
GetDistanceAbs3DInt==(x1 as integer, y1 as integer, z1 as integer, x2, y2, z2) as integer
GetDistanceAbs2DInt==(x1 as integer, y1 as integer, x2 as integer, y2) as integer
GetDistance3DFlt==(x1 as float, y1 as float, z1 as float, x2 as float, y2 as float, z2 as float) as float
GetDistance2DFlt==(x1 as float, y1 as float, x2 as float, y2 as float) as float
GetDistance3DInt==(x1 as integer, y1 as integer, z1 as integer, x2 as integer, y2 as integer, z2 as integer) as integer
GetDistance2DInt==(x1 as integer, y1 as integer, x2 as integer, y2 as integer) as integer
GetPoint2DCollision==(x as float, y as float, x2 as float, y2 as float, w2 as float, h2 as float) as integer
GetPoint3DCollision==(x as float, y as float, z as float, x2 as float, y2 as float, z2 as float, w2 as float, h2 as float, d2 as float) as integer

Utils_String:
Код
[LINKS]
SplitCount==(sourceStr as string, delimeterStr as string) as integer
Split==(sourceStr as string, delimeterStr as string, index as integer) as string
GetLine==(str as string, pos as integer) as integer
StrColumnPos==(str as string, pos as integer) as integer
findPosUp==(sourceStr as string, pos as integer) as integer
findPosDown==(sourceStr as string, pos as integer) as integer
InStr==(str as string,subStr as string, pos as integer) as integer
DeleteStr==(str as string, pos as integer, length as integer) as string
InsertStr==(str as string, addStr as string, pos as integer) as string
StrBox==(str as string, x as integer, y as integer, w as integer, h as integer) as string
MidStr==(str as string, pos as integer, len as integer) as string
InQuotes==(str as string, str_open as string, str_end as string) as string
TrimLeft==(str as string) as string
TrimRight==(str as string) as string
TrimBoth==(str as string) as string
Replace==(sourceStr as string, findStr as string, replaceStr as string) as string
FormatText==(sourceStr as string) as string



--------------------
Проекты ArtMetal - немного музыкального творчества))
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 25.9.2017, 5:41
 X 
Ссылки на работы форумчан:
1. Cайт по использованию 3D технологий
в образовании

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight