|
|
extern "C" {
HELLO_API LONG __stdcall MsgBox( LPTSTR lpMessage )
{
MessageBox( NULL, lpMessage, "タイトル", MB_OK );
return true;
}
}
| |
|
出来上がった Hello.dll を Windows のシステムディレクトリにコピーして下さい
コマンドプロンプトから、Release ディレクトリに入り、以下のコマンドを実行します
|
dumpbin /EXPORTS Hello.dll
| |
|
|
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file Hello.dll
File Type: DLL
Section contains the following exports for Hello.dll
0 characteristics
41F61479 time date stamp Tue Jan 25 18:42:17 2005
0.00 version
1 ordinal base
5 number of functions
5 number of names
ordinal hint RVA name
1 0 00001030 ??0CHello@@QAE@XZ
2 1 00001000 ??4CHello@@QAEAAV0@ABV0@@Z
3 2 00001020 ?fnHello@@YAHXZ
4 3 00008A48 ?nHello@@3HA
5 4 00001040 _MsgBox@4
Summary
4000 .data
1000 .rdata
1000 .reloc
4000 .text
| |
|
|
|
標準モジュールを追加して以下のように記述して下さい
|
Public Declare Function MsgOk Lib "Hello" Alias "_MsgBox@4" _
( _
ByVal lpMessage As String _
) As Long
| |
|
フォームにコマンドボタンを追加して以下のように記述します
|
Private Sub Command1_Click()
MsgOk ("こんにちは !")
End Sub
| |
|
|
|
|
#include "stdafx.h"
#include <lightbox.h>
typedef LONG (__stdcall *LPFUNC)( LPTSTR lpMessage );
int main(int argc, char* argv[])
{
HINSTANCE lib;
LPFUNC MsgOk;
lib = LoadLibrary( "Hello.dll" );
if ( lib == NULL ) {
printf( "%s\n", "Hello.dll のロードに失敗しました");
return 1;
}
MsgOk = (LPFUNC)GetProcAddress( lib, "_MsgBox@4" );
if ( MsgOk == NULL ) {
FreeLibrary( lib );
printf( "%s\n", "_MsgBox@4 のアドレスの取得に失敗しました");
return 1;
}
MsgOk( "こんにちは !" );
FreeLibrary( lib );
return 0;
}
| |
|
|
|
以下の関数を追加します。ビルド後は必ず システムディレクトリにコピーして下さい
|
HELLO_API void CALLBACK MsgBox2(
HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
MessageBox( hwnd, lpszCmdLine, "タイトル", MB_OK );
}
| |
|
ファイル名を指定して実行で以下のように入力します
|
RunDll32.exe Hello.dll,_MsgBox2@16 こんにちは !
| |
|
|
|
このままでは、関数名が良くないので、以下の記述を Hello.def を作成してプロジェクトに追加します
|
LIBRARY "Hello.dll"
EXPORTS
MsgBox @1
| |
|
これによってエクスポートされる関数名は MsgBox になります。
dumpbin で内容を見ると以下のようになります
|
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file Hello.dll
File Type: DLL
Section contains the following exports for Hello.dll
0 characteristics
41F61978 time date stamp Tue Jan 25 19:03:36 2005
0.00 version
1 ordinal base
6 number of functions
6 number of names
ordinal hint RVA name
2 0 00001030 ??0CHello@@QAE@XZ
3 1 00001000 ??4CHello@@QAEAAV0@ABV0@@Z
4 2 00001020 ?fnHello@@YAHXZ
5 3 00008A48 ?nHello@@3HA
1 4 00001040 MsgBox
6 5 00001060 _MsgBox2@16
Summary
4000 .data
1000 .rdata
1000 .reloc
4000 .text
| |
|
以下のコードを Hello.php として コマンドラインから php.exe を Hello.php を引数として実行します
|
<?
if ( !extension_loaded( "win32" ) ) {
dl("php_w32api.dll");
}
$api = new win32;
$api->registerfunction("long MsgBox(string a) From Hello.dll");
$api->MsgBox("こんにちは !");
?>
| |
|
※ win32 モジュールは、まだ実用の段階ではありません。PHP からの利用は COM を作成したほうが良いです
|
|
Win32-API モジュールがインストールされていない場合は、ppm でインストールします。
インストールされているかどうかは、ppm を実行後、query w* と入力して下さい
もし、その中になければ install Win32-API と入力します
|
use Win32::API;
$MsgBox = new Win32::API("Hello", "MsgBox", [P], N);
$MsgBox->Call('こんにちは !');
| |
|
|
|