メモリに蓄えたファイルをメモリー上で起動できますか? – プログラミング – Home

メモリに蓄えたファイルをメモリー上で起...
 
通知
すべてクリア

[解決済] メモリに蓄えたファイルをメモリー上で起動できますか?


TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

mallocでファイルの容量分だけメモリーを確保して、
その中にそのファイルのデータ-を蓄えて、
それをHDに書くことなしにそのファイルにあったAPPで開くことは出来ますか?
開くだけでいいのですが。

環境は、win2000でMFCで作っています。
宜しくお願いします。


引用未解決
トピックタグ
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

アプリ側にそういう機能があれば...としか。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

憶測です。

>そのファイルにあったAPPで開く
ということは、ファイルの拡張子情報が必須になる気がするので
難しいように思います。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

拡張子情報とは.TXTの部分の4byteですか?
それは、持っています。
それとも、拡張子情報とは.TXTの4byte以外の何かですか?


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

>拡張子情報とは.TXTの部分の4byteですか?
>それは、持っています。
>それとも、拡張子情報とは.TXTの4byte以外の何かですか?
と言われても、「.txt」という情報は初めて出てきたので、なんとも言いようがないですけど。
テキストファイル限定ということでしょうか?

>それをHDに書くことなしにそのファイルにあったAPPで開くことは出来ますか?
txtがメモ帳に割り当てられているならメモ帳を開いて、エディットにSendMessageしてやればできるかと思います。
その他のAPなら、どうしようもないような。

それは他の拡張子についても同様ですが。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

すいません。
.txtは例えです。

>その他のAPなら、どうしようもないような。
>それは他の拡張子についても同様ですが。

つまり、メモ帳だけなら出来るってことですか?
意味がいまいちわかりません。

後、SendMessageのヘルプを見たんですがちんぷんかんぷんでした。
わかり易く教えてもらえないでしょうか。

今、test.docというファイルのデータをmallocでメモリーに確保しました。
その後、どう設定したら開くのですか?

なにとぞ宜しくお願いします。


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

DOCならファイルにしないと駄目かと思います。

TXTでメモ帳ならできるはずです。


返信引用
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

方法1. 全てのアプリを解析してそれに対応するコードを書く。
(↑現実的にいって不可能です)

方法2. クリップボード経由でデータを送りつける。
(↑わりと簡単ですが未対応のアプリもあります)

方法3. テンポラリファイルに保存してから開く。
(↑1番現実的だと思います)

まあどうしてもメモリから起動したいのなら「がんばって下さい。」としか言えません。
普通ならテンポラリファイルを使うと思うんですが。
(質問が質問ですから、どうしてもメモリ上でなくてはダメなのでしょう)

> 後、SendMessageのヘルプを見たんですがちんぷんかんぷんでした。
> わかり易く教えてもらえないでしょうか。
関連付けられたアプリが起動したときにそのウィンドウハンドルを抜き取っておいて
それにSendMessageで対応したメッセージを送り付けるということだと思います。

> 今、test.docというファイルのデータをmallocでメモリーに確保しました。
> その後、どう設定したら開くのですか?
関連付けられたアプリを起動してtest.docの内容を送りつけて下さい。


返信引用
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

書きこみ終わったと思ったら先にレスが入ってて流れがおかしくなってしまいました。すみません。無視して下さい。

HWND hWnd = FindWindow(NOTEPAD,NULL);
SetForegroundWindow(hWnd);
keybd_event(VK_CONTROL,0,0,0);
keybd_event('V',0,0,0);

keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event('V',0,KEYEVENTF_KEYUP,0);

現在起動してるメモ帳にクリップボードの内容を送り付けています。
これを応用してクリップボード操作とアプリ起動コードを書き足せばOKです。
(スキャンコードの部分は意味がわかんなかったんで0にしときました)

たぶんDOCでも使えます。
(関連付けられたアプリが基本的なWindowsの操作法に準拠していれば)


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

陳謝)テンポラリファイルに保存する方法があるとは知らなかったので、
mallocで蓄えたメモリなどといっていたのです。

そこで、テンポラリファイルを使用みたら、どうもパッとしません。
テンポラリファイルの名前は勝手に決められるし、
変更しようとしたら強制終了してしまうし、
FILE* stream
stream->_baseにデータを入れたのですが、本当に入っているのかどうかわからず。
(確認方法は、_baseにデータを入れた時点でエクスプローラーからそのファイルのデータ容量を見ても
0キロバイトとしか表示されていない。もちろん、デバッグで_baseの中に値が入っていることは確認しています。多分ファイルを開いている状態なのでプロパティの情報が見れないだけだと思いますが、確証が持てません)
そのため、そのテンポラリファイルをShellExcuteで開くことが出来ません。
ShellExcuteは多分ファイル名の拡張子を利用してアプリを起動していると思うのですが、
その拡張子を変更することが出来ません。

