Windows 7 64 ビット コンピュータで Embarcadero C++Builder 10.1 32 ビットを使用しています。Embarcadero IDE の CB10.1 32 ビット フリー バージョンですべてをコンパイルしています。lua 5.3.5 を dll にコンパイルしました。次に、lua.c を DOS 実行可能ファイル lua.exe (lua dll を使用) にコンパイルすると、正しく実行されているように見えます。luasocket 3.0rc1 を 2 つの dll (ソケットと MIME) に準拠させました。
luasocket スクリプト (ltn12.lua、mbox.lua、mime.lua、および socket.lua) は、「lua」フォルダーに配置されます。残りの luasocket スクリプト (「ftp.lua」、「headers.lua」、「http.lua」、「smtp.lua」、「tp.lua」、および「url.lua」) は、「socket フォルダー」に配置されます。「socket.dll」は「core.dll」に名前が変更され、「socket」フォルダーに配置されます。「mime.dll」は「core.dll」に名前が変更され、「mime」フォルダーに配置されます。
コンパイルした lua.c + dll を使用して、DOS プロンプトから lua を実行します。http/ftp/smtp リクエストを正しく行うことができます。lua はすべての luasocket core.dll および *.lua スクリプトを正しく検出できるようです。
しかし、https を使用する Web ページをリクエストすると、lua が 'https.lua' を読み込もうとすると、モジュールが見つからないというエラーが発生します。
そのため、luaSec 0.8 と OpenSSL 1.0.2s をコンパイルしてインストールしようとしています。
luaSec を WIN32 dll にコンパイルしたいと考えています。私はこれを行うことができます。必要に応じて「options.lua」を使用して新しい「options.h」を作成しました。DLL 依存関係プログラム (Dependency Walker 2.2) を使用すると、dll から 4 つのエクスポートされた関数が表示されます。
luaopen_ssl_config
luaopen_ssl_context
luaopen_ssl_core
luaopen_ssl_x509
dll の名前が core.dll に変更され、「ssl」フォルダーに配置されます。luaSec ディストリビューションの「https.lua」は「ssl」フォルダーに配置され、「ssl.lua」は「lua」フォルダーに配置されます。
それで:
私の lua スクリプトには luasocket が必要です。
local url = require("socket.url")
local http = require("socket.http")
luasocket (http.lua 内) には luaSec が必要です。
local https = assert(require("ssl.https"), 'LuaSocket: LuaSec not found')
次に luaSec (https.lua 内) には以下が必要です。
local ssl = require("ssl")
次に、luaSec (ssl.lua 内) には以下が必要です。
local core = require("ssl.core")
local context = require("ssl.context")
local x509 = require("ssl.x509")
local config = require("ssl.config")
「ssl.core」の最初の require が機能します。「ssl.context」の 2 番目の require は、「module 'ssl.context' not found」で失敗します。
luaSec を 4 つの dll (core.dll、context.dll、x509.dll、および config.dll) にコンパイルして、各 dll にエクスポートされた関数が 1 つだけあり、その関数名が require ステートメントと一致するようにすると、https 要求が機能します。
luaopen_ssl_x509、luaopen_ssl_context、およびluaopen_ssl_configの「core.dll」内でluaがどのように見えると予想されるかは、私にはわかりません。おそらく、lua の require() 関数は、dll ごとに複数のエクスポートされた関数をサポートしていません。
これに関するガイダンスはどこにも見つかりません。