C 記述のダイナミック リンク ライブラリ PHP DLL
新規-》プロジェクト-》win32 ダイナミック リンク ライブラリ-> 単純な DLL プロジェクト
関数の前にのみマークを付けます: ?"C"? ?_declspec(dllexport) 関数は他のプログラムから渡すことができます dll は と呼ばれます
extern "C" _declspec(dllexport) int add(int i1,int i2){ return i1+i2; }
(1) 静的リンク宣言:
#pragma comment(lib, "dll1.lib") extern "C" _declspec(dllexport) int add(int i1,int i2);
では、通常の関数と同じように呼び出すことができます。 DLL 内に多数の関数がある場合、DLL 開発者は通常、.h ファイルを開発し、関数の宣言を記述し、それらの関数が含まれている限り、他のユーザーが関数を呼び出せるようにします。
(2) ダイナミックリンク:
//はい
__cdecl __stdcall
やその他のさまざまな呼び出し規則、つまりパラメーターがスタックにプッシュされる順序などは、呼び出しが以下と一貫していることを確認する限り、当面は気にする必要はありません。
dll
の呼び出し規約は問題ありません。
関数ポインタの宣言 typedef int(__cdecl*? FunctionAdd)(int,int);
#include "stdafx.h" typedef int(__cdecl* FunctionAdd)(int,int); HMODULE hModule; //申明句柄 FunctionAdd add; //申明指针 hModule = LoadLibrary("dll1.dll");//调试时hModule为0x10000000 If(NULL==hModule){ //error. } add =(FunctionAdd)GetProcAddress(hModule,"add"); If(NULL==add){ //error } int r = add(1,1); FreeLibrary(hModule); //释放句柄
静的リンクと動的リンクの違い: 静的リンクでは、プログラムの起動時に DLL が存在するかどうかがチェックされ、存在しない場合は起動時にエラーが報告され、動的リンクはプログラムを開始できません。 DLLが存在するかどうかをプログラム起動時にチェックし、DLLが存在しない場合のロジックをプログラマが判断できます。
静的ライブラリと動的ライブラリを区別する必要があります。静的呼び出し DLL と動的呼び出し DLL。
?
3. プラグインの仕組み。
プログラミングで頻繁に使用する繰り返しコードを dll にカプセル化します。
、プログラムが開始したら、新しく追加した dll をロードして、PHP の ext dll
?
前提条件は、PHP 拡張機能のスケルトンが OK であることです
1. Windows に PHP ソース コード パッケージとバイナリ パッケージをインストールし、Visual C++ をインストールし、Microsoft Visual StudioCommonMSDev98Bin の絶対パスを Windows 環境変数に追加します
2. ソースコードパッケージを d:php_src
に解凍します。
3. d:php_srcext ソース パッケージ ディレクトリに入り、スケルトン フォルダーをコピーし、その名前を開発する拡張機能の名前に変更します (この場合は「linvo」
)
4. バイナリパッケージの dev ディレクトリにある php5ts.lib ファイルを、新しく作成した linvo ディレクトリ
にコピーします。
5. linvo ディレクトリ内の 3 つのファイル php_linvo.h、linvo.c、および linvo.dsp の名前を php_skeleton.h から php_linvo.h に、skeleton.c から linvo.c に、skeleton.dsp から linvo.dsp に変更します。コンテンツ内のすべての extname は linvo であり、EXTNAME は LINVO です。 (大文字と小文字を厳密に区別します
)
6. php_linvo.h ファイル (ヘッダー ファイル) を編集します
PHP_FUNCTION(confirm_linvo_compiled) の下に PHP_FUNCTION(hello); を記述して hello 関数を宣言します。
PHP_FE(confirm_linvo_compiled,??? NULL) の下に
を記述します
PHP_FE(こんにちは、??? NULL)
これは関数のエントリです。今度は関数本体を記述します
PHP_FUNCTION(confirm_linvo_compiled) 関数を見つけます。これはテスト関数です。この関数
の後に新しい関数を作成します。
PHP_FUNCTION(hello){ char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = spprintf(&strg, 0, "Hello,%s", arg); RETURN_STRINGL(strg, len, 0); }
コンパイル:
8. cmd コマンドラインを実行し、d:php_srcextlinvo ディレクトリ
に入ります。
9. msdev linvo.dsp /MAKE "linvo - Win32 Release_TS"
と入力します。
10. エラーがなければ、Release_TS フォルダー
が php_src ディレクトリに生成されます。
、コンパイルされた php_linvo.dll 拡張子 が含まれています。
使用:
11. 実行環境の php 拡張機能ディレクトリ ext
にコピーします。
12. php.ini を編集して extension=php_linvo.dll を追加し、Apache を再起動します
13. PHP ファイル
で次のステートメントを実行します。
echo hello('Linvo');
が出力されます
こんにちは、リンボ
14. echo phpinfo(); を通じて拡張機能のロードされた情報を確認することもできます。
?
でエラーが報告されます。
d:php_srcmainstreamsphp_stream_transport.h は、ファイル に typedef int socklen_t; を追加してコンパイルする必要があります。