どうしたらよいのでしょうか?

説明が長くなったのでまとめます。
テンポラリファイルを任意のアプリで開くことは出来ますか?
ということです。(短い……)
宜しくお願いします。


返信引用
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

ならばテンポラリでは無く普通のファイルを使えばどうですか?
自分のカレントフォルダの中にTEMPというフォルダを作って
その中に

00000001.txt
00000002.bmp
00000003.doc

とかファイルを作って開くってのはどうですか?
設定ファイルに数字を保存しておいて

数字(8桁).拡張子

という風に作れば簡単です(やったこと無いけど)。
TEMPというフォルダ名や数字(8桁).拡張子というのはあくまで一例ですが。

> テンポラリファイルを任意のアプリで開くことは出来ますか?
アプリのパスがわかっていれば

ShellExecute(open,アプリのパス,ファイル名,アプリのカレント,SW_SHOW);
(↑たぶんこんな感じ。MSDNが見れない状態なんで詳しくはわかりませんが...)

で、起動できると思います。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

ShellExcuteでファイルを開こうとしたら、そのファイルは他のアプリで使用されているので
開くことが出来ませんというエラーがでました。

FILE* stream;

char* DataArea = テキスト文章のデータが格納されているポインタ

if( (stream = tmpfile()) == NULL ){ //失敗
}
else{ //成功
  fwrite(DataArea, sizeof( char ), datasize, stream);
  ShellExecute(hWnd, open, C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe, stream->_tmpfname, wordpad.exe, SW_SHOWNORMAL);
}

という感じのソースです。
そもそもテンプファイルってこんな使い方できるのでしょうか?
またヘルプを見るとtmpfileは、read、writeで開くと書いてありました。
つまりクローズがないって事ですか?
すると、他のAPPで開けないってことですか?

toruさんが言われるように普通のファイルを作ればということですが、
自分の知る限りアプリを終了させてもそのファイルが残ってしまいます。
自分としては、ファイルは残さずに起動させたいのです。
ならそのファイルはどこにあるかというと、非常にややこしいところにあって説明できないのですが……。
結論を言うとHD、FD、CD内にはありません。(一応HDから、ファイル名データその他はちゃんと確保してあります。)
だから、mallocでメモリを確保したものであったり、tempファイルを使って開きたいのです。

宜しくお願いします。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

さくっと作ってみました。
デバックとかエラーチェックも全然してませんので、
処理の流れとして「こんなんもあります」って程度に参考にしてください。

やってることは、
1.一時ファイル作成
2.起動したいファイルに該当するアプリケーションを探す
3.アプリケーションに一時ファイルをくっつけて起動
4.3で起動したアプリケーションがおわるのをまつ
5.1で作成した一時ファイルを削除する
です。

void AppExec(
const void* data, // データアドレス
int length, // データ長
const char* ext) // 拡張子情報(.txt等)
{
// 一時ファイルの作成 //////////////////////////////////////////////////////////
CString tmp_file ;
tmp_file.Format(tmp%s, ext ) ;
FILE* fp = fopen( tmp_file, wb );
if( fp == NULL )
{
return ;
}

fwrite( data, length, 1, fp ) ;
fclose( fp );

// 対応アプリケーションの検索 //////////////////////////////////////////////////
char exec_apl[1024];
FindExecutable(
tmp_file,
NULL,
exec_apl);

// 対応アプリケーションの起動 //////////////////////////////////////////////////
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof( STARTUPINFO ));
si.cb = sizeof( STARTUPINFO );
si.wShowWindow = SW_SHOWNORMAL;
si.dwFlags = STARTF_USESHOWWINDOW;

char lpCommandLine[128];
sprintf( lpCommandLine , %s %s, exec_apl, tmp_file );
sprintf( lpCommandLine , c:\\appl2\\Kaimaile\\Lha\\Lha32.exe e .\\lzhtmp0.lzh .\\*.* );

if(CreateProcess( NULL,lpCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);

// 起動したプロセスの終了を待つ
WaitForSingleObject( pi.hProcess, INFINITE );

CloseHandle(pi.hProcess);
}

// 一時ファイルの削除 //////////////////////////////////////////////////////////
unlink( tmp_file );
}


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

すいません、一部余分なのが入ってました。

> sprintf( lpCommandLine , c:\\appl2\\Kaimaile\\Lha\\Lha32.exe e .\\lzhtmp0.lzh .\\*.* );
この行は誤って混入したものなので、無視してください。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

返事が遅れて大変申し訳ございませんでした。
んさん、このソースありがたく使わせてもらいます。
ちなみにエラーありませんた。
Cdsさん、toruさんありがとうございました。
何かあった時に来ますので、
その時はよろしくおねがいします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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