DLL実行中にメインウインドウの操作をする – プログラミング – Home

DLL実行中にメインウインドウの操作を...
 
通知
すべてクリア

[解決済] DLL実行中にメインウインドウの操作をする


AK
 AK
(@AK)
ゲスト
結合: 21年前
投稿: 15
Topic starter  

VC++初心者です。
VC++の中でFortranDLLを実行しているのですが、この実行中でも、メインウインドウで
の操作が可能にすることはできるのでしょうか?このDLLでは、コンソールが開きFotran
での計算結果などが表示されるプログラムで、少々時間もかかるため、実行中でもメイ
ンウインドウで他の作業をしたいと考えています。よろしくお願いします。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

ワーカスレッドを作ってそっちに処理を委ねる


返信引用
AK
 AK
(@AK)
ゲスト
結合: 21年前
投稿: 15
Topic starter  

ありがとうございます。ワーカースレッドで解決できました。しかし、このFortranDLL
を実行中にこれを強制終了すると、メインウインドウも終了してしまいますが、これを
避けることはできますでしょうか?ちなみに以下のような方法でスレッドを実行してい
ます。

BOOL CCDoc::Test()
{
AfxBeginThread( MyThread, this );
return TRUE;
}

extern C _declspec(dllimport)
void _stdcall FORTDLL();

BOOL CCDoc::FORT()
{
FORTDLL();
return TRUE;
}

UINT MyThread( LPVOID WinObjPtr )
{
CCDoc* ptr = ( CCDoc* )WinObjPtr;
ptr->FORT();
return( 0 );
}


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> しかし、このFortranDLLを実行中にこれを強制終了すると

「これ」って何?
FortranDLL が出すコンソールウィンドウのこと?
だったら無理です。防げません。

#SetConsoleCtrlHandler を調べてみて。まぁ調べても防げないけど。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

そもそも「コンソールウィンドウ」とは、コンソールアプリの唯一のメインウィンドウ
であるべきで、便利な入出力ウィンドウとして使うべきではありません。
FortranDLL の作りを変えるのがベストかと。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

別プロセスを作成して、そこでFortranDLLを実行するというのはいかがですか?


返信引用
AK
 AK
(@AK)
ゲスト
結合: 21年前
投稿: 15
Topic starter  

別プロセスというのは具体的にどういうことでしょうか?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>FortranDLL が出すコンソールウィンドウのこと?
FortranDLLって使ったことないのですが、
このコンソールウインドウが表示されて処理を行い、コンソールウインドウが
閉じたことってアプリケーション側で知ることが出来ないのですか?
それがわかれば、そのときまで非常時を除いてワーカスレッドを終了するのを
待っていればいいと思いますが。
例、
「WaitForSingleObject」でイベント待ちにする。
コンソールウインドウが終了したらイベントを出してスレッドを終了させる。

>別プロセスというのは具体的にどういうことでしょうか?
「CreateProcess」を参照のこと。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

> 別プロセスというのは具体的にどういうことでしょうか?

FortranDLLを呼び出すためのEXEを作成し、それをメインのプログラムから
実行させる、ということです。
このようにすれば、FortranDLLが出すコンソールを強制終了させても
メインのプログラムにまで影響が及ぶことはないと思います。


返信引用
AK
 AK
(@AK)
ゲスト
結合: 21年前
投稿: 15
Topic starter  

FortranDLLへは引数を渡しているため、別プロセスにするとこれができなくなると思い
ますので、別プロセスは無理のようですね。やはりコンソールの強制終了をしないよう
にするしかないでしょうか。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

コマンドライン引数を使うとか、パイプを使って通信するとか、
ファイル経由で読み書きするとか、やり方は幾らでもあると思いますが。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> コンソールウインドウが閉じたことってアプリケーション側で知ることが出来ないの
ですか?

検出はできますが、その後にできることはプロセスの終了だけです。
コンソールを閉じられてもプロセスを継続するということはできません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>検出はできますが、その後にできることはプロセスの終了だけです。
>コンソールを閉じられてもプロセスを継続するということはできません。
FortranDLLでコンソールウインドウを表示させていると思いますので、
戻り値等でコンソールウインドウが閉じて処理が終了したことが分れば
後はスレッドがそれまで待てばいいのかなと思いました。


返信引用
AK
 AK
(@AK)
ゲスト
結合: 21年前
投稿: 15
Topic starter  

引数として非常に大きな配列を渡しているため、コマンドライン引数だと都合悪く、フ
ァイル経由はもともとやっていて、これをやりたくなくてDLLにしました。というわけ
で、パイプとはどんなものなんでしょう?


返信引用
AK
 AK
(@AK)
ゲスト
結合: 21年前
投稿: 15
Topic starter  

とりあえずワーカスレッドで行きます。ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました