Google
 
Web itpro-blogger.blogspot.com
月曜日, 4月 30, 2007

[C++]DLLパスの取得方法(VB取得方法)

・DLL側の記述方法

#include "TCHAR.H"

TCHAR szModuleFilePath[ _MAX_PATH + 1 ] = _T( "" );

BOOL APIENTRY DllMain(
HINSTANCE hinstDLL, // DLL モジュールのハンドル
DWORD fdwReason, // 関数を呼び出す理由
LPVOID lpvReserved // 予約済み
)
{
::GetModuleFileName( hinstDLL, szModuleFilePath, _MAX_PATH );

switch ( fdwReason )
{
case DLL_PROCESS_ATTACH: //DLLがロードされた時に呼び出される.
break;
case DLL_THREAD_ATTACH: //新たなスレッドを作成した時に呼び出される.
break;
case DLL_THREAD_DETACH: //作成されたスレッドが終了した時に呼び出される.
break;
case DLL_PROCESS_DETACH: //DLLがアンロードされた時に呼び出される.
break;
default:
break;
}
return TRUE;
UNREFERENCED_PARAMETER( hinstDLL );
UNREFERENCED_PARAMETER( lpvReserved );
}

SAMPLE_API char* APIENTRY getPath()
{
return (char*)szModuleFilePath;
}

SAMPLE_API void APIENTRY getVBAPath( OLECHAR* path )
{
char wModuleFilePath[sizeof( szModuleFilePath )];
memset( wModuleFilePath, 0x00, sizeof( wModuleFilePath ) );
strcpy( wModuleFilePath, getWchar_tToChar( szModuleFilePath ) );
SysFreeString( *path );
*path = SysAllocString( (OLECHAR*)wModuleFilePath );
}

・メモ
APIENTRYは、windef.hに「#define APIENTRY WINAPI」として定義されている。
#define SAMPLE_API extern "C" __declspec(dllexport)

・VB2005側の呼出し方法
Public Declare Auto Function getPath Lib "ファイル名.dll" () As System.Text.StringBuilder

Dim path As System.Text.StringBuilder = クラス名.getPath()
Dim getPath as String = path.ToString

・VBA側の呼出し方法
Public Declare Sub getVBAPath Lib "ファイル名.dll" (ByRef path As String)

Dim path As String
Call getVBAPath(path)


▼質問
関数毎にファイルを分けてプログラミングするとDLLのパスがうまく取得できない。どうすればいいの?

▼回答
下記のようにすれば取得できるよ。

TCHAR szModuleFilePath[ _MAX_PATH + 1 ] = _T( "" );
HINSTANCE hinstDLL = ::GetModuleHandle(TEXT("DLLファイル名.dll"));
::GetModuleFileName( hinstDLL, szModuleFilePath, _MAX_PATH );






Comments: コメントを投稿

<< Home

This page is powered by Blogger. Isn't yours?