4

Lua ビルドにソケット関数を埋め込むような関数を実装したいと考えています。したがって、socket.core.dll をコピーする必要はもうありません (楽しみのためです)。

メーリング リストを検索すると、このトピックについて話し合っている人が何人 かいます。

しかし、詳細な手順について質問があります。lua と luasocket のコードを変更して (dll メソッドではなく) 連携させるための詳細な手順を教えてください。

VC2008 を搭載した Windows XP で次の手順を試しました。

1) luasocket コードを Lua プロジェクトにコピーします。

2) いくつかのコードを追加します

static const luaL_Reg lualibs[] = {
  {"", luaopen_base},
  {LUA_LOADLIBNAME, luaopen_package},
  {LUA_TABLIBNAME, luaopen_table},
  {LUA_IOLIBNAME, luaopen_io},
  {LUA_OSLIBNAME, luaopen_os},
  {LUA_STRLIBNAME, luaopen_string},
  {LUA_MATHLIBNAME, luaopen_math},
  {LUA_DBLIBNAME, luaopen_debug},
  {LUA_SOCKETLIBNAME, luaopen_socket_core}, // add this line
  {LUA_MIMELIBNAME, luaopen_socket_core}, // add this line
  {NULL, NULL}
};

3) プロジェクトをビルドして実行します。

と入力すると、正しいprint(socket._VERSION)と表示されます。luasocket 2.0.2

と入力すると、それも正しいprint(socket.dns.toip("localhost"))と表示されます。127.0.0.1 table: 00480AD0

しかし、バインドなどの他の機能を使用しようとすると、機能しません。

誰がその理由を教えてくれますか?

4

3 に答える 3

6

次のように、luasocket を package.preload テーブルに入れる必要があります。

lua_getfield(L, LUA_GLOBALSINDEX, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_socket_core);
lua_setfield(L, -2, "socket.core");

// add mime.core yourself...
于 2012-11-07T07:08:29.750 に答える
1

luasocket は混合 C/lua モジュールです。余分なファイルなしで動作させたい場合は、両方のバージョンをアプリケーションにバンドルする必要があります。

socket.lua は socket.core をロードします (socket/core.dll から)
mime.lua は mime.core をロードします (mime/core.dll から)

したがって、アプリケーションを機能させるには、すべての .dll ファイルと .lua ファイルをアプリケーションにビルドし、それらを手動でロードする (またはカスタム パッケージ ローダーを介して正しくロードされるように設定する) 必要があります。

あなたが引用した電子メールは、require が呼び出されたときに組み込みの C コードが正しく読み込まれるように、package.preload テーブルを微調整しています (今では少し奇妙に見えますが、とにかく機能する可能性があります)。

于 2010-02-20T03:54:26.967 に答える
0

実行してみてください

for k, v in pairs(socket) do print(k, v) end

そして多分私達は助けることができるでしょう。

于 2010-02-05T01:51:18.293 に答える