1

Тема: Проблема с DLL собранной в c++ Builder

Доброго дня суток!!! По примерам с сайта создал свою длл...вот ее код

#pragma hdrstop
#pragma argsused
#define LUA_LIB
#define LUA_BUILD_AS_DLL
#include <stdio.h>

extern "C" {
#include <lauxlib.h>
#include <lualib.h>
#include <lua.h>
}


int _libmain(unsigned long reason)
{
    return 1;
}


 static int forLua_TestFunc(lua_State *L)// Возвращает заданный текст
{
    lua_pushstring(L, "Привет из C/C++");
    return(1);
}


static const struct luaL_Reg R[] ={
    {"TestFunc", forLua_TestFunc},
    {NULL, NULL}
};

extern "C"  LUA_API int  _stdcall luaopen_MyFun (lua_State *L)
{
luaL_openlib(L, "MyFun", R, 0);
return (1);

}

через программу  PE Explorer проверил экспортируемые функции....
// Type     : Exports
// luaopen_MyFun; Index 1;        Information not available
// ___CPPdebugHook; Index 2;        Information not available


Затем написал вот такой скрипт Луа

require("MyFun")
message(tostring(MyFun.TestFunc()), 1)
function main()
end

После запуска скрипта Квик выдает следующую ошибку..."Unknown error. Possible unhandled exception."
Не понимаю в чем проблема(.

2 (2015-05-03 14:35:54 отредактировано swerg)

Re: Проблема с DLL собранной в c++ Builder

Например в том, что перед luaopen_MyFun есть _stdcall, которое не нужно, т.к. в Lua-dll используется cdecl соглашение о вызовах (которое в С++ по умолчанию).
Возьмите готовый пример за основу, не делайте совсем с нуля. Я ж его специально выложил, чтобы были готовые для копирования куски.

В любом случае спасибо за подробный, но при этом маленький по объёму пример проблемы. Это идеальный вариант задавания вопросов на форумах.

3

Re: Проблема с DLL собранной в c++ Builder

Сделал все по примеру...Приложу на всякий случай код

#pragma hdrstop
#pragma argsused
#define LUA_LIB
#define LUA_BUILD_AS_DLL
#include <stdio.h>
#include <windows.h>
#include <process.h>
extern "C" {
#include <lauxlib.h>
#include <lualib.h>
#include <lua.h>
}


int _libmain(unsigned long reason)
{
    return 1;
}



// реализация функций, вызываемых из LUA

static int forLua_GetCurrentThreadId(lua_State *L) {
    // возвращаем одно значение, полученное от Win API функции
    lua_pushinteger(L, GetCurrentThreadId());
    return(1);
}

static int forLua_MultTwoNumbers(lua_State *L) {
    // получаем первый и второй параметры вызова функции из стека с проверкой каждого на число
    double d1 = luaL_checknumber(L, 1);
    double d2 = luaL_checknumber(L, 2);

    // помещаем в стек результат умножения
    lua_pushnumber(L, d1 * d2);

    return(1);  // эта функция возвращает одно значение
}

static int forLua_MultAllNumbers(lua_State *L) {
    const int n = lua_gettop(L);  // количество переданных аргументов
    double res = 1;
    bool isNumberFound = false;
    for (int i = 1; i <= n; ++i)
        if (lua_type(L, i) == LUA_TNUMBER)
        {
            res *= lua_tonumber(L, i);
            isNumberFound = true;
        }

    if (isNumberFound)
        lua_pushnumber(L, res);
    else
        lua_pushnil(L);

    return(1);
}

// регистрация реализованных в dll функций, чтобы они стали "видимы" для LUA

static struct luaL_reg ls_lib[] = {
    {"GetCurrentThreadId", forLua_GetCurrentThreadId},
    {"MultTwoNumbers", forLua_MultTwoNumbers},
    {"MultAllNumbers", forLua_MultAllNumbers},
    {NULL, NULL}
};

extern "C"
 LUALIB_API int luaopen_luacdll(lua_State *L) {
    luaL_openlib(L, "luacdll", ls_lib, 0);
    return 0;
}

Скрипт полностью из примера....
Теперь в квике:
ошибка error loading module 'luacdll' from file '.\luacdll.dll':
    Не найдена указанная процедура.

4 (2015-05-03 15:33:27 отредактировано swerg)

Re: Проблема с DLL собранной в c++ Builder

ошибка error loading module 'luacdll' from file '.\luacdll.dll':
    Не найдена указанная процедура.

А вот теперь бы самое время посмотреть что экспортируется из DLL.
Судя по ошибке, не экспортируется или экспортируется с "неожиданным" именем функция luaopen_luacdll

Вот статья про предыскажение имен функций в компиляторах С++, правда дата у нее не очень свежая.
Из написанного там пока понятно лишь, что надо добавить в проект def-файл с именами экспортируемых функций, который (на сколько я могу судить о этой статье) для BCB работает.

Возможно, в вашей версии С++ Builder уже есть подходящая директива компилятора, чтобы имена не предыскажались, но её надо еще сыскать.

Вы каким именно (в смысле версии) компилятором пользуетесь?

Кстати, вы ведь не забыли добавить в проект определение директив препроцессора LUA_LIB и LUA_BUILD_AS_DLL ?

5

Re: Проблема с DLL собранной в c++ Builder

RAD studio XE 7

6

Re: Проблема с DLL собранной в c++ Builder

swerg пишет:

Кстати, вы ведь не забыли добавить в проект определение директив препроцессора LUA_LIB и LUA_BUILD_AS_DLL ?

Нет не забыл я ее прописал так

#define LUA_LIB
#define LUA_BUILD_AS_DLL

7

Re: Проблема с DLL собранной в c++ Builder

)ЗАРАБОТАЛО))))))))) Помогла статья ( создание алиасов в def файле!)...  И еще хотел бы спросить совет.... У меня есть задача пересадить своего робота полностью на луа.....избавиться от quik api и DDe... из статей понял что это можно сделать через сокеты......С сокетами к сожалению не работал....и не совсем понимаю какие объемы  языка луа мне необходимо изучить....чтобы мое приложение на с++ общалось с квиком через длл...в сторону чего вообще копать !!!

8

Re: Проблема с DLL собранной в c++ Builder

Искал так и сяк в интернете - похоже нет для C++ builder варианта отключить декорирование без DEF-файла. Грустно это.