トップ回答者
ATL(Windowsサービス)からMFCで作成したODBCクラスを用いたDBアクセスの方法

質問
-
お疲れ様です。
Visual Studio 2012/C++(ATL)のウィザードで作成したWindows7向けのWindowsサービスから、
起動したスレッドからMFCで作成されたODBCのCRecordsetにデータベースにアクセスしようとしていますが、
CRecordset::Open()メソッドの呼び出しで落ちてしまいます。
これは、ATLからのMFCで作成したCRecordsetの使用を禁止しているのでしょうか??
それとも、何か特別なことをやらないといけないのでしょうか??
ご教授をお願いいたします。
- 編集済み studio EVERGREEN 2013年10月22日 11:58
回答
-
「落ちる」とは、「強制終了してしまう」のですよね?
エラーでそのまま終了シーケンスが走る(または、起動に失敗したという処理で終わる)ということではありませんよね?
そのサービスの問題の箇所(と思われる部分)をデバッグすることはできますか?サービスとしてデバッグ可能であれば、デバッガで原因を探ってみてください。
もし、サービスとしてはデバッグできない場合は、通常プロセスとして実行させてデバッグしてみてください。
ATLのサービスプロジェクトは、レジストリを見て自身を通常プロセスとして実行する仕組みを持っています。
ATLのソースを確認してもらえばわかりますが、AppId キー(自分のモノ)にある、LocalService というレジストリ値の存在を確認して、サービスとして動かすかどうかを決めています。
もし、通常プロセスとして起動させるのは問題がなく、サービスで動かすと強制終了するというのであれば、アクセス権の問題などが考えられますが、現時点では原因がわかりませんので、まずは原因を絞り込むところから始める必要があると思います。
とっちゃん@わんくま同盟, Microsoft MVP for Visual C&#43;&#43;(Oct 2005-) <a href="http://blogs.wankuma.com/tocchann/"> http://blogs.wankuma.com/tocchann/</a>
- 回答としてマーク studio EVERGREEN 2013年10月23日 8:15
すべての返信
-
theApp(CWinAppまたは派生クラスのインスタンス)がありませんよね?また、初期化処理も行われていないですよね?
まずはここの部分を初期化しておかなければ、MFCのオブジェクトは使えません。
MFCではないプロジェクト(その形式は問わない)からMFCのオブジェクトを呼び出したい場合は、そのプロジェクトをMFC化する(一部のC++プログラムのみ実現可能)か、レギュラーDLLにMFCオブジェクトをおしこめ、それを外部から呼び出す形をとるかのいずれかになります。
MFCはその構造と歴史的な経緯により、サービスプロセスを作成することができません。ですので今回の場合は、レギュラーDLLの形をとるのがよいと思います。
CRecordsetなどのデータベース系はAPIレベルも含め、触ったことがないので詳細はわかりませんが、もしメッセージ処理を行っている場合はUIスレッド(通常、ServiceMain(OnStartなどが呼ばれるスレッド)で利用する必要があるので注意してください。
※UIスレッドは、メッセージループ(CAtlServiceModuleT::RunModalLoop() の実装と同じようなもの)が動いているスレッドを指します。画面に何かを表示するものを指しているわけではないので誤解しないようにしてください。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
-
「落ちる」とは、「強制終了してしまう」のですよね?
エラーでそのまま終了シーケンスが走る(または、起動に失敗したという処理で終わる)ということではありませんよね?
そのサービスの問題の箇所(と思われる部分)をデバッグすることはできますか?サービスとしてデバッグ可能であれば、デバッガで原因を探ってみてください。
もし、サービスとしてはデバッグできない場合は、通常プロセスとして実行させてデバッグしてみてください。
ATLのサービスプロジェクトは、レジストリを見て自身を通常プロセスとして実行する仕組みを持っています。
ATLのソースを確認してもらえばわかりますが、AppId キー(自分のモノ)にある、LocalService というレジストリ値の存在を確認して、サービスとして動かすかどうかを決めています。
もし、通常プロセスとして起動させるのは問題がなく、サービスで動かすと強制終了するというのであれば、アクセス権の問題などが考えられますが、現時点では原因がわかりませんので、まずは原因を絞り込むところから始める必要があると思います。
とっちゃん@わんくま同盟, Microsoft MVP for Visual C&#43;&#43;(Oct 2005-) <a href="http://blogs.wankuma.com/tocchann/"> http://blogs.wankuma.com/tocchann/</a>
- 回答としてマーク studio EVERGREEN 2013年10月23日 8:15