2024年04月20日くいなちゃん


プログラミング言語Kuin」の言語仕様16、Kuinの上級者向け機能についてです。

このページは上級者向けの内容です。

通常は、このページの内容を使わなくても便利なように設計していますが、どうしても特殊なことをしたい場合には活用してください。

また少しでも間違えると正しく動かず、エラーの特定もしづらいため、このページの機能は十分理解した上で慎重に進めてください。

1exeからの外部DLLの読み込み

1.1exeからの外部DLLの呼び出し



動作環境に「exe」を指定したた場合、他の言語で作成したx64向けDLLを呼び出すことができます。 例えばC++で図1-1のように書き、Visual C++でx64向けにコンパイルしてDLLを作成します。
  1. #include <Windows.h>
  2.  
  3. BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID)
  4. {
  5.   return TRUE;
  6. }
  7.  
  8. extern "C" _declspec(dllexport) double Square(double x)
  9. {
  10.   return x * x;
  11. }
図1-1: test_dll.cpp
出来上がったDLLが「test_dll.dll」という名前だったとすると、Kuin側のプログラムは図1-2と書くことでDLL内の関数を呼び出せます。
  1. func[test_dll.dll, Square]square(x: float): float
  2. end func
  3.  
  4. func main()
  5.   do cui@print(@square(5.0).toStr() ~ "\n")
  6. end func
図1-2: read_dll.kn
1行目のように「func[DLLのファイル名,DLL内の関数名]任意の関数名(引数):戻り値」という関数を定義しておくことで、5行目のようにDLL内の関数をKuinの関数として呼び出すことができます。
1行目のようなDLLの関数定義の中身に処理を書くと、その処理を行ってからDLLが呼び出されますが、必要なければ空にします。 DLLのファイル名は、拡張子を「.dll」以外にしても扱えます。
さて最後にtest_dll.dllを、Kuinが生成したexeの配下にコピーする必要があります。 メニューの「編集」の「その他の設定...」を選び、関連ファイルに「test_dll.dll」を追加します。 これでexe配下の「data」フォルダ以下にtest_dll.dllが自動コピーされ、exeから呼び出せます。
CUI環境で実行すると、画面に「25」と表示されます。

1.2値型



Kuinの値型(非参照型)は、DLLの関数の引数や戻り値の型と、表1-1の対応関係があり、そのままやりとりできます。
表1-1: 値型の関係
Kuinの型 DLLの型
int 8byte 符号あり整数型
float 8byte 浮動小数点型
char 2byte 文字型(UCS-2)
bool 1byte 論理型
bit8 1byte 符号なし整数型
bit16 2byte 符号なし整数型
bit32 4byte 符号なし整数型
bit64 8byte 符号なし整数型
enum 8byte 符号あり整数型

1.3参照型



Kuinの参照型は、ガーベージコレクションでメモリ管理をしているため、DLL側で書き換える場合には注意が必要です。 ルールが複雑なため、通常はDLL側では書き換えずに読み取り専用で扱うと良いでしょう。
(このページは執筆中です!)
1713603850jaf