64bit版RIAServerからCallDLLするとエラー(-197)で落ちる
64bit版RIAServerのサーバロジック(バッチタスク)からCallDLL関数で64bit版DLLを実行して成功された事例のある方いますでしょうか。
といいますのは某帳票ツールで32bit版DLLと64bit版DLLが用意されていて、あらかじめREGSVR32に登録しておくのですが、開発版では『CallDLL ('svfrclient.…』とコールして、64bit版RIAServerでは『CallDLL ('svfrclient64.…』と動的に切り替えているのですが後者はエラー(-197)で落ちてしまいます。
サポートにどうやって問い合わせするか考えている所です。。
-
エラーの197番ですと、コンテキストが消滅しているというエラーなのですが、コンテキストIDがサーバでタイムアウトしているということはありませんか?バッチは時間的にはどのくらい掛かる処理なのでしょうか?
-
ISHJIMA様
サポートには動的にコールしたいので実行環境が32bitか64bitか判定する方法を聞いて『OSEnvGet('ProgramFiles')』ですと回答を頂いて、いざ動かすと落ちました。DLL側の問題ですと一蹴されないような問合せ方を考え中です。失礼な話これって動いたことあるの?ってレベルで質問しました。
64bit開発用バックグランドエンジンは知らなかったです、開発版からデバッグ出来ないって思ってた所です。ありがとうございます。
tanda様
バッチ時間は1秒もありません。mgerrorログには『Execution Path:』で始まるメモリクラッシュの時みたいな原因不明の落ち方をしています。この場合はメモリのダンプを送るようにサポートに言われるやつです。ありがとうございます。
-
-103とか、-104のエラーではなくて、-197で落ちているっていうのがちょっと気になりますね。エラー発生後もアプリケーションはまだ動いているっていうことですかね?そのコンテキストだけがエラーで強制排除されているってことでしょうかね?
-
tanda様
mgerrorでエラーコードらしきものは『ERR-THREAD-ABORTED (-139)』だけでした。クライアント側のエラーは(-197)でアプリは終了してしまいます。サーバのインスタンスは生きているので新しくクライアントは起動できます。
シンプルなプログラム作ってもう少しデバッグしてみます。ありがとうございます。
-
-139ですと、たしかにそのタスクだけ排除されてますね。
-
自己解決しました。
今回のDLLは『外部コール C=COM』で呼出すのが正解みたいでした。
32bit版はCallDLL関数で戻り値に数値型変数を使って偶然動作していただけで、間違った使い方をしていました。
OLE変数にDLLを読み込ませて『外部コール C=COM』で戻り値を取るのが正しかったようです。
自分でも CallDLL、CallDLLF、CallDLL、外部コールC=COM、外部コールU=UDP の使い分けがよくわかってないのが、わかりました。ありがとうございました。
サインインしてコメントを残してください。
コメント
6件のコメント