Создание Dll |
Здравствуйте, гость ( Вход | Регистрация )
Создание Dll |
24.2.2009, 21:06
Сообщение
#21
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Как будто собралась. И вроде даже работает. Во всяком случае тестовый скрипт выполняется нормально.
PXSqlite3.rar ( 159.33 килобайт ) Кол-во скачиваний: 22 |
|
|
24.2.2009, 21:17
Сообщение
#22
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Круто!!! Браво alex82! Несколько таблиц в базе создаётся. Буду тестить дальше.
Как у тебя получилось не расскажешь? Горю от нетерпения узнать. |
|
|
24.2.2009, 21:30
Сообщение
#23
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Круто!!! Браво alex82! Несколько таблиц в базе создаётся. Буду тестить дальше. Как у тебя получилось не расскажешь? Горю от нетерпения узнать. PXSqlite3_src.rar ( 372.89 килобайт ) Кол-во скачиваний: 15 Подозреваю что всё дело в собаке (имеется ввиду не животное ) |
|
|
24.2.2009, 21:32
Сообщение
#24
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Не понял о чём ты?
С помощью чего компилил? |
|
|
24.2.2009, 21:38
Сообщение
#25
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
|
|
|
24.2.2009, 21:49
Сообщение
#26
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
BDS? Borland Developer Studio?
|
|
|
24.2.2009, 23:11
Сообщение
#27
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Setuper
CodeGear (читай Borland) C++ Builder. Но это не суть важно - C++ Builder прекрасно хавает проекты созданные в BDS, и, я так думаю, BDS схавает проект C++ Builder'а. |
|
|
24.2.2009, 23:42
Сообщение
#28
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Просто у меня BDS нету, есть только Builder C++ 6 и Visual studio 6, Visual studio 2005, Visual studio 2008.
C++ Builder 6 не открывает ни проект cbproj, ни bdsproj Я пытался компилить только на том, что у меня есть, а вообще я приверженец VS. |
|
|
24.2.2009, 23:54
Сообщение
#29
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Если не лень качать 800 с лишним метров, тогда вот -
|
|
|
24.2.2009, 23:58
Сообщение
#30
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Спасибо. Скачаю и попробую скомпилить.
|
|
|
7.3.2009, 14:00
Сообщение
#31
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Создание простейшей либы под API 2 (by Builder C++ 6).
Создаём dll проект (обязательно язык С). Пишем код: Код #include "lua.h" #include "lauxlib.h" #pragma link "PXLua.lib" int lua_hello(lua_State *L) { lua_pushstring(L, "Hello World!"); return 1; } Создаём в папке проекта def файл (Define.def) В созданный файл записываем: Код LIBRARY Project1.dll DESCRIPTION "Project1" EXPORTS lua_hello = @lua_hello @1 ; lua_hello(lua_State *) Сохраняем и добавляем в проект этот самый файл Define.def Сохраняем проект. Залезаем в настройки компилятора, и ставим calling convention: Register (J) Строи проект. После этого пишем lua скрипт: Код local Msg = package.loadlib("Project1", "lua_hello") if Msg then Core.SendToAll(Msg()) end Все необходимые заголовочные файлы прикладываю: files.rar ( 13.27 килобайт ) Кол-во скачиваний: 18 |
|
|
7.3.2009, 16:08
Сообщение
#32
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Если библиотека не создаёт ни одной функции, которую можно вызвать из скрипта, то при чём здесть вообще API2? Это обычная DLL-библиотека.
|
|
|
7.3.2009, 16:13
Сообщение
#33
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
А смысл тогда создавать библиотеку?
Библиотеку нужно создавать для того, чтобы взаимодействовали функции СИ с функциями LUA (в контексте данного форума). |
|
|
7.3.2009, 18:18
Сообщение
#34
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Ну ладно.
Тады продолжим в том же духе. Создание библиотеки под API2 Урок второй: Вызов WinAPI функции из Lua-скрипта. Необходимые инструменты: * PtokaX 0.4.x.x * Borland C++ Builder * Текстовый редактор с подсветкой кода C (в принципе, можно использовать редактор встроенный в C++ Builder, но лично мне он не очень нравится) * А также клавиатура, мышь, и немного мозга 1. Создаём проект DLL-библиотеки (на языке C), и сразу же лезем в его настройки (Project -> Options). Здесь выбираем Build configuration - Base, переходим на вкладку C++ Compiler -> General compilation, и меняем опцию Calling convention на Fastcall (Register). Далее переходим на на вкладку Linker -> Linking, и отключаем пункт Dynamic RTL. Ну вот, с настройками вроде разобрались. Теперь переименуем проект. Назовём его, ну, скажем, PXHello. 2. Пишем код: Код #include <windows.h> //Это необходимо для использования функций WinAPI #include "lua.h" #include "lualib.h" #include "lauxlib.h" #pragma comment(lib, "PXLua.lib") //Собственно, это и есть функция, которую мы будем вызывать из Lua-скрипта: static int msgbox (lua_State *L) { //Функциям, вызываемым из Lua-скриптов, всегда передаётся только один аргумент - адрес массива lua_State, который содержит информацию о состоянии Lua //При вызове функции из скрипта, её аргументы помещаются в стек. const char *header = luaL_checkstring (L, 1); //Забираем из стека первый аргумент функции const char *text = luaL_checkstring (L, 2); //Забираем из стека второй аргумент функции MessageBox(0,text,header,0); //Вызываем функцию WinAPI MessageBox return 0; } //Массив luaL_reg, содержащий список функций, которые можно будет вызвать из скрипта. В нашем случае функция всего одна. static const struct luaL_reg functions[] = { {"MessageBox", msgbox}, {NULL, NULL}, //Так всегда должен выглядеть последний элемент массива luaL_reg }; //Функция, вызываемая при инициализации библиотеки: int libinit (lua_State *L) { luaL_register (L, "Win", functions); //Второй аргумент - имя таблицы, в которую будут помещены функции, доступные из скриптов, третий аргумент - адрес массива luaL_reg (См. выше) return 1; } Далее создаём в папке проекта файл с расширением .def (имя файла может быть любым), и добавляем в него следующее: Код LIBRARY PXHello.dll EXPORTS luaopen_pxhello =@libinit @0 ; libinit(lua_State *) После чего добавляем файл в проект. 3. Сохраняем проект и компилируем библиотеку. 4. Пишем скрипт: Код require "pxhello" function OnStartup() Win.MessageBox("Hello World!!!", "Фигасе!!! Это работает!") --Первый аргумент - заголовок окна сообщения, второй - текст, отображаемый в окне end Если Вы всё сделали правильно, то при запуске скрипта появится сообщение: 2009_03_07_165023.gif ( 3.22 килобайт ) Кол-во скачиваний: 1 Ну, вроде бы всё. Во всяком случае на сегодня. Да, чуть не забыл. PXHello.rar ( 46.26 килобайт ) Кол-во скачиваний: 25 PXHello_source.rar ( 14.23 килобайт ) Кол-во скачиваний: 25 |
|
|
7.3.2009, 18:28
Сообщение
#35
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ага. Хорошо. Знакомая шняга (где-то я уже об этом же писал))).
Потихоньку может народ начнёт после прочтения данных статей писать нечто путнее. |
|
|
7.3.2009, 18:42
Сообщение
#36
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
|
|
|
7.3.2009, 18:46
Сообщение
#37
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Шняга - это общее понятие, никакая это на библиотека)))
|
|
|
31.12.2010, 5:32
Сообщение
#38
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 4 Регистрация: 3.12.2010 Пользователь №: 8 197 Спасибо сказали: 0 раз |
а как создать dll в delphi? cdecl меня убивает
в инете нарыл хидеры для delphi, но они для старых версий lua |
|
|
17.2.2011, 8:47
Сообщение
#39
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 4 Регистрация: 3.12.2010 Пользователь №: 8 197 Спасибо сказали: 0 раз |
попытался перевести второй код под Delphi
но выходит ошибка, не понимаю в чем дело помогите плиз!!! PtokaX 0.4.1.2 (lua версии 5.1.4?) Код library PXHello2; uses Windows; type lua_State = record end; Plua_State = ^lua_State; size_t = Integer; Psize_t = ^size_t; PLuaFunc = ^TLuaFunc; TLuaFunc = function (L: Plua_State): Integer; cdecl; PluaL_reg = ^TluaL_reg; TluaL_reg = packed record Name: PChar; Func: PLuaFunc; end; const pxlib = 'pxlua.dll'; function luaL_checklstring(L: Plua_State; numArg: Integer; s: Psize_t): PChar; cdecl external pxlib name '@luaL_checklstring'; procedure luaL_register(L: Plua_State; libname: PChar; const R: PluaL_reg); cdecl external pxlib name '@luaL_register'; function luaL_checkstring(L: Plua_State; N: Integer): PChar; begin Result := luaL_checklstring(L, N, nil); end; //Собственно, это и есть функция, которую мы будем вызывать из Lua-скрипта: function msgbox (L: Plua_State): Integer; cdecl; //Функциям, вызываемым из Lua-скриптов, всегда передаётся только один аргумент - адрес массива lua_State, который содержит информацию о состоянии Lua var header, text: PChar; begin //При вызове функции из скрипта, её аргументы помещаются в стек. header := luaL_checkstring (L, 1); //Забираем из стека первый аргумент функции text := luaL_checkstring (L, 2); //Забираем из стека второй аргумент функции MessageBox(0, text, header, 0); //Вызываем функцию WinAPI MessageBox result := 0; end; //Массив luaL_reg, содержащий список функций, которые можно будет вызвать из скрипта. В нашем случае функция всего одна. const functions: array [0..1] of TluaL_reg = ( (Name: 'MessageBox'; Func: @msgbox), (Name: nil; Func: nil) //Так всегда должен выглядеть последний элемент массива luaL_reg ); //Функция, вызываемая при инициализации библиотеки: function luaopen_pxhello2(L: Plua_State): Integer; cdecl; begin luaL_register(L, 'Win', @functions); //Второй аргумент - имя таблицы, в которую будут помещены функции, доступные из скриптов, третий аргумент - адрес массива luaL_reg (См. выше) result := 1; end; exports luaopen_pxhello2; begin end. PS: и вообще существуют ли в природе хидеры под новый луа? (под delphi естественно) |
|
|
17.2.2011, 9:53
Сообщение
#40
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ну и откуда у тебя компилятор узнает о том, что такое, например, TLuaFunc ?
|
|
|
Похожие темы
|
Сейчас: 23.12.2024, 10:05 |