Dành cho người viết DLL bằng C++:
Viết một DLL dạng thô thôi. Đừng có COM kiếc gì nhé. Cũng đừng dùng Visual Basic.
Tạo một workspace Win32 DLL.
Tạo một file header cho workspace:
#ifndef _HEADER_
#define _HEADER_
extern "C" __declspec(dllexport)
void functionA();
extern "C" __declspec(dllexport)
void functionB();
#endif
Tạo file source:
#include "header.h"
extern "C" __declspec(dllexport)
void FunctionA()
{
....
}
extern "C" __declspec(dllexport)
void FunctionB()
{
....
}
Sau khi compile sẽ có 3 file được tạo ra, trong đó có cái dll.
Dành do RPG maker XP script
Để dùng một hàm trong DLL, ta cần tạo ra một object có tính global ở phần Main trong bộ script.
Ví dụ:
$gettickcount = Win32API.new 'kernel32','GetTickCount',"\0",'i'
Object trên gọi là gettickcount, có tính global vì có dấu $ đàng trước.
Object này sẽ là một hàm trong DLL. Lệnh Win32API.new sẽ tạo ra một hàm trong DLL.
'kernel32' là tên của DLL. Kernel32 là DLL đặc biệt của Windows, không phải DLL chúng ta tạo ra.
'GetTickCount' là tên của hàm cần dùng.
"\0" đây là parameter của hàm cần dùng. "\0" nghĩa là NULL, tức là hàm này không nhận thông tin vào.
'i' đây là output của hàm. Hàm này sẽ trả về một 'i' tức là integer.
Về parameter và output, ta có các ký hiệu: "n" hoặc "l" biểu diễn số, "i" biểu diễn số nguyên, "p" biểu diễn pointer và có thể là chuỗi, "v" biểu diễn void nghĩa là không có output.
Để có thể tạo ra nhiều parameter, ta dùng %w
Ví dụ : %w(p p l l) nghĩa là hàm DLL này sẽ cần 4 parameter: 2 chuỗi và 2 số long chẳng hạn.
Để kích hoạt hàm DLL, ta dùng lệnh call.
Ví dụ: i = $gettickcount.call()
Ví dụ:
Khai báo:
$mcisendstr = Win32API.new 'winmm.dll', 'mciSendStringA', %w(p p l l), 'l'
Thực hiện
$mcisendstr.call("Open movie\\aaa.wmv Type MPEGVideo alias film1 Style #{0x01000000}" ,0,0,0)
Hạn chế: Trong vòng 3 giây, nếu như engine của RPG maker XP không được kích hoạt (tức là hàm Graphics.update không được gọi đến) thì engine sẽ tự động thoát game. Vì vướng mắc này mà việc tạo ra script play movie rất khó khăn. Có nhiều giải pháp cho vấn đề play movie nhưng cũng khó mà thực hiện.
Nguồn :
http://phrogz.net/ProgrammingRuby/lib_windows.html#Win32API