ホームページ  >  記事  >  ウェブフロントエンド  >  DLL ActiveX コントロール WEB ページ呼び出し example_javascript スキル

DLL ActiveX コントロール WEB ページ呼び出し example_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 18:21:401696ブラウズ
1. 概要
プロジェクトの必要性のため、私は VC、DLL、ActiveX コントロールの学習と研究を始めましたが、入手可能な情報がなかったり、サンプルがなかったりしました。それは理解して実行できます。いいえ、自分で調べてください。努力は報われ、最終的には成功を収めることができます。笑、私は今、私自身の学びを要約し、それを必要としている人たちに捧げています。
DLL (ダイナミック リンク ライブラリ): WIN32 DLL と MFC DLL に分割
ActiveX: ATL コントロールと MFC コントロール (DLL とも) に分割
WEB: JAVASCRIPT 呼び出し-> ActiveX 呼び出し-> DLL加算操作を完了し、ページに表示される値を返します。
2. 開発 (VS2008)
1. DLL ライブラリの書き込み:
ファイル -> 新規作成 -> WIN32 コンソール -> プロジェクト名を入力 -> DLL を選択 -> 空のプロジェクト-"仕上げる。
(1) ソリューション パネルで、ヘッダー ファイル testdll.h を追加します。内容:
コードをコピー コード; port )
#endif
//extern "C" は、この部分が C/C で使用できることをコンパイラーに伝えます。
extern "C"
{
DECLDIR int Add( int a, int b );
DECLDIR void Function( void );
#endif


(2) ソリューション パネルで、実装ファイル testdll.cpp を追加します。内容:




コードをコピー

コードは次のとおりです:

#include #define DLL_EXPORT #include "testdll.h" extern "C" { / / ここで重要なことは ADD メソッドを使用します。 DECLDIR int Add( int a, int b )
{
return( a b );
}
DECLDIR void Function( void )
{
std::cout < ;< "DLL が呼び出されました!" <<:endl>}
}


(3) オプション。新しい WIN32 コンソール クラスを作成し、この DLL をテストします。
ファイル -> 新規 -> WIN32 コンソール -> プロジェクト名を入力 -> コンソール プログラムを選択 -> 空のプロジェクト -> 完了。
ソリューション パネルで、実装ファイルloaddll.cpp の内容を追加します。




コードをコピーします

コードは次のとおりです。


#include
#include typedef int (*AddFunc)(int,int);ポインタ関数、インターフェースを定義します。 typedef void (*FunctionFunc)(); int main() { AddFunc _AddFunc; FunctionFunc _FunctionFunc;"---DLL を取得します。 --."<< endl;
// L は、UNICODE 文字セットを使用することを意味し、プロジェクトの文字セットと一致している必要があります。
HINSTANCE hInstLibrary = LoadLibrary(L"E:\Project\VS\LoadDll\Release\TestDll.dll");
if (hInstLibrary == NULL)
{
cout <<" DLL の読み込み [失敗]。"<FreeLibrary(hInstLibrary);
}else{
cout <<"DLL の読み込み [成功]。"<}
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
{
FreeLibrary(hInstLibrary);//Release
}else{
cout <<"---DLL 関数を取得 [OK]---。 "<< endl;
}
cout << _AddFunc(1, 1) << endl; //
_FunctionFunc() の呼び出しを開始します; //
cin.get (); // プログラムがフラッシュしないようにフォーカスを取得します。
FreeLibrary(hInstLibrary);//呼び出し後、メモリを解放します。
戻り(1);
}


2. ActiveX コントロールの実装:
ここでは、MFC ActiveX の代わりに ATL コントロールの実装を選択します。
ファイル -> 新規 -> ATL プロジェクト -> プロジェクト名 (「FROMYANTAI」) を入力 -> ダイナミック リンク ライブラリ (DLL) を選択 -> 完了。
完了後、右側の「ソリューション エクスプローラー」に多数のヘッダー H ファイルと CPP 実装ファイルが生成されます。これらはデフォルトであり、変更する必要はありません。
(1) ALT 単純オブジェクトを追加します。プロジェクト名 (先ほど指定した名前) をマウスでクリックし、「クラスの追加」を選択し、ATL 単純オブジェクトを選択します。
次のステップ、名前を付けます:「ytiicrj」 -> 次のステップ: 他はすべて変更せず、サポートで「接続ポイント」と「IE オブジェクトのサポート」を選択します -> 完了。
次のステップは、WEB ページから呼び出せるように「ytiicrj」にメソッドを追加することです。 「クラスビュー」で「iytiicrj」(灰色の鍵アイコンがあります)を選択し、右クリックして追加→メソッドの追加を選択します。メソッドに「GetContent」という名前を付けます。「パラメータ属性には IN を選択し、パラメータ タイプには LONG を選択し、パラメータ名 A -」「続行します。パラメータ属性には IN を選択し、パラメータ タイプには LONG を選択します。パラメータ名 B -」追加; 続行します。 OUT とパラメータ属性 RETVAL を選択し、パラメータ タイプとパラメータ名として LONG* を選択します。 out –》追加---》クリックして完了します。
これにより、(最後の行に) 1 つが ytiicrj.H ヘッダー ファイルに追加されます。
STDMETHOD(GetContent)(LONG a, LONG b, LONG* out);
ytiicrj.CPP ファイルに追加されます。実装クラス:
コードをコピー コードは次のとおりです:

STDMETHODIMP CCaluNumCtrl::GetContent ( LONG a, LONG b, LONG* out)
{
// TODO: ここに実装コードを追加します
return S_OK>}

(2), in ytiicrj.H ファイルで、DLL クラス ライブラリを呼び出します。コードは次のとおりです。
// CaluNumCtrl.h: ytiicrj のステートメント 太字の部分は特定の実装であり、その他は変更されていません。

コードをコピーします コードは次のとおりです:
#pragma Once
#include " resource.h " // メインシンボル
#include // 追加
#include "AtlActiveX_i.h"
#include "_ICaluNumCtrlEvents_CP.h"
#if定義(_WIN32_WCE) ) && ! defined(_CE_DCOM) && !define(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "シングルスレッド COM オブジェクトは、Windows CE プラットフォーム (完全な DCOM サポートを提供しない Windows Mobile プラットフォームなど) では適切にサポートされていません。_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA を次のように定義します。 ATL がシングル スレッド オブジェクトの作成をサポートするように強制し、このモデルが唯一のスレッド モデルであるため、rgs ファイル内のスレッド モデルの使用を許可します。 DCOM 以外の Windows CE プラットフォームでサポートされています。 "
#endif
// ytiicrj
class ATL_NO_VTABLE Cytiicrj:
// 行を追加: セキュリティ プロンプトは削除されます。 -- ブラウザ呼び出しの実行時、秘密の質問は表示されません。
public IObjectSafetyImpl,
public IConnectionPointContainerImpl,
public CProxy_ICaluNumCtrlEvents 🎜>public IObjectWithSiteImpl
public IDispatchImpl
{
public:
//以下の 3 行の実装定義。
typedef int (*AddFunc)(int,int); //DLL ADD メソッドに対応する型定義。 Func はカスタマイズされており、必要に応じて記述できます。
HINSTANCE hInstLibrary;
AddFunc _AddFunc; //クラスマッピング
Cytiicrj()
{
//計算用の DLL の呼び出しを開始します。
hInstLibrary = LoadLibrary(L"TestDll.dll");//書き込んだ DLL ファイルをこのプロジェクトで生成されたディレクトリに配置します
if (hInstLibrary == NULL)
{
FreeLibrary( hInstLibrary) ;//リソース解放
}else{
}
//メソッドを呼び出し、メソッド ハンドルを返します。
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
}
DECLARE_REGISTRY_RESOURCEID(IDR_CALUNUMCTRL)
BEGIN_COM_MAP(Cytiicrj)
COM_INTERFACE_ENTRY(ICaluNumCtrl)
COM _INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
//行を追加: セキュリティ プロンプトを無効にします。 -- ブラウザー呼び出しの実行時に、セキュリティの質問は表示されません。
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(Cytiicrj)
CONNECTION_POINT_ENTRY(__uuidof(_ICaluNumCtrlEvents))
END_CONNECTION_POINT_MAP()
DECLARE_PROTECT _FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
FreeLibrary(hInstLibrary)
}
public:
STDMETHOD(GetContent); a, LONG b, LONG* out);
OBJECT_ENTRY_AUTO(__uuidof(CaluNumCtrl), Cytiicrj)


(3) ytiicrj.PP ファイルに戻り、次のように実装コードを追加します。
コードをコピー コードは次のとおりです:

STDMETHODIMP CCaluNumCtrl::GetContent(LONG a, LONG b, LONG* out)
{
// TODO: ここに実装コードを追加します
int sum = this->_AddFunc(static_cast(a),static_cast(b));
*out = static_cast(sum);
return S_OK ;
}

(4) DLL の生成:
このステップは非常に簡単です。リリース モードを選択し、生成するプロジェクトをクリックします (選択を求めるプロンプトが表示されます)。 REG32 を登録して選択します)。これにより、Release ディレクトリに多数のファイルが生成されますが、必要なのは DLL ファイルです。
3. DLL および ATL ActiveX コントロール DLL は CAB ファイルとしてパッケージ化されます。
例: test.CAB を生成した後、Web ページにダウンロードとインストールを求めるプロンプトが表示されます。
(1) 最初に setup.inf ファイルを定義します。このファイルには、ダウンロードしたコンテンツとターゲット ディレクトリ、バージョン番号と対応する DLL ファイルが記述されています。これは手動で記述する必要があります。私の内容は次のとおりです (名前は適宜変更してください):

コードをコピーします コードは次のとおりです。次のように:
[version]
; バージョンの署名 (NT と Win95 の両方で同じ)
signature="$CHICAGO$"
AdvancedINF=2.0
[コードの追加]
AtlActiveX.dll=AtlActiveX.dll
TestDll.dll=TestDll.dll
setup.inf=setup.inf
[install.files]
AtlActiveX.dll =AtlActiveX.dll
TestDll.dll=TestDll.dll
setup.inf=setup.inf
[AtlActiveX.dll]
clsid={4AE870B5-C7FB-4171-A47E-7F57AFD86F67}
file-win32-x86 =thiscab
FileVersion=1,0,0,1
DestDir=11
RegisterServer=yes
[TestDll.dll]
file-win32-x86=thiscab
DestDir=11
FileVersion=1,0,0,1
RegisterServer=yes
[setup.inf]
file=thiscab
[RegisterFiles]
%AtlActiveX。 dll
; INF ファイルの終わり

(2) リソースを統合します:
setup.inf ファイルを含むすべての DLL を 1 つのディレクトリに配置し、次のコマンドを実行します。 CAB パッケージ。
実行後、最初のオプションを選択し、次に 3 番目のオプションを選択し、次にファイルを追加 (DLL および INF ファイルを選択)、次に出力ディレクトリを選択して CAB ファイル名を作成し、次のステップの 2 番目のオプションを選択します。 2 番目のオプションを選択して、[OK] をクリックします。これにより、CAB ファイルが生成されます。
(3) WEB ページは、追加操作を実行するために ActiveX コントロールを呼び出します。
test.htm Web ページを作成し、CAB ファイルをディレクトリに配置します。test.htm の内容は次のとおりです。

コードをコピーします コードは次のとおりです。
🎜>新しいページ