forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Cpp/pb -> Dll -> Bb (http://forum.boolean.name/showthread.php?t=900)

Diplomat 10.05.2006 22:51

Собственно, вопрос туп и типичен. Спрашивать стыдно, однако сам методом тыка я решать это буду еще долго.

Откомпилил в Длл код на КодеБлоксах:
Код:

#define DLL_EXPORT __declspec(dllexport)
DLL_EXPORT int TestFunction( int NRec )
{
  return NRec*2;
}

И/или нечто подобное- на ПуреВасике:
Код:

Procedure TestFunction(x)
  x=x*2
  ProcedureReturn x
EndProcedure
End

Создал в юзерлибсах Блица файл "TestFunction.decls" с содержанием
Цитата:

.lib "TestFunction.dll"
TestFunction(x):"_TestFunction@4"

Наконец, черкнул в Блице код:
Код:

Print TestFunction(5)
WaitKey()
End

На обе Длл-ы Блиц пишет "User lib function not found".
Итак, собственно классический вопрос: Что делать?. ("Кто виноват"- не спрашиваю. Сам знаю кто):))

Кто знает, подскажите пожалуйста. Буду очень благодарен. Практически спасен от неминуемой жестокой смерти...

НУБ 10.05.2006 23:16

Ваобще для блица экспорт ф-ций должен выглядеть примерно так:

#define BBDECL extern "C" _declspec(dllexport)
#define BBCALL _stdcall

BBDECL void BBCALL что-то()
{
............
}

Ещё возьми в качалке blitz.pp.ru утилитку для просмотра длл, очень удобная вещь, сразу покажет все ф-ции в длл и то как их надо в деклсе оформить ;)

pax 10.05.2006 23:21

Вот еще статья про написание DLL для блица

http://hiromych.narod.ru/Blitz/articles/CppDll/DLL.htm

Diplomat 10.05.2006 23:28

Утилиту скачал. Сейчас прогляну. Спасибо!
Цитата:

#define BBDECL extern "C" _declspec(dllexport)
#define BBCALL _stdcall

КодеБлокс-ы такие дефайны корректно не воспорнимают. Это, как я понимаю, код для МсВижуалС.
Однако ж, и на Пурике библиотеки для Блица делали...

P.S. Статью я видел, трабла с ней- см. выше, но всё равно спасибо. :)

alcoSHoLiK 11.05.2006 00:56

Не пробовал создать внутри ДЛЛ-вской функции дополнительную переменную? Я не уверен, что можно так легко изменить значение самой x.

Diplomat 11.05.2006 12:36

http://www.games-creators.org/wiki/Creer_u...ic_pour_Blitz3D
И вот этот пример не работает.
Переделываю деклс под инструкцию- тоже не работает.
Может это только у меня?
8(

Maxus 11.05.2006 15:54

Цитата:

Originally posted by Diplomat@10.5.2006, 21:51
И/или нечто подобное- на ПуреВасике:
Код:

Procedure TestFunction(x)
 * * x=x*2
 * * ProcedureReturn x
EndProcedure
End


Вот твой код:
Код:

Procedure TestFunction(x)
  x=x*2
  ProcedureReturn x
EndProcedure
End

Вот Мой:
Код:

ProcedureCDLL.l TestFunction(x)
  x=x*2
  ProcedureReturn x
EndProcedure
End

Этот работает, сам проверял.

Diplomat 11.05.2006 20:15

Не-а: "User lib function not found".

А другие- работают. БлицОДЕ к примеру.

Значит где-то я косячу. Хоть и не представляю, где там в оставшихся 5 строках теоретически возможно накосячить. Крышесрывательное состояние.

jimon 12.05.2006 00:21

посмотри чем нить какие функции находятся в твоей dll ...

Maxus 12.05.2006 14:02

Цитата:

Originally posted by Diplomat@11.5.2006, 19:15
Не-а: "User lib function not found".

А другие- работают. БлицОДЕ к примеру.

Значит где-то я косячу. Хоть и не представляю, где там в оставшихся 5 строках теоретически возможно накосячить. Крышесрывательное состояние.

Код:

.lib "You.dll"
TestFunction%(x%)


Diplomat 12.05.2006 15:10

Да это-то понятно...не в том глюк...

Короче, переустановил Блиц, заново проставил 191 апдейт. Теперь откомпиленный ЕХЕ-шник правильно выводит значение х*2. Но дебаггер всё так же выводит ошибку.

P.S. Если кинуть ДЛЛ в системную папку Виндов- всё работает, если ДЛЛ в Юзерлибсах или папке проекта- нет.
Ладно, так уже терпимо- выкручусь.
Огромное спасибо всем за помощь. :ok:

P.P.S. Либа, откомпиленная на КодеБлоксах, также отлично работает, если соблюдать вышеприведенное простое правило. ;)

Diplomat 14.05.2006 17:06

Извините, но еще один вопрос. Надеюсь, поседний.

Хендлы в Блице - это целые числа. Указатели в Сях- это адреса памяти.
У меня есть блицевский банк в памяти и его хендл. Можно ли, и каким образом, "перевести" этот инт-овый хендл в формат адреса памяти, понятный для функции на С?

Спасибо за внимание и терпение.

tormoz 14.05.2006 18:35

Хендл Блитц - и есть адрес объекта в памяти

Diplomat 14.05.2006 20:08

Адрес. Но ведь в целочисленном формате.
Как его привести в понятный вид при передаче в функцию- вот что меня волнует?
Ессно, такая фича не прокатит:
код на Блице:
Код:

Bank=CreateBank(1)
PokeByte Bank,0,100
x=SomeFunction(Bank)

код функции на С:
Код:

#define DLL_EXPORT __declspec(dllexport)
int DLL_EXPORT SomeFunction(void *byte)
{
 * *int x=*(int*)byte;
 * *return x;
}


jimon 14.05.2006 23:35

int * x=(int*)byte;
хм

Diplomat 15.05.2006 01:05

А вот с этого места поподробнее? :D

alcoSHoLiK 15.05.2006 09:31

Я недавно писал приложение, демонстрирующее работу с банками и массивами через dll, но, похоже, удалил его. У Платона, может, осталось.

НУБ 15.05.2006 23:21

указатель на адрес памяти в блице менять не надо, просто пихаешь его на вход в ф-ю и всё ОК :)

BBDECL long BBCALL RetI(long *adresI)
{

........

}

Платон 18.05.2006 14:38

Вложений: 2
Цитата:

У Платона, может, осталось.

Угу, вроде осталось.

Diplomat 18.05.2006 15:35

Вложений: 2
Ага, спасибо! Ну теперь ясно, что у меня не работало...

Но возник еще один вопрос: на этот раз по Пурику.

Написаная на нем функция "выдерживает" лишь несколько тысяч вызовов, а потом программа вылетает без каких-либо сообщений. Подозреваю утечку памяти, однако не могу локализовать.
Более того, вылетает после нескольких вызовов ЛЮБАЯ откомпиленная на Пурике либа! Может просто на компьютере дрова кривые: ноутбук всё-таки...

Вот простейший пример. Протестите, пожалуйста, на предмет глюков. У меня программа вылетает через секунду работы. Более того, последняя запись в логе количества проходов цикла оказывается незаконченой:
Цитата:

...
258112
2

, что означает, что прога вылетает даже не при вызове самой функции, а в процессе выполнения следующей команды.

Зар.спс!

jimon 18.05.2006 17:38

как я помню запись в файл идет в другом потоке :/
поетому неправильно проверять по записи файла утечки памяти...

Diplomat 18.05.2006 17:56

Р-р-р-р! Ты мне только ответь: у тебя тоже вылетает, или нет?

Если да, то я лишь хочу знать где напартачил (хотя чему в ЭТОМ-то примере течь?), чтоб исправить и не повторять больше таких ошибок.

Работа стоит, куча математики по этим функциям, несколько нестандартных идей (кстати, надо будет не забыть выложить их на суд комьюнити...), солидный прирост скорости по сравнению с просчетом средствами Блица, а либа вылетает и всё коту под хвост...

Ужос! :blink:

tormoz 18.05.2006 18:56

вылетает там же где у тебя.
действительно странно.
а текст самой функции покажи

Diplomat 18.05.2006 19:04

Текст в архиве: "Test.pb".
Собственно, код чисто символический, тестовый:
Код:

ProcedureCDLL.w MyTest(x.w)
 Protected y.w
 y=x*2
 ProcedureReturn y
EndProcedure

Вариации любого рода конечного итога не меняют.

P.S. Пурик-3.91й. Качал в Осле. Можно его где-нибудь для сравнения еще скачать с комплектом лекарств?

alcoSHoLiK 18.05.2006 20:09

Вылетает почти сразу, в логе пусто.

Платон 18.05.2006 20:12

Угу, есть такое и в 4вертой версии. У меня мои либы тоже вылетают на N цикле в mav.
ЗЫ
Надо надеется что апдейт исправит этот баг.

Diplomat 18.05.2006 20:39

А в какой не вылетает? А то ж ситуация с простоем работы- просто какой-то пушной зверек- песец.

tormoz 19.05.2006 01:14

PureBasic_3_94_(c9nh3j).exe

я откатился на эту версию
у меня 4 ая даже компилить не хочет.

Guest 20.05.2006 10:57

Хз, у меня и на 3.93 версии вылетает.

2Tormoz
Что компилить нехочет? У меня вроде все нормально работает.

Diplomat 20.05.2006 13:33

Скачал 3.80. Вылетает, как штык!
Есть хоть какая-то версия, которая работает? :)

pax 20.05.2006 15:11

При выключенном дебаггере вылетает ошибка Stack overflow!

И хрен знает из-за чего...

pax 20.05.2006 15:27

Короче:

Код:

ProcedureDLL.w MyTest(x.w)
 *Protected y.w
 *y=x*2
 *ProcedureReturn y
EndProcedure

работает нормально...

а для:

Код:

ProcedureCDLL.w MyTest(x.w)
 *Protected y.w
 *y=x*2
 *ProcedureReturn y
EndProcedure

вылетает :dontknow:

пурик у меня 3.94

Diplomat 20.05.2006 15:57

Угу, и то правда! :)
У меня на 3.80 и 3.94 - та же картина.
Забавно. И немного странно.

P.S. Кстати, самое главное забыл! Отслеживаются ли такие либы на Пурике алчными поборниками копирайтов, или ДЛЛ не имеют явных отличительных черт и могут быть выданы за написанные на каком-нить ДевС ? То есть, платил ли реально кто-нибудь эти 300 баксов?

pax 20.05.2006 16:03

Цитата:

Originally posted by Diplomat@20.5.2006, 14:57
P.S. Кстати, самое главное забыл! Отслеживаются ли такие либы на Пурике алчными поборниками копирайтов, или ДЛЛ не имеют явных отличительных черт и могут быть выданы за написанные на каком-нить ДевС ? То есть, платил ли реально кто-нибудь эти 300 баксов?

А хрен знает, тока пурик по мойму стоит 99$

Maxus 14.06.2006 18:10

Цитата:

Сообщение от Diplomat
Извините, но еще один вопрос. Надеюсь, поседний.

Хендлы в Блице - это целые числа. Указатели в Сях- это адреса памяти.
У меня есть блицевский банк в памяти и его хендл. Можно ли, и каким образом, "перевести" этот инт-овый хендл в формат адреса памяти, понятный для функции на С?

Спасибо за внимание и терпение.

Вообщем число которое указывается в Блитз, это адрес на структуру БАНКА, в структуре есть размер БАНКА и АДРЕС на сам буффер данных, проверял когда то.


Часовой пояс GMT +4, время: 21:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot