HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1220
ぽこぴんHSPで作成したプログラムをサービスから自動起動できない2未解決


ぽこぴん

リンク

2020/12/20(Sun) 19:28:58|NO.91969

お世話になります。

題名のとおり、Windowsのサービスを利用してHSPで作成したプログラムを自動起動したい
のですが、それができずに困っております。

具体的には、
Windowsが起動し、ログイン画面が表示されている状態の時に(ログイン前の状態の時に)、
私がHSPで作成したプログラムが自動で起動されるようにしたいと考えております。
サービスとして登録する際、sc コマンドを使い、HSPで作成したプログラムを登録できた
ものの、サービスを操作する画面からプログラムの起動を試みても、次のようなエラーが
発生してサービスを起動できません。

「ローカル コンピュータの XXXXXXX サービスを開始できません。
エラー 1053: そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。」

そもそも、HSPではサービスとして起動できるようなソフトウェアを開発することはできない
のでしょうか?

HSPは起動時にウィンドウを表示するようになっておりますので、サービスのようにバック
グラウンドで動かすようなソフトウェアの作成はできないのでしょうか?
Googleで検索してみましたが、全く手がかりがなく、こちらの掲示板でお尋ねする次第です。

ご教授いただく上で情報が不足している部分がありましたら、恐れ入りますがご指摘いただけ
れば幸いです。
よろしくお願いいたします。



この記事に返信する


TOMATO

リンク

2020/12/20(Sun) 20:26:23|NO.91970

「開始要求または制御要求に応答しませんでした」
ということなので、サービスアプリに必要なコールバック関数の実装・登録をしていないのではないでしょうか。

C++の実装例ですが、HSPでサービスアプリを作成するのは大変そうです。
スレッドも絡んでくるからねぇ…。
https://s-kita.hatenablog.com/entry/20130502/1367458848



MillkeyStars

リンク

2020/12/20(Sun) 20:49:47|NO.91971

StartServiceCtrlDispatcher を調べてください。
Windows サービスとして実行するなら最低でもこの関数を利用する事が出来なければ、サービスとして実行させることはできません。

https://docs.microsoft.com/ja-jp/windows/win32/api/winsvc/nf-winsvc-startservicectrldispatchera

サービス実行部またはサービス停止部は、StartServiceCtrlDispatcher を処理していく過程で見えてきますのであえて説明しません。

【サービス作成サンプル : C++】

#include <Windows.h> char ServiceName[] = "ServiceTestName"; SERVICE_STATUS g_serviceStatus = { 0 }; SERVICE_STATUS_HANDLE g_hServiceStatus = NULL; //サービスイベントハンドラー DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext) { switch (dwControl) { case SERVICE_CONTROL_STOP: //サービス停止イベント g_serviceStatus.dwCurrentState = SERVICE_STOP_PENDING; g_serviceStatus.dwCheckPoint = 0; g_serviceStatus.dwWaitHint = 50000; SetServiceStatus(g_hServiceStatus, &g_serviceStatus); break; case SERVICE_CONTROL_INTERROGATE: //サービス問い合わせイベント SetServiceStatus(g_hServiceStatus, &g_serviceStatus); break; default: break; } return NO_ERROR; } //WinMain 関数 int WINAPI WinMain(_In_ HINSTANCE hinst, _In_opt_ HINSTANCE hinstPrev, _In_ LPSTR lpszCmdLine, _In_ int nCmdShow) { SERVICE_TABLE_ENTRY serviceTable[] = { { ServiceName, ServiceMain }, { NULL, NULL } }; UINT32 TimeBench; //サービス状態の起動であるかチェックする //(サービスではない場所からプログラムが起動された場合、関数はアクセス拒否になる) if (StartServiceCtrlDispatcher(serviceTable) == FALSE) { } return 0; } //サービス登録及び実行・イベントハンドラー登録処理 VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { //サービスイベントハンドラー登録 g_hServiceStatus = RegisterServiceCtrlHandlerEx(ServiceName, HandlerEx, NULL); //サービス状況作成とサービスへ状態報告 g_serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; g_serviceStatus.dwCurrentState = SERVICE_START_PENDING; g_serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; g_serviceStatus.dwWin32ExitCode = NO_ERROR; g_serviceStatus.dwServiceSpecificExitCode = 0; g_serviceStatus.dwCheckPoint = 1; g_serviceStatus.dwWaitHint = 30000; SetServiceStatus(g_hServiceStatus, &g_serviceStatus); //サービス開始処理報告 g_serviceStatus.dwCurrentState = SERVICE_RUNNING; g_serviceStatus.dwCheckPoint = 0; g_serviceStatus.dwWaitHint = 0; SetServiceStatus(g_hServiceStatus, &g_serviceStatus); //ここからがサービス内プログラム //ここまでがサービス内プログラム //サービスの停止処理報告 g_serviceStatus.dwCurrentState = SERVICE_STOPPED; g_serviceStatus.dwCheckPoint = 0; g_serviceStatus.dwWaitHint = 0; SetServiceStatus(g_hServiceStatus, &g_serviceStatus); }



ONION software Copyright 1997-2023(c) All rights reserved.