DLLを作成する
////////////////////////////////////////////////////////////////////////////////// // // ファイルヘッダ // // < プロジェクト名 > // // < プロセス > 共通関数ライブラリ(DLL) // // < ファイル概要 > // @(s) // ソケット送信処理 // // < 履 歴 > // @(h) ZZsocsend_VC.cpp ver 0.0 ( '99.04.15 ) // 新規作成 // ////////////////////////////////////////////////////////////////////////////////// // インクルード定義 #include "stdafx.h" #include "zz_com.h" #include "nhk_def.h" // 各端末共通 デファイン定義 #include "nhk_imsg.h" // 各端末共通メッセージ構造体定義 // デファイン定義 // 外部参照定義 // ソケット切断処理
extern "C" __declspec(dllexport) long __stdcall ZZsocclose_VC(int);
////////////////////////////////////////////////////////////////////////////////// // // 関数ヘッダ // // 機能 : ソケット送信処理 // // 返り値 : 正常 RC_NORMAL // 異常 RC_ERROR // // 機能説明 : 電文をソケットに送信する。 // 異常終了時にソケットを削除する。 // // 備考 : この関数が呼ばれる前に、ソケットの初期化が完了していること。 // VC++タスクよりコールされる。 // // //////////////////////////////////////////////////////////////////////////////////
extern "C" __declspec(dllexport) long __stdcall ZZsocsend_VC(
int soc, // [IN] ソケットハンドル
char * send_buf, // [IN] 送信バッファ
unsigned int send_len // [IN] 送信サイズ
)
{
// 内部参照定義
long rsts; // 関数戻り値
rsts = send(soc,send_buf,send_len,0); // 送信
if(rsts == SOCKET_ERROR) // エラー
{
rsts = WSAGetLastError( ); // エラー番号取得
ZZsocclose_VC(soc); // ソケット切断
return RC_ERROR; // 異常終了
}
return RC_NORMAL; // 正常終了
}
必要なヘッダファイルをインクルードします。
; zz_com.def : DLL 用のモジュール パラメータ宣言
LIBRARY "zz_com"
DESCRIPTION 'zz_com Windows Dynamic Link Library'
EXPORTS
; 明示的なエクスポートはここへ記述できます
ZZsocopen_VC @1
ZZsocclose_VC @2
ZZsocsend_VC @3
@の後ろの数字は順番に割り当てて下さい。
//////////////////////////////////////////////////////////////////////////////////
//
// ファイルヘッダ
//
// < プロジェクト名 > システム
//
// < プロセス > サーバイベント管理プロセス
//
// < ファイル概要 >
// @(s)
// DLL初期化処理
//
// < 履 歴 >
// @(h) SVEVdllinit.cpp ver 0.0 ( '00.06.08 )
// 新規作成
//
//////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SVEVcom.h"
// デファイン定義
// 外部参照定義
//////////////////////////////////////////////////////////////////////////////////
//
// 関数ヘッダ
//
// 機能 : DLL初期化処理
//
// 返り値 : 正常 TRUE
// 異常 FALSE
//
// 機能説明 : DLL化された関数を使用可能にする。
//
// 備考 :
//
//////////////////////////////////////////////////////////////////////////////////
bool SVEVdllinit( void )
{
char DllPathName[255]; // DLLパス
int Ret; // 関数戻り値
// デバッグ文出力
TRACE("%s[%d] 開始\n",__file__,__line__);
//-----------------------------------------------------------------------------
/// DLLとのリンクを確立
//-----------------------------------------------------------------------------
// DLLファイルパスの取得
// DLLのパス名を取得する
memset( DllPathName, NULL, sizeof(DllPathName) );
Ret = SVEVpathget( REGKEY_DLLPATH, DllPathName );
if( Ret != RC_NORMAL ) // パス名称取得エラーか
{
// デバッグ文出力
TRACE("%s[%d] DLLファイルパス名取得失敗\n",__file__,__line__);
sprintf( &DllPathName[0], "DLLファイルパス名の取得に失敗しました。\nレジストリキー(%s)を確認してください。", REGKEY_DLLPATH );
// エラー出力メッセージを編集する
AfxMessageBox( &DllPathName[0], MB_OK | MB_ICONERROR );
// エラーメッセージ表示
return( FALSE ); // エラーで戻り値を返す
}
// パス名とDLL名を連結する
strcat( DllPathName, DLL_NAME );
// インスタンスにDLLをリンクする
Inst_ZZ_VC = LoadLibrary( DllPathName );
// リンク失敗
if( Inst_ZZ_VC < (HINSTANCE)HINSTANCE_ERROR )
{
// デバッグ文出力
TRACE("%s[%d] LoadLibrary失敗\n",__file__,__line__);
// エラーでリターンする
return( FALSE );
}
//-----------------------------------------------------------------------------
/// DLL関数のアドレスを取得
//-----------------------------------------------------------------------------
// ソケット送信処理の関数アドレスを取得する
ZZsocsend_VC = ( long( _stdcall * )( int, char *, UINT ) )
GetProcAddress( (HMODULE)Inst_ZZ_VC, _T("ZZsocsend_VC" ) );
// アドレス取得失敗
if( ZZsocsend_VC == NULL )
{
// デバッグ文出力
TRACE("%s[%d] ZZsocsend_VC()アドレス取得失敗\n",__file__,__line__);
// エラーでリターンする
return( FALSE );
}
// デバッグ文出力
TRACE("%s[%d] 終了\n",__file__,__line__);
// 正常でリターンする
return( TRUE );
}
手順としてはDLLのパス名を取得して、リンクを張ります。
//////////////////////////////////////////////////////////////////////////////////////
// DLL参照用宣言
//////////////////////////////////////////////////////////////////////////////////////
// インスタンス
EXTERN HINSTANCE Inst_ZZ_VC; // ZZ_VC.DLLへのインスタンス
//////////////////////////////////////////////////////////////////////////////////////
// DLLの関数プロトタイプ宣言
//////////////////////////////////////////////////////////////////////////////////////
// ソケット送信処理
EXTERN long ( _stdcall * ZZsocsend_VC )( int soc,
char *send_buf,
UINT send_len );
//-----------------------------------------------------------------------------
/// DLLリンク解放処理
//-----------------------------------------------------------------------------
// DLLのリンクが有効かチェック
if( Inst_ZZ_VC >= (HINSTANCE)HINSTANCE_ERROR )
{
// DLLのリンクを解放する
Ret = FreeLibrary( Inst_ZZ_VC );
}
これで、DLLが使えると思います。