関数の実装 (1)

  Hello.cpp に以下のコードを追加



  
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
  



  VB による実行テスト



標準モジュールを追加して以下のように記述して下さい

  
Public Declare Function MsgOk Lib "Hello" Alias "_MsgBox@4" _
( _
    ByVal lpMessage As String _
) As Long
  

フォームにコマンドボタンを追加して以下のように記述します

  
Private Sub Command1_Click()

    MsgOk ("こんにちは !")

End Sub
  



  VC (コンソール) による実行テスト

  
#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;
}
  



  RunDll32.exe で実行させるには

以下の関数を追加します。ビルド後は必ず システムディレクトリにコピーして下さい

  
HELLO_API void CALLBACK MsgBox2(
	HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
	MessageBox( hwnd, lpszCmdLine, "タイトル", MB_OK );
}
  

ファイル名を指定して実行で以下のように入力します

  
RunDll32.exe Hello.dll,_MsgBox2@16 こんにちは !
  



  PHP で実行するには

このままでは、関数名が良くないので、以下の記述を 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 を作成したほうが良いです




  ActivePerl で実行させるには

Win32-API モジュールがインストールされていない場合は、ppm でインストールします。
インストールされているかどうかは、ppm を実行後、query w* と入力して下さい
もし、その中になければ install Win32-API と入力します

  
use Win32::API;

$MsgBox = new Win32::API("Hello", "MsgBox", [P], N);
$MsgBox->Call('こんにちは !');
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