<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Своя DLL для Lua: как реализовать работу my = require('mylib')]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=296&amp;type=atom" />
	<updated>2019-08-02T11:15:52Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=296</id>
		<entry>
			<title type="html"><![CDATA[Re: Своя DLL для Lua: как реализовать работу my = require('mylib')]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2425#p2425" />
			<content type="html"><![CDATA[<p>Прикольно)</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2019-08-02T11:15:52Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2425#p2425</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Своя DLL для Lua: как реализовать работу my = require('mylib')]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2424#p2424" />
			<content type="html"><![CDATA[<p>Вы конечно будете очень смеяться, но я наконец-то [url=https://www.lua.org/pil/26.2.html]прочел справку[/url] <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /><br />Читал я её и раньше, но наконец-то прочел вдумчиво.<br />Всё оказалось столь просто, что даже неприлично:</p><div class="quotebox"><blockquote><p>When it returns, luaL_openlib leaves on the stack the table wherein it opened the library. The luaopen_mylib function returns 1 to return this value to Lua. (As with Lua libraries, this return is optional, because the library is already assigned to a global variable. Again, like in Lua libraries, it costs nothing, and may be useful occasionally.)</p></blockquote></div><p>Т.е. надо всего лишь заменить возвращаемое из luaopen_StaticVar значение на 1 (вместо 0):</p><div class="codebox"><pre><code>LUAW32_API  int luaopen_StaticVar(lua_State *L)
{
    luaL_register(L, &quot;stv&quot;, lib_functions);

    return 1;
}</code></pre></div><p><span class="bbu">Важно</span>: так просто только в том случае, если непосредственно перед выходом из luaopen_XXX идёт вызов luaL_register() (оно же luaL_openlib по-старому), т.к. luaL_register()&nbsp; оставляет после себя на стеке таблицу с функциями библиотеки (см. цитату из документации выше).</p><p>Т.е. в этом смысле&nbsp; luaopen_XXX вероятно&nbsp; полностью эквивалентна любой другой функции С, вызываемой из Lua, т.е. возвращаемое из неё число есть количество оставленных на стеке результатов, которые можно присвоить результирующим переменным для данного вызова из Lua.</p><p>Странно, я был уверен, что проверял такой вариант ранее...</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2019-08-02T08:51:17Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2424#p2424</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Своя DLL для Lua: как реализовать работу my = require('mylib')]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2422#p2422" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Что еще надо добавить в luaopen_StaticVar(), чтобы через <strong>my</strong> тоже заработало?</p></blockquote></div><p>может return 0 заменить на return stv? по принципу модулей луа.</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2019-08-01T10:53:40Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2422#p2422</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Своя DLL для Lua: как реализовать работу my = require('mylib')]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2420#p2420" />
			<content type="html"><![CDATA[<p>Во всех нормальных DLL библиотеках для Lua доступен такой синтаксис подключения / использования:</p><div class="codebox"><pre><code>my = require(&#039;mylib&#039;)

my.метод_из_dll()</code></pre></div><p>Т.е. не зависимо от того, в какое пространство имён добавляется сама библиотека в рамках своего кода (во втором параметре при вызове <strong>luaL_register</strong>), к методам библиотеки можно получить доступ через присвоение своей переменной при результата вызова require(), в приведённом тут примере - через <strong>my.</strong></p><p>Но я не понимаю как это сделано! Ни в одной сделанной мной библиотеке этого не происходит.<br />Изучение других библиотек понимания тоже не добавляет.</p><p>Кто знает - приведите пример, пожалуйста, как должно выглядеть наполнение функции luaopen_XXX(), чтобы указанный синтаксис в Lua срабатывал?</p><p>Я пишу просто:</p><div class="codebox"><pre><code>static struct luaL_reg lib_functions[] = {
    {&quot;SetVar&quot;, lua_SetVar},
    {&quot;GetVar&quot;, lua_GetVar},
    {&quot;SetVarList&quot;, lua_SetVarList},
    {&quot;GetVarList&quot;, lua_GetVarList},
    {&quot;UseNameSpace&quot;, lua_UseNameSpace},
    {&quot;GetCurrentNameSpace&quot;, lua_GetCurrentNameSpace},
    {nullptr, nullptr}
};

LUAW32_API  int luaopen_StaticVar(lua_State *L)
{
    luaL_register(L, &quot;stv&quot;, lib_functions);

    return 0;
}</code></pre></div><p>Но тогда только так:</p><div class="codebox"><pre><code>my = require(&#039;StaticVar&#039;)

stv.метод_из_dll()  -- &lt; -- так работает, явно указано имя из вызова luaL_register

my.метод_из_dll()  -- &lt; -- так НЕ работает, &quot;нет метода&quot;</code></pre></div><p>Что еще надо добавить в luaopen_StaticVar(), чтобы через <strong>my</strong> тоже заработало?</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2019-08-01T09:53:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2420#p2420</id>
		</entry>
</feed>
