1

さて、私はかなり検索しましたが、これを達成する方法の答えや例を見つけることができないようです。

基本的に、移植可能に設計されたアプリがあります(VS2010ではVC ++を使用して構築されていますが、MFCまたは管理対象コンポーネントはなく、生のWinAPIです)。Lua 5.2が組み込まれていて、ユーザーがアプリケーション内でスクリプトを記述できるようにしています。さまざまなWinAPI呼び出しを処理するLuaスクリプトに公開されている複数の接着関数があります。

ただし、私ができるようにしたいのは、ユーザーが次のようなスクリプトを記述できるようにすることです。

require[[Alien/alien]]

local mb = alien.User32.MessageBoxA
mb:types{ 'long', 'long', 'string', 'string', 'long' }
print(mb(0, "Hello World!", "Test", 64))

私は単にこれを行う方法を見つけることができないようです。ユーザーにLuaforWindowsのインストールを要求したくありません。理想的には、エイリアンからのcore.dllとstruct.dllはありません。./alien/にあるこれらのDLLで何かをしようとすると、LuaForWindowsをインストールし、LFWをアンインストールしたため、Lua5.1.dllでクラッシュし、Lua5.1.dllが見つからないと表示されます。私はLua5.2をアプリに組み込んでいるので、明らかにエイリアンロックのコア/構造体DLLはLua5.1.dllがパスにあることを期待しています。

Alien srcをプロジェクトに含めようとする価値のない試みをしましたが、そのようにも機能していないようです。

任意のアイデアをいただければ幸いです。すべてがアプリに含まれていることを望みますが、それが唯一の選択肢である場合は、プロジェクトにライブラリを含めてビルドし、ディストリビューションにバンドルするという解決策を選びます。

ありがとう!

アップデート:

わかりました、Ben Voigtに感謝します!もうすぐそこにいると思います。core.cとstruct.cをプルして、libffiのすべてのパスがそこにあることを確認しました。core.c(alien.core srcファイル)でluaopen_alien_coreを呼び出そうとするまで、すべてが問題なくコンパイルされ、識別子が宣言されていないと主張します。呼び出しを行おうとしている別のソースファイルで関数シグネチャを宣言しようとしましたが、コンパイルはさらに進みますが、未解決の外部ファイルについて文句を言うのに失敗します。

明らかに、これは現在一般的なC ++の問題である可能性があります(私はこの分野の初心者にすぎないため)。これが私が持っているものの一般的な考え方です:

//core.c (from Alien project)

(...)

int luaopen_alien_core(lua_State *L) {
  alien_register_library_meta(L);
  alien_register_callback_meta(L);
  alien_register_function_meta(L);
  alien_register_buffer_meta(L);
  lua_getglobal(L, "alien");
  if(lua_isnil(L, -1)) {
    lua_newtable(L);
    lua_pushvalue(L, -1);
    lua_setglobal(L, "alien");
  }
  lua_newtable(L);
  lua_pushvalue(L, -1);
  lua_setfield(L, -3, "core");
  alien_register_main(L);
  return 1;
}

//mysource.c (the file attempting to call luaopen_alien_core(L))

void initLua()
{
    L = luaL_newstate();
    luaL_openlibs(L);
    luaopen_alien_core(L);
    (...)
}

これはコンパイルの開始に失敗し、エラーを発行します。

error C3861: 'luaopen_alien_core': identifier not found

これは理にかなっているので、myheader.hに次の行を追加します。

int luaopen_alien_core(lua_State *L);

これはコンパイルされますが、リンクに失敗します:

error LNK2001: unresolved external symbol "int __cdecl luaopen_alien_core(struct lua_State *)" (?luaopen_alien_core@@YAHPEAUlua_State@@@Z)

限られた経験で、考えられるいくつかのことを試しましたが、このエラーを満足させるものはありません。core.cの内容をmysource.cに移動しようとさえしましたが、それはまったく異なる混乱を引き起こし、そのままでは間違った方法であるように見えました。

私はこれが本当にばかげていることを望んでいて、想像していますが、luaopen_alien_coreを呼び出す方法がわかりません。これは、私が必要とする最後のピースのようです。

再度、感謝します!}

4

1 に答える 1

1

requireディレクティブはダイナミックライブラリをロードし、そのコンテンツをアクティブなLuaエンジンに追加すると思います。

エイリアンをコードに直接リンクすることで、ダイナミックライブラリが不要になります。ただし、コンテンツ列挙コードは実行されないため、実行に使用することはできませんrequire。そうしないと、DLLファイル(およびすべてのDLL依存関係)が検索されます。

requireしたがって、 DLLのロード後にディレクティブが呼び出す関数を確認し、Luaエンジンを作成するときにそれらを呼び出す必要があります。その場合、スクリプトをで始める必要も許可もされませんがrequire [[Alien/alien]]、Alienオブジェクトは使用可能になります。

于 2012-01-09T05:10:51.777 に答える