関数の実装 (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('こんにちは !');
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[cmaterial]
claudebot
24/03/29 07:04:58
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube