Archive for 2010年7月15日|Daily archive page

newLISP.dll を C で使う

 Windows では、実行ファイル newlisp.exe の他に newlisp.dll があります。
 Unix の newlisp.so には、C 言語からの呼び出し例がマニュアルに載っていますが、newlisp.dll の項目 には、C 言語からの呼び出し例は載っていません。
 そこで、作ってみました(笑)。

 コンパイラが bcc の場合、

/* libdemo.c - demo for importing newlisp.dll
 *
 * use:
 *
 *    libdemo "(+ 3 4)"
 *    libdemo "(symbols)"
 *
 */
#include <stdio.h>
#include <windows.h>

typedef int (__stdcall *newlispAPI)(IN char* script);

int main(int argc, char* argv[])
{
	HMODULE hLibrary;
	newlispAPI func;

	if ((hLibrary = LoadLibrary("newlisp.dll")) == 0) {
	    printf("cannot import library\n");
		exit(-1);
	}

	func = (newlispAPI)GetProcAddress(hLibrary, "newlispEvalStr");

 	if (argc > 1) {
		printf("%s\n", argv[1]);
		printf("%s\n", func(argv[1]));
	}

	return(0);
}

 マニュアルにある Unix 版とほぼ同じ動作ですが、コマンドライン引数も出力するようにしてあります。
 また、引数は、"(ダブル・クォート)で囲みます。

 ついでに、Visual C++ の場合、こうなります。

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

typedef int (__stdcall *newlispAPI)(IN LPCSTR script);

int main(int argc, char* argv[])
{
	HMODULE hLibrary;
	newlispAPI func;

	if ((hLibrary = LoadLibrary(L"newlisp.dll")) == 0) {
	    printf("cannot import library\n");
		exit(-1);
	}

	func = (newlispAPI)GetProcAddress(hLibrary, "newlispEvalStr");

 	if (argc > 1) {
		printf("%s\n", argv[1]);
		printf("%s\n", func((LPCSTR) argv[1]));
	}

	return(0);
}

 キャストが微妙に違っています(笑)が、基本動作は同じです。

 さて、newlisp.dll の組込シンボルを symbols 使って見てみると、

Class
Tree
module

 の三つがありません。いずれも、予約変数または関数で、newlisp.exe にはあります。
定義がマニュアルにありますので、困ることはないでしょうが、ご使用の際は、ご注意を。

 以上、如何でしょうか?

広告