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;
хм


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

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