サービスプログラムのデバッグがしたくて、 ServiceMain と、Handler 関数をエクスポートしてみた。
// MyService.def
EXPORTS
ServiceMain
Handler
さらに、テストプロを書いてみる
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#define MODULE_NAME "MyService.exe"
#define FUNCNAME_MAIN "ServiceMain"
#define FUNCNAME_HANDLER "Handler"
int main (int argc, char **argv)
{
HMODULE hModule = NULL;
char szCurrent[MAX_PATH];
char szModule[MAX_PATH];
DWORD dwRet = 0;
LPSERVICE_MAIN_FUNCTION lpfnServiceMain = NULL;
LPHANDLER_FUNCTION lpfnHandler = NULL;
ZeroMemory (szCurrent, sizeof szCurrent);
dwRet = GetCurrentDirectory (sizeof szCurrent, szCurrent);
if (!dwRet)
{
fprintf (stderr, "GetCurrentDirectory err -->(%d)\n", GetLastError ());
}
else
{
ZeroMemory (szModule, sizeof szModule);
wsprintf (szModule, "%s\\%s", szCurrent, MODULE_NAME);
hModule = LoadLibrary (szModule);
if (!hModule)
{
fprintf (stderr, "LoadLibrary err -->(%d)\n", GetLastError ());
}
else
{
lpfnServiceMain = (LPSERVICE_MAIN_FUNCTION) GetProcAddress (hModule, FUNCNAME_MAIN);
if (!lpfnServiceMain)
{
fprintf (stderr, "GetProcAddress(ServiceMain) err -->(%d)\n", GetLastError ());
}
else
{
lpfnHandler = (LPHANDLER_FUNCTION) GetProcAddress (hModule, FUNCNAME_HANDLER);
if (!lpfnHandler)
{
fprintf (stderr, "GetProcAddress(Handler) err -->(%d)\n", GetLastError ());
}
else
{
// とりあえず Handler をコールしてみた
lpfnHandler (SERVICE_CONTROL_CONTINUE);
}
}
FreeLibrary (hModule);
}
}
return 0;
}
結果は・・・呼び出せた。そんで動けば面白かったんだけど、サービスモジュール側でログ出力の処理がアクセスヴァイオレーションになってしまった。まあ、そううまくはいかないよね。一応、失敗談として。