Kuina-chan

くいなちゃん2019年11月14日


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

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

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

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

1外部DLLの読み込み

1.1外部DLLの呼び出し



Kuinでは他の言語で作成した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」以外にしても扱えますが、「.knd」だけは特別な用途に使われてエラーになりますので、「.knd」以外にしてください。
さて最後に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側では書き換えずに読み取り専用で扱うと良いでしょう。
(このページは執筆中です!)
1573721512jaf