問題の切り分けができず、質問します
1.VC側作成環境
Windows XP Pro VC++ 6.0(SP6)
サービス.EXE ビルド(Win32 Release Minisize)
2.VB側作成環境(他者作成)
Windows NT4.0(SP6)
VB6(SP5)
ODBCDirectを使いSymfowareデータベースに
RDA-SV ODBC3.0に接続
3.共用実行環境
上記開発環境とは別に Windows NT4.0WS
Symfowareデータベース
それぞれ、ランタイムDLLのバージョンを開発環境で使用しているもの
にあわせてあります
1で作成したサービスEXEを
コマンドラインから”サービスEXE /Service”でOSに登録
サービスマネージャで「デスクトップとの対話をする」にチェックを
入れてあります
それぞれ、共通でOffice2000(Pro)フルインストール
問題
2の環境で作成されたVBアプリが、1の環境で作成したサービスEXEから
CreateProcessにより起動されたときデータベースへの接続ができなくなってしまう
また、バッチファイルを経由して
起動前に”CD /D C:\XXX\CCCCとVBアプリが入っているフォルダを
指定してもDB接続ができません
ノートパッド、コンソールアプリ、バッチファイルの起動はサービスEXEから
正常に起動されます
ほかのDBアプリケーションは試してません
エクスプローラからVBアプリをダブルクリックで実行すると、正常に実行できます
そこで、私が作成したサービスEXE側に問題があると思いこちら側に質問を行います
アプリケーション起動に使用しコード(抜粋)
ZeroMemory( &si , sizeof( STARTUPINFO ));
ZeroMemory( &pi , sizeof( PROCESS_INFORMATION ));
si.cb = sizeof( STARTUPINFO );
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
//
sprintf(CMD,%s %s, ds_GROUP[u_idx].D_CMD , ds_GROUP[u_idx].D_OPT);
RT_CD = CreateProcess( NULL ,CMD ,NULL ,NULL ,FALSE ,
CREATE_NEW_PROCESS_GROUP, // 0
NULL ,NULL ,&si ,&pi);
ds_GROUP[u_idx].D_CMDの値はフルパス
ds_GROUP[u_idx].D_OPTの値はNULL
VBアプリ側の問題なのか、VC側(CreateProcessの使い方)の問題なのか切り分けが
出来ず困っています
もし仮にVBアプリ側だった場合、解説ページ等をご紹介ください
VB側やり取りは、掲示板趣旨と違いますし、私本人の作成物ではございません
ので申し訳ございませんが、作成者に伝えますが、ご返事いたし兼ねることが
ございます(VB側ラウンジへ移動します)マルチにならない様先にこちらで
質問しています
VC側がわであれば、ここで何が変なのか教えてください
よろしくお願いします。
ちょっと訂正
(誤)VC側がわであれば、ここで何が変なのか教えてください
よろしくお願いします。
↓
(正)VC側であれば、ここで何が変なのか教えてください
「自分ならばこうするだろうか」という観点から。
> 2の環境で作成されたVBアプリが、1の環境で作成したサービスEXEから
> CreateProcessにより起動されたときデータベースへの接続ができなくなってしまう
という記述をみると、「VBアプリの起動はできている」と受け取れます。
質問文からはVCサービスEXEでの CreateProcess は成功しているように受け取れます。
もしそうなら、VBアプリからデータベース接続できない処理を重点的に
調べたほうが良いように思います。
・VBアプリからデータベースへ接続する際のパラメータ
・VBアプリでのデータベース接続失敗時のエラー詳細
質問内容に要求されている回答とは違うかもしれませんが、一応ご参考に。
サービルからCreateProcessすると実行ユーザがSYSTEMになってたり
するけどそのあたりは大丈夫なつくりなのかなぁ?VB
CreateProcessAsUserあたりの偽装について調べてみると幸せになれたり。
レスありがとうございます
>実行ユーザがSYSTEMになってたり
調べ方はわかりませんが、goolgeなどで検索してみます
>CreateProcessAsUserあたりの偽装について調べてみると
調べてみます
でも、何か渡し足りないからVB側がエラー(RDO系)起こすみたいです
今のところ何を渡すべきかいまだ不明です
エクスプローラからの実行はやはり、エラー出ません
ほかのアプリでも結構ですので、似たような経験を解決された方いませんでしょうか
>>実行ユーザがSYSTEMになってたり
>調べ方はわかりませんが、goolgeなどで検索してみます
「デスクトップとの対話をする」に設定したんですよね?
同様にサービスマネージャで「ローカルシステムアカウント」を選択して
いれば SYSTEM ですが (^^;
それだと、ローカルシステム上はオールマイティに近いですがネットワーク
参照の権限はありませんね。
ODBC 管理の設定(コントロールパネル)も確認する必要があるんじゃないで
しょうか。自分は DB には詳しくないのでよくわからないですが。
>>CreateProcessAsUserあたりの偽装について調べてみると
>調べてみます
サービス実行のユーザー設定を DB アクセスができている
ユーザーにして実行してみてはいかかでしょう。
もしも CreateProcessAsUser を使うためにプログラム中でユーザーパスワードを
扱う必要が出てくるようであれば、サービス設定で割り当てする運用にしたほうが
セキュリティ上は安全だと思います。
あと、他のサービス(DB接続のクライアントサービスとか)に依存するようなら、
そのサービスよりも後に起動されるように設定しておかないと。
現象再確認しました
VBアプリのエラーは
実行時エラー:-2147467259(80004005)
[Microsoft][ODBC Driver Manager]データソース名および指定された既定のドライバー
が見つかりません
ですがVBアプリに限らず、VC6で作成したODBC接続アプリも同様の現象を発生することが
確認できました
どちらの場合も、ユーザー:Administrator で実行してます
Win32 Console アプリから「wood 2004/10/23(土) 08:09:30」に提示したコードで
ODBC接続アプリを起動しましたがエラーは発生しませんでした
サービスとして登録された、アプリケーションから
ODBC接続を利用したアプリケーションを起動(CreateProcess)した場合だけ
ODBC接続の阻害をしているみたいです
以上のことから表題「問題の切り分け」結果として
VCで作成した自作サービスEXEに問題があるようです
目的は達成されたように見える「CreateProcess」の使い方
または実現方法に問題があるようです
何故、目的達成後(他のEXEの実行)の状態に問題が発生してしまうのか不明ですが
レス頂いた方々ご協力ありがとうございました
このスレッドをクローズし、後で別の観点での質問をしたいと思います