ホームページ  >  記事  >  バックエンド開発  >  C ダイナミック リンク ライブラリ PHP DLL をコンパイルする

C ダイナミック リンク ライブラリ PHP DLL をコンパイルする

WBOY
WBOYオリジナル
2016-06-13 13:15:17996ブラウズ

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

などの新しい機能を追加します。

?

Windows で PHP 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 関数を宣言します。

7. linvo.c ファイル (メインファイル) を編集します

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(); を通じて拡張機能のロードされた情報を確認することもできます。
?

VC6 を介してプロジェクト スペース ファイルを開いて DLL をコンパイルすると、php_stream_transport.h

でエラーが報告されます。 d:php_srcmainstreamsphp_stream_transport.h は、ファイル に typedef int socklen_t; を追加してコンパイルする必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。