■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API 質問箱
501 名前:デフォルトの名無しさん :01/10/19 00:47
500レス達成万歳!

502 名前:初心者 :01/10/19 01:22
あのさ、VisualStudio.NETのベータ版で
CやC++の勉強できる?
誰か教えてください。

503 名前:デフォルトの名無しさん :01/10/19 02:36
>>499
RichEdit使ってEM_FINDTEXTEXを利用したらどうじゃろ?
詳細は聞くな。わしも知らん。

504 名前:デフォルトの名無しさん :01/10/19 10:07
>>502
β2 なら c/c++ もできる.
プロジェクト作るときに unmanaged を選択.
学生さんだったら、アカデミックパックで VC++ 買え.

505 名前:デフォルトの名無しさん :01/10/19 10:27
>>497
ありがとうございます。
DLL作ってるんで、UnregisterClassが必要なんです。
で、これで失敗したあと、また同じものをRegisterClassEXで登録
するとこれまでも失敗し、こいつもGetLastErrorが0を返すんで
悩んでました。

506 名前:デフォルトの名無しさん :01/10/19 12:05
>>505
ほげー、なぞですなぁ。

507 名前:狂牛 :01/10/19 15:59
質問です。
VC++6.0でWinAPIを使用してアプリケーションを作成しているのですが、
リソースエディタでダイアログを作成し、コマンドボタンを置いているのですが、
この、コマンドボタンのボタン押下時の処理がかけなくて困っています。
コマンドボタンのクリック時の処理はかけるのですが。
コマンドボタンに対してWM_LBUTTONDOWN等のメッセージは
どのようにして拾うのでしょうか。

508 名前:デフォルトの名無しさん :01/10/19 16:17
コントロールがデフォルトで親ウィンドウに通知するイベントは限られてますからね。
ボタンの場合、WM_LBUTTONDOWNは通知されないです。
WM_COMMANDに乗ってくるBN_PUSHEDあたりで代用できませんか?
どうしてもWM_LBUTTONDOWNが欲しいなら、サブクラス化してボタン自身に処理させるしか。

509 名前:狂牛 :01/10/19 16:37
>>508
BN_PUSHEDのメッセージですが、WM_COMMANDに乗ってくる
HIWORD(wParam)をswitch文で拾えばいいのでしょうか。

510 名前:デフォルトの名無しさん :01/10/19 16:46
>>509
そっす。
で、いまさらなんですが、念のためMSDNでBN_PUSHEDの説明見たら、
BN_PUSHEDがあるのは古いWinとのコンパチ性を保つためで、
いまはオーナー描画ボタンにしてWM_DRAWITEMを拾えって
書いてありました。。。ゴメソナサイ

511 名前:デフォルトの名無しさん :01/10/19 16:47
>>509

分かってんじゃん。詳しいことは MSDN で WM_COMMAND, BN_PUSHED を調べてみることだ。

「ボタンを押された」を日常的な意味で読み取ると普通 BN_CLICKED メッセージを使うよね。
クリックはボタンを押してその場所で離すという一連の動作。

大抵のコントロールのメッセージは、Windows が処理してくれていて、
それを捕まえるにはサブクラス化するっきゃないっつうか。

512 名前:デフォルトの名無しさん :01/10/19 16:57
細かいこと言うと、
「Buttonコントロール上でマウス左ボタンを押下」と
「Buttonコントロールが親にBN_PUSHEDを送る」
は等価ではない。

前者はマウス左ボタンを押した瞬間に発生するが、後者はマウス左ボタンを押し
なおかつButtonコントロール上で離された場合に発生する。
後者はButtonコントロール上にフォーカスがある状態でスペースキーを押した
ときにも発生する。

手頃なボタンを左クリックし、ボタン外にドラッグして離してみよ。

513 名前:510 :01/10/19 16:59
さらにMSDNをつらつら眺めていたら、コントロールから
WM_PARENTNOTIFYに乗って、WM_LBUTTONDOWNそのものが来るらしい。。。
なにそれー。知らんかった。Windowメッセージの世界は常人には理解しがたい。

514 名前:デフォルトの名無しさん :01/10/19 20:28
あぁ、ありがとさん>>503
だが、すでに検索窓はトップにはりついとるのだヨ
その線でゆくのだ。

515 名前:デフォルトの名無しさん :01/10/19 20:41
意見求む。
自作のエディタでc++仕様だが
リストボックスにプログラム中の
関数のインデックスが出るようにした。
もちろんクリックでも飛べる。

これは使えると思うか?(80字)

516 名前:デフォルトの名無しさん :01/10/19 20:43
ちなみにメモリリークの調べ方教えてください。
単にソースが大きくなったからかもしれないけど
最近プログラム組んだ後IEの画面の更新が走査線
の動きが見えるくらい遅いんです。

517 名前:デフォルトの名無しさん :01/10/19 20:44
ねたじゃないのでマジレすでお願いします。

518 名前:デフォルトの名無しさん :01/10/19 20:51
>>516
VC++ なら

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);

を main の最初に入れて、デバッグビルドでビルドすれば、リークの有無は分かる。

リークしている個所を突き止めたいなら malloc, realloc, free, new, delete あたりを乗っ取って
自前でログをとるか、売り物だが BoundsCheker, Purify などのツール使う。XLSOFT の Web
Page から BoundsChecker の体験版をダウンロードできるから、とりあえず試してみれば?

519 名前:デフォルトの名無しさん :01/10/19 20:56
>>515
個人的にはリストボックスに表示されるよりも、カーソル直下にある関数呼び出しに対して、
その定義部分に飛べる機能の方が嬉しい。ついでに飛んだ後に、元の位置に戻る機能も
セットで。

520 名前:デフォルトの名無しさん :01/10/19 21:00
>>518
フリーコンパイラとターボデバッガしかないんだ・・・

521 名前:デフォルトの名無しさん :01/10/20 00:03
>515
有料のエディタだったら、似たような機能は標準でついてるね。
単に関数を一覧を表示するんじゃなくて、親子関係にある関数をツリー構造で表示してくれたりしてるとわかりやすいけど。

522 名前:デフォルトの名無しさん :01/10/20 01:46
netstatの結果を得るAPIってありますか?
netstat.exeの出力をパースするしかないでしょうか。

523 名前:デフォルトの名無しさん :01/10/20 01:49
netstat.exe逆アセしろ>522

524 名前:デフォルトの名無しさん :01/10/20 01:59
漏れはMFC派じゃないからあんまり親子関係関係
ないかも。でもあるコールバック専用のルーチンとか
はあるけどね。

あのさ、普通何行くらいのコードかな、普通プログラマは。
今1500行くらいはいってるけど、そうなると
少なくとも漏れにとって自分の機能がちょっと便利。
スクロールさせんのやっぱめんどいョ

525 名前:デフォルトの名無しさん :01/10/20 02:16
さんきゅうなるほど。>>523
秀丸でnetstat.exeを開いたら関数名が見れた。

526 名前:デフォルトの名無しさん :01/10/20 03:45
レジストリに値を保存、読み出しする関数を知りたいのですが。。
Cでそんな関数ありますか?

527 名前:デフォルトの名無しさん :01/10/20 04:04
>>526
Win32APIにあるので、RegOpenKeyExでMSDN検索してみて.
それと、sampleファイルも検索してみて.

つかっているソースは必ずあるから.

528 名前:デフォルトの名無しさん :01/10/20 04:07
>>519
> 個人的にはリストボックスに表示されるよりも、カーソル直下にある関数呼び出しに対して、
> その定義部分に飛べる機能の方が嬉しい。ついでに飛んだ後に、元の位置に戻る機能も
> セットで。
xyzzyみたいな?

529 名前:デフォルトの名無しさん :01/10/20 13:45
>>527
さっそく探してみます。
情報ありがとぅ。

530 名前:デフォルトの名無しさん :01/10/20 14:30
聞きたいのですが、一つのダイアログコールバックプロシージャを
二つ以上のダイアログが共有する(利用する)ことは可能でしょうか。

各ダイアログボックスには識別ID,(IDC_なんたら)がついてる
から可能じゃないか?と思ったのですが・・・。

あと、プログラムを組む過程で、どこかに変数を吐き出すには、皆さんどうして
いますか?いまは漏れはメイン画面にいくつかの変数(マウスのx、y座標とか)
を吐き出しています。一つダイアログを作ってそこに書き出そうかと思っています。
アトムはまだ使っていませんが、手を出そうと思っています。

皆さんどうしていますか?

531 名前:sage :01/10/20 14:36
可能。
可能。
DebugOutputString。

532 名前:sage :01/10/20 14:37
OutputDebugStringだった。宇津志

533 名前:デフォルトの名無しさん :01/10/20 14:45
>>532
漏れも調べてる最中なんだけど、なにぶん
フリーコンパイラにターボデバッガなんで
デバッグには疎いです。

MSDN OutputDebugString
アプリケーションがデバッガを持たないとき・・・・・
アプリケーションがデバッガを持たず、システムデバッガもアクティブでないとき(は、何も起きません。)
↑意味がワカラン・・・・・

追伸 オンラインMSDNって、乗ってないコマンド結構ない?

534 名前:デフォルトの名無しさん :01/10/20 15:02
デバッガを使いこなせないならログファイルでも作れ。

#include <stdio.h>
#include <stdarg.h>
void DebugPrintf(const char *fmt, ...)
{
FILE *fp;
va_list ap;
va_start(ap, fmt);
if ((fp = fopen("debug.log", "a")) != NULL)
{
vfprintf(fp, fmt, ap);
fclose(fp);
}
va_end(ap);
}

535 名前:デフォルトの名無しさん :01/10/20 15:31
サンきゅー>>534

536 名前:デフォルトの名無しさん :01/10/20 15:33
autoexec.batに、\essolo.comの一行が
あったから、みならって\doskey.comを
付け加えたが組み込まれない。どうしたらいいかな

537 名前:デフォルトの名無しさん : :01/10/20 15:46
>>533
OutoputDebugStringの出力を受け取るプログラムが動いてないと
だめって事.
MS VC++の IDEを使用しているときは、そこのデバッグ windowに
出力される. 昔は (Win3.1) のころは OutputDebugStringの
出力を windowに表示するプログラムが在ったけど、今はないのかな。

538 名前:538 :01/10/20 15:56
MSDNで Debugging Event で検索してみると、OutputDebugString
が発行(?)する OUTPUT_DEBUG_STRING_EVENT のハンドリング方法
がわかる(?) から、調べてみて.

539 名前:デフォルトの名無しさん :01/10/20 16:03
>>533
日本語訳は開発ツールに付属の MSDNでも 同じだよ.
詳細は英語の Documentを読むしかない.

540 名前:デフォルトの名無しさん :01/10/20 16:03
>>538
さっき山本さんのdbgmonてにいれた。memなんとかもmemspyかな。
けど起動順序とかメッセージの組み込みとかあったから現時点では自前で
ダイアログ作ることにした。さんきゅ。

541 名前:デフォルトの名無しさん :01/10/20 16:08
質問攻めの予感がします。当たるかどうかはわかりません。

if(!(hDebug=CreateDialog(hInstG,"DEBUGDLG", hWnd, (DLGPROC)MyDlgProc)))break;
if(!CreateDialog(hInstG, "LISTDLG", hWnd, (DLGPROC)MyDlgProc))break;

おそらく文字列の代入のところなのですが、なんで前者が警告(おそらく不正な代入)
をうけ、後者が受けないのかわかりません。
ちなみに前者はWM_CREATEで、後者はプッシュボタンで発動します。

気が向いたらお気をおかけください

542 名前:デフォルトの名無しさん :01/10/20 16:48
>>541
おそらくとかなんとか言う前にきちっとメッセージを書け。

警告の意味も調べずに聞きに来るやつは、
どっちにしろ途中でプログラミング断念すると思うがな

hDebugの型が HWND じゃないとかそういう落ちだったら
逝ってヨシ

543 名前:デフォルトの名無しさん :01/10/20 16:57
そんな間違いは言語道断だ。
ダイアログはちゃんと出るけど
警告が気になる。>>542

544 名前:Delあめ猫にゃ :01/10/20 17:05
ええと、
 if 文 の中で 代入つまり=を使ってるから

(おそらく不正な代入) という警告が出たという話ではないのかな?

545 名前:デフォルトの名無しさん :01/10/20 17:30
なるほどぉ、
でも
MessageBox(hWnd,(LPTSTR)szMyTex, "警こく", MB_OK);exit(0);break;
これも同じなんだよなぁ。漢字が悪いのかと思ったけど
それもちがうらしい・・・・

546 名前:デフォルトの名無しさん :01/10/20 17:33
すまん、↑はifつかってなかった。
けど、これは問題ない。

if(IDYES==MessageBoxEx(hMyEdit,"文章が変更されています。\r\n取りやめますか?","注意",MB_YESNO|MB_ICONWARNING|MB_TOPMOST,LANG_FRENCH))

あれ?うーんぅぅ

547 名前:デフォルトの名無しさん :01/10/20 17:37
すまん、これもちがうな。(藁

っていうかさんきゅ。
けど漏れの教科書(新版応用C言語)どーりなんだけどな・・・・

548 名前:デフォルトの名無しさん :01/10/20 20:22
もう一人質問屋がいるが俺じゃねーからな。。。
多分漏れのが上だ(なにが?)

549 名前:デフォルトの名無しさん :01/10/20 21:20
質問が一発で終わらなかったらせめて番号付けてくれ。わけわからん。

550 名前:デフォルトの名無しさん :01/10/20 23:04
警告の事に関しては漏れは進歩しました。
LPTSTRやLPCTSTRがらみでないことが原因
だと分かってよかったです(解決っぽい)

あとはautoexec.batにc:\doskey.comを
付け加えても反映されないことです。

・・・これからLISTBOXの関連づけの勉強さ・・・

551 名前:名無しさん@お腹いっぱい :01/10/20 23:27
質問ですが、他のアプリのツールバーのハンドルがあるとき、
Win32APIでそのツールバーに属するボタンのハンドルを得たい
のですが、どうしたらいいのでしょうか

552 名前:デフォルトの名無しさん :01/10/20 23:51
ツールバーのハンドルってなんだ?

553 名前:デフォルトの名無しさん :01/10/21 00:09
>>552
ツールバーのHWNDだろ。

554 名前:デフォルトの名無しさん :01/10/21 01:16
ツールバーをspyで見ても、子ウィンドウらしきものは発見できず。
ひょっとしてツールバーのボタンにハンドルって存在しないんじゃ。。。

555 名前:デフォルトの名無しさん :01/10/21 02:07
doskeyってのはc:\にあったりするのかい?
うちのWin95ではc:\windows\command\にあるんだがね。

556 名前:デフォルトの名無しさん :01/10/21 03:28
標準でコントロールが用意されていなかったときは bitmap貼り付けて、
マウス座標でどのボタンの上にいるかはんべつしていた。

557 名前:デフォルトの名無しさん :01/10/21 03:53
ネタ違いだったら悪いけど、ボタンは押されたときWPARAMかLPARAmに(HMENU)ID_BOTTONとか
で指定したID_BOTTONが送られてくるYO。だからif(LOorHIWORD(lorwParam)==ID_BOTTON)
とかでいけるYO

558 名前:デフォルトの名無しさん :01/10/21 05:47
CreateProcessの cmdline 引数が LPTSTR なのは誰かの陰謀ですか。

559 名前:デフォルトの名無しさん :01/10/21 10:28
>>537
DebugViewがあります。
www.sysinternals.comだと思います。

560 名前:デフォルトの名無しさん :01/10/21 13:40
ぶった切ってコマンドラインパラメータに使う可能性を言っているんだと思うが
やはり陰謀です

561 名前:デフォルトの名無しさん :01/10/21 15:05
doskeyの人へ。

やっとよ、うまく逝った!さんくす

562 名前:デフォルトの名無しさん :01/10/21 16:11
指定したWEBサーバー上にある指定したフォルダ階層にある
データをそのままローカルにコピーする処理を作りたいのですが、
フォルダから、階層をくぐって、ほかのデータをシークしていく
方法がわかりません。
よい方法、ルーチンなどがあれば、ご教授ください

563 名前:デフォルトの名無しさん :01/10/21 16:16
>>562
nimdaをインストールすれば一発。

564 名前:デフォルトの名無しさん :01/10/21 16:19
>>558,>>560
この問答についてけない厨房に福音をさずけてください。
子プロセスがGetCommandLineで取得したLPTSTRに適当に'\0'を入れてぶった切ると、
それは親プロセスのCreateProcessのcmdline引数をいじってるということですか。
そんな邪悪なこと許されるはずないので、きっと間違ってるとは思うんですが。

565 名前:sage :01/10/21 16:27
>>564
実際に確認していないが、
strtokの用にパラーメタで渡された文字列を加工して
利用するAPIがあってもおかしくはないだろう。

まあ、落ち着いて考えてみればわかるが、
子プロセスがパラメータで渡された領域を見ることは、あり得ない。
親プロセスのメモリを直接子がいじることはないからね。

しかし、子プロセスを生成してパラメータを渡すAPIが、
コマンドライン引数を解析する際によけいなメモリコピーの
ための手間と領域を省くことがあってもおかしくはないと思う。

今のrichなwin32環境では考えられないことだが、
win16の頃はその程度のリソースも惜しかったんだよ。

566 名前:デフォルトの名無しさん :01/10/21 16:39
>>565
同意
LPTSTRに無理矢理キャストするクソコードとクソサンプルが多すぎて
実際に受け取った文字列を内部で分解しないように
わざわざOS直した可能性ありだね。

567 名前:564 :01/10/21 16:40
>>565
ありがとうございます。
落ち着いて考えたらそのとおりなので安心しました。
ちなみにパラメータが単一のコマンドラインとして渡されること自体は
きらいではありません。それに慣れてしまっただけともいいますが。

568 名前:デフォルトの名無しさん :01/10/21 18:50
char pFuncName[32][64]
は、

char **pFuncNameAry;int i;

pFuncName=(char **)malloc(64*sizeof(char *));
for(i=0;i<64;i++)
pFuncNameAry[i]=(char *)malloc(32);

こんな感じ?けど最初*pFuncNameAry[i]=(char *)malloc(32);
って漏れは書いたんだけど、*pFuncNameAry[i]にはどんな意味が
あるの?各文字列の最初の文字って感じかな・・・

569 名前:デフォルトの名無しさん :01/10/21 19:55
>568
1次元目と2次元目が逆になってない?
char pFuncName[32][64]
は長さ64の文字列が32個あるって考えるのが普通
mallocで書き換えるなら
char **pFuncNameAry;int i;
pFuncName=(char **)malloc(32*sizeof(char *));
for(i=0;i<32;i++)
pFuncNameAry[i]=(char *)malloc(64);

*pFuncNameAry[i]はpFuncNameAry[i][0]と値は同じ

570 名前:デフォルトの名無しさん :01/10/21 20:13
ちなみに、 ランタイムライブラリのヒープ (malloc)と、LocalHeap
と、VirtualAlloc をどういう基準で使い分けている?

おれ、 Cで WIN32 つかってるときは、 malloc つかわんけど。

571 名前:デフォルトの名無しさん :01/10/21 20:41
>>570
ローカルヒープ (LocalAlloc, LocalFree で操作するヒープ) は Win16 の名残だから、もう忘れた方が
いいと思われ。

私は基本的に malloc() や operator ::new() を使って、巨大なメモリブロックを一括して確保するとき
や、物理メモリの裏づけが必要なときだけプライベートヒープ (HeapCreate, HeapAlloc) を使ってま
す。VC6 だと malloc(), new() を使っておけば _CrtDbgFlag() と組み合わせてエラーチェックもでき
ますし。

572 名前:デフォルトの名無しさん :01/10/21 20:45
>>571
new()はツッコミどころ?

573 名前:デフォルトの名無しさん :01/10/21 20:55
>>571
そんなことはないと思うぞ。(→もう忘れた方がいいと思われ)

574 名前:デフォルトの名無しさん :01/10/21 21:28
>>573
Win32 だと GlobalAlloc, LocalAlloc は、プロセスヒープから HeapAlloc するのと最終的には
同じ、ただし引数が違うから辻褄が合うように内部で細工してるだけだと思ったが。

575 名前:デフォルトの名無しさん :01/10/21 21:44
なるほどぉ〜、
えーっとやりたかったのは長さ32のを64個
確保したかったってことなので、えーっと、?
あぁ、char **pFuncNameAry[64][32](←これが正解で、)
が逆でした。。

576 名前:デフォルトの名無しさん :01/10/22 10:53
マルチラインのエディットボックスに文字を追加していきたいのですが、
どうすればいいのでしょうか?
ログを表示するために使いたいんです。

577 名前:WIN32API :01/10/22 13:26
>>576
EM_SETSELかEM_EXSETSELで開始と終了にそれぞれ(DWORD)(-1)を
入れてテキストの末端を選択後、EM_REPLACESELでテキストを置き換
えれば実質的に挿入として働く。

MSのサポート情報に載ってたはずなので探して見るべし。

578 名前:あのねー :01/10/22 16:30
VC++のリソースエディタで、コンボボックス作って、
プロパティーのデータタブから初期値を入れると、
ダイアログのテスト時はドロップダウンリストボックスに
表示されるのに、実行すると表示されないのはなぜ???

579 名前:デフォルトの名無しさん :01/10/22 16:37
577は漏れじゃないよ。

int dwPosAry[258]
↓したの関数の代入
int MyFindStringAll(HWND hEdit,LPTSTR Starget,int *dwPosAry)

関数内に引数をして持ち込まれたdwPosAryに「宣言で」割り当てた要素の数、
を求めるのに
j=sizeof(dwPosAry)/sizeof(int *)とかやってみたんですけど、
j==1みたいなんですけど、256を期待してるんですけど、やっぱ
argcを使った方がいいんすかなぁ・・

580 名前:デフォルトの名無しさん :01/10/22 16:39
訂正↑↑

「したの関数”へ”代入」

581 名前:デフォルトの名無しさん :01/10/22 16:57
>579
そりゃそうでしょ。
sizeof(int *)/sizeof(int *)は1だからねぇ。根本的な勘違いをしてると
思われ。

582 名前:570 :01/10/22 19:13
>>574
そのとおりです.

>>571
LocalHeapと書いたのが誤解を招いたようだ. 言いたかったのはプロセスが出来た
ときに最初から用意されている Heapのこと。GetProcessHeap()で取得できる
heapね。

詳しくは MSDNを Heap: Pleasures and Pains で検索してみて.

583 名前:551 :01/10/22 21:15
>>554
うーん、ボタンに見えるけどあれはツールバーが自分で描いてる
絵にすぎないんでしょうかねぇ。

584 名前:554 :01/10/22 21:31
>>583
556の人が昔はそうだったって書いてるし。
きっと今もただの絵だと思うですです。。。

585 名前:デフォルトの名無しさん :01/10/22 22:01
全検索ルーチンでとある用があって、
int dwPosAry[256]
のdwPosAryをdwPos[k]=0xffffffff
としてやったらなんだか動きがおかしいので
intの意味を思い出して0x0fffffff
にした僕は偉いですか?

586 名前:デフォルトの名無しさん :01/10/22 22:08
>>585
すげーちょっとだけエライ

587 名前:デフォルトの名無しさん :01/10/22 22:25
>>585
int なのに dw というプリフィクスなのは罠?

588 名前:デフォルトの名無しさん :01/10/22 22:36
うん、罠っぽい。
DWORDってunsignedだっけ?
なるべく基本形でいこうかな、とも思ってさ。
どっちがいいのか今んとこわかんない。

589 名前:デフォルトの名無しさん :01/10/23 03:13
typedef size_t pos_t

590 名前:デフォルトの名無しさん :01/10/23 11:25
WIN32初心者です。
CreateWindow()の(メニュー)コールバック中でCreateDialog()して、
そのダイアログ内のボタンのコールバックからGetOpenFileName()を呼んでいるのですが、
GetOpenFileName()のウィンドウがファイルに対するダブルクリック以外固まって
しまっているのですが、何が悪いのか解りません。
詳しい方、原因をご指摘いただけないでしょうか。

591 名前:デフォルトの名無しさん :01/10/23 11:52
>>590
「(メニュー)コールバック」って、なに?
「ボタンのコールバック」って、なに?

言ってることが全くわからん。

もしかして、スレ違いか?

MFCスレ、逝ってヨシ。
http://piza2.2ch.net/test/read.cgi/tech/989902845/l50

592 名前:デフォルトの名無しさん :01/10/23 12:09
>>591
MFCのつもりはないんですが...。
言葉の定義が解らないモノで...すみません。

コールバック = WNDCLASSEX.lpfnWndProc=WndProc; とした時のWndProc()の呼び出しです。
で、このWndProc()中で
CreateDialog(hInst, "MY_DIALOG", hWnd, (DLGPROC)DlgProc);
を実行して、DlgProc()の呼び出し内でGetOpenFileName()を行ってるということです...。

593 名前:デフォルトの名無しさん :01/10/23 13:07
>>592
CreateDialogはどのタイミングで呼んでるんだ。

594 名前:デフォルトの名無しさん :01/10/23 13:11
メッセージの処理ははいってます?


switch (msg){
case WM_COMMAND
 処理

}

ウィンドウプロシージャに入ってきたらいきなり呼んでない
ですよね....
MSDNのサンプルを CreateDialogで検索してみたら。

あと、windowsx.h のメッセージクラッカー使用すると、
すっきりするよ。

595 名前:デフォルトの名無しさん :01/10/23 13:43
>>593-594
呼び出しタイミングはこんな感じです。

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM ){
switch( iMessage ){
case WM_COMMAND:
switch(LOWORD(wParam)){
:
case ID_hoge: ←リソースでメニューに割り付けたID
hDlgWnd = CreateDialog(hInst, "MY_DIALOG", hWnd, (DLGPROC)Proc);
:
break;
}
}

596 名前:デフォルトの名無しさん :01/10/23 13:53
>>595
そうじゃなくって、メッセージポンプをちゃんとまわしてないんだろ?

597 名前:595 :01/10/23 14:03
え?メッセージポンプて何ですか?

598 名前:デフォルトの名無しさん :01/10/23 14:28
>>597
で、ダイアログプロシージャのWM_INITDIALOGとかWM_CREATEとかで
何をやってる?

599 名前:597 :01/10/23 14:55
う、特に何もしてないというか
default:で
return DefWindowProc( hDlgWnd, iMessage, wParam, lParam );
としてますが...

ひょっとしてここで何かを...?

600 名前:デフォルトの名無しさん :01/10/23 15:30
>>599
ダイアログプロシージャで DefWindowProc() 呼び出しちゃダメだって。

ダイアログプロシージャでメッセージを処理しない場合には FALSE を返す。これで自動的に
DefDlgProc() が呼ばれて、既定のメッセージ処理が行われます。

601 名前:デフォルトの名無しさん :01/10/23 15:33
WinMain() で

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

こういうループあるはず。
これをメッセージポンプといいまふ。

ここでモードレスダイアログに対応しているか。

MSDN で、Creating a Message Loop でけんさくしてみてください。

602 名前:590 :01/10/23 15:49
>>591-601
皆さんお忙しい中ありがとうございました。
もちっと勉強してからまた質問させていただきます。

603 名前:590 :01/10/23 15:53
追申
なお、>>600氏に指摘いただいた部分が原因でした。
重ねて御礼しますです。

604 名前:デフォルトの名無しさん :01/10/23 15:58
質問。

CreateFileMapping -> MapViewOfFileで取得したポインターを
WriteFileの 2番目の引数に指定して、OVERLAPPED構造体あり
で書きに行く。

6MB位のファイルでテストすると問題ないのだが、
250MBのファイルでテストしたら リソースたりないエラーになる。

IsBadReadPtrで MapViewOfFileで取得したポインターをチェックする
限りではエラーにならない。

どういうことだ。

605 名前:604 :01/10/23 16:06
ちなみに OVERLAPPED I/O をやめると、書き込める。

606 名前:DirectDrawCreate :01/10/23 17:54
>>604
> どういうことだ。
横柄な質問態度では誰も答えないものと思われ :-p
知ってるけど答えない :-p

607 名前:デフォルトの名無しさん :01/10/23 18:18
>>604
MMFにOVERLAPPED I/O を使うのは何か理由が?

608 名前:604 :01/10/23 18:30
>>606
知っているのなら教えてください。

>>607
二つの処理を書いてます。
1.MMFをくるむ処理。(MMF知らない人に使わせる。)
2.メモリ中に作ったデータを 非同期WriteFile するしょり。(1同、知らない人に使わせる。)

この二つを同時にテストしてた。

Overlappedだけに限定します。

6MBのバッファを作成。
WriteFile() で、OVERLAPPED I/O 書き込み -> OK

250MBのバッファを作成。
WriteFile() で、OVERLAPPED I/O 書き込み -> NG

609 名前:デフォルトの名無しさん :01/10/23 20:27
>>608
まさかメモリ 256MB とかのマシンじゃないだろうな。

すべてのページをコミットできるだけのメモリを買いに逝け。

610 名前:604 :01/10/23 21:36
>>604 で書いているように、IsBadReadPtrで MapViewOfFileで取得したポインター
をチェックす>限りではエラーにならない。

このAPI呼び出しに行くとやたら時間がかかり、正常終了する.
タスクマネージャーで見ると、メモリ消費している.

>>605 で書いているように、OVERLAPPED I/Oにしないと書き込める.

611 名前:デフォルトの名無しさん :01/10/23 23:44
CでOLEを使って、Excelを操作したいのですが、
簡単な方法はありませんか?
処理系はVisualCですが、MFCは使いたくありません。

612 名前:デフォルトの名無しさん :01/10/24 03:19
>>611
MS製品でやるならVBにしとけ
俺は最近BCBでやったけど、結構死ぬぞ。
しかも、ここはWin32 APIのスレだ。
Excel操作出来るAPIなんてきいたことねー。

613 名前:名無し言語 :01/10/24 10:21
>>611
COM(Component Object Model)使うしか術がないが、MFC不可となるとさすがに無理(内部的にMFCを使わないとものすごく面倒)だなぁ。
Excelでどこまで操作したいのか解らないけど、Windows Scripting Host (VBscript or Jscript)でも操作できるので調べてみそ。

614 名前:デフォルトの名無しさん :01/10/24 11:26
>>608
OVERLAPPED I/O を使たからには、WriteFile()は
ERROR_IO_PENDING を返すと思うが、
その後に、GetOverlappedResult() とかの処理をやってる?

615 名前:デフォルトの名無しさん :01/10/24 12:04
>>613
っつーか、言語がCって時点でMFCは使えないと思うが。CからCOM
オブジェクトを呼ぶ、となると一筋縄ではいかんでしょう。

C++なら#importでタイプライブラリを取り込めば、なんとかなるかな。
でもやっぱりCOMオブジェクトを操作するならまずVB、次にDelphiじゃ
ないですかね。

616 名前:デフォルトの名無しさん :01/10/24 12:20
これからお世話になりそう...よろしく

617 名前:名無し言語 :01/10/24 12:50
>>615
うん、そだね。Cという縛りを考えるとMFC不可になっちゃうね。

あと、CからのCOM呼び出しはそんなに難しくないよ。
MFCを使わずにC++でCOM使う方が難しいと思う。
DirectXあたりで勉強しとくと良いよん。
(DirectXをCOM経由でCから呼び出すサンプルがあるので)

あと>>611へのレスだけど、OLEを使うくらいならCOMに合わせた
ほうが良いと思う。今から勉強するならより新しい技術で、って意味ね。

618 名前:615 :01/10/24 13:02
>あと、CからのCOM呼び出しはそんなに難しくないよ。

Excelのインタフェースって公開されてましたっけ?インタフェースが
わからないと自力で解析しないといけないですよね。IDispatchから
呼ぶにしても簡単にできますかね。Inside OLE2にはCとC++のサン
プルが載っていたけど、Inside COMでも載ってますかね。

>あと>>611へのレスだけど、OLEを使うくらいならCOMに合わせた
ほうが良いと思う。今から勉強するならより新しい技術で、って意味ね。

Excelを呼び出すレベルならOLE=COMだと思いますが。元々名前を
変えただけのものだし。

619 名前:デフォルトの名無しさん :01/10/24 13:15
>>614
ええ、書き込みで使用するバッファが 小さいと問題無く動作してます.
ただ 技術情報 J047165 にかかれているように、ほぼ同期I/Oに見え
ます。

いま、いろいろと情報収集中です.なにか気になることがあれば
教えてください.


いま考えているのが、大きいバッファを渡されたときは I/O完了
ポート作って、分割して一気に書きに行こうかと思ってます.
しかしながらWriteFile()でリソースエラーとなる指針がかかれて
いないので躊躇してます.

620 名前:名無し言語 :01/10/24 13:38
>>618
Excelを含めて、全てのOffice製品のインターフェイス仕様は
VBAと全く同一(つーかVBAもCOMを使って実装してるだけなんだが)。

呼び出しのやり方が言語によって違うけど、与えるパラメータとか
返ってくる値とかはVBAのヘルプが役立つ。

621 名前:615 :01/10/24 14:28
>>618
もちろんそれはそうなんですが、引数の型がVariantだらけだったり、
VB(A)では省略可能な引数も全部指定しなければならなかったり、
いろいろ大変です。それとカスタムインタフェースを呼び出すには
IIDも必要ですよね。IDispatch経由で呼び出すのなら不要ですが。

622 名前:デフォルトの名無しさん :01/10/24 17:24
WindowsAPIのプログラムで質問ですが、よくボタンを押しぱなっしにしていると
表示されている数値が増加したり減少したりするのがありますが、どうすれば
実現できるのでしょうか?

今、やってみたのは、ボタンをサブクラス化して、WM_LBUTTONDOWNメッセージを
検出したときに、タイマーをセットし、WM_TIMERメッセージを送り、そこで数値の増加
をおこない、WM_LBUTTONUPでタイマーを解除する、ってのを、してみたのですが、
ボタンを押した状態で、ボタンからカーソルをはずしボタンを離すと、数値の増加が
とまらない状況になります。

よい実現方法はないでしょうか?

   ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       .∩∧,,∧           (´´
     ,,,,,,,,,,ミ゚Д゚,,彡        (´⌒(´
   ど,,,,      ,,,,,二⊃≡≡(´⌒;;;≡≡≡
      ~''(,,,,,づ゙゙  (´⌒(´⌒;;
    ズザーーーーーッ!!

623 名前:デフォルトの名無しさん :01/10/24 17:34
>>622
SetCapture

624 名前:デフォルトの名無しさん :01/10/24 17:48
>>623

おおっ、一発で解決しました。
ありがとう。
  ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄
      ∧,,∧          (´´
   \,,,,ミ,,゚Д゚彡      (´⌒(´
  ⊂,,,,,,,,,つつ.≡≡≡(´⌒;;;≡≡≡
           (´⌒(´⌒;;
      ズザーーーーーッ

625 名前:デフォルトの名無しさん :01/10/24 17:57
あえて質問しますが何故MFCを使わないのですか?

626 名前:デフォルトの名無しさん :01/10/24 18:17
>>625
MFC使うと、MFC42.dllが必要。バージョンの違いが死を招く
STATIC Link すればいいが、*.exe がデカくなるのがイヤ(w

627 名前:デフォルトの名無しさん :01/10/24 18:27
>>626
そんなにサイズデカくなりますかねぇ・・・
あ、わたしもスタティックリンクでしか使いませんけどね

628 名前:デフォルトの名無しさん :01/10/24 18:27
>>626
Win95のファーストリリースで使う予定でもあるのか?
現行のWindowsには必ず含まれてるど<MFC42.DLL

629 名前:名無し募集中。。。 :01/10/24 18:42
>>628
>>626はDLLのバージョン違いが恐いといってるんじゃないの?

630 名前:協力しよう! :01/10/24 19:00
くそガキ共の情報お待ちしております。
世間を震撼させた事件の犯人を実名で公開しております。
http://topia.yam.com/home/aoiryuyu/pages/index.html

631 名前:デフォルトの名無しさん :01/10/24 19:15
APIオンリーでリッチコントロールの
ウィンドウテキスト取得で、64KBの
壁にぶち当たったけどどう回避したらいいかな。

632 名前:デフォルトの名無しさん :01/10/24 19:30
ちなみにEM_STREAM**をつかわず頑固に
writefileとかgetwindowtextつかってる。

633 名前:デフォルトの名無しさん :01/10/24 20:26
1)GetWindowText()
2)Edit_GetText()
3)SendMessage(hEdit,WM_GETTEXT,(WPARAM)nlen,...)

3番目のみ64kb以上に対応。

1、2でも引数のキャストが原因の可能性があったけど、
両方ともintなのでおそらく違う。

これについて語ろう

634 名前:デフォルトの名無しさん :01/10/24 20:58
厨房じゃないから安心して話そうゼ

635 名前:626だが :01/10/24 23:31
漏れは未だにVC5.0++を使っている(ワラ
これのMFC42はバージョン4.21だ。最近は6.00以降だからな。
4.21を前提として作ったアプリが6.00のもとでチャンと動かなかったことがある。

636 名前:デフォルトの名無しさん :01/10/25 17:13
書き込み禁止属性のファイルを強引にfopenで開いて書き変えたいのですが
属性変更のAPIなんかあるのでしょうか?NTだと書き込み権限とかあると思
いますが可能な限り書き換えたいのです。

637 名前:デフォルトの名無しさん :01/10/25 18:20
>>636
SetFileAttributes("ファイル名", GetFileAttributes("ファイル名") & ~FILE_ATTRIBUTE_READONLY);
実際にはエラーチェック等を入れて。

638 名前:デフォルトの名無しさん :01/10/25 18:56
COMっていったい何ができるの(でやんすかね?)

例えばAPIだったらWindowが作れる、MFCは、その細かい操作が
できる、とか。COMってなに?

639 名前:デフォルトの名無しさん :01/10/25 20:10
direct x も com だぴょん.

・com作って、別なマシンからそいつを呼んだり出来る.com+
・自分でプログラム作るときに一部を comにしておいて、インターフェイスを
公開すれば他のプログラムから使用できる。オートメーション
・インターフェイスの仕様がバイナリフォーマットで定義されているので
C++で作っても、Cで作っても、VBでつくっても相互に呼び出せる.
ただし、VBをサポートする場合はIDispatchインターフェイスを書く必要がある.

そのたいろいろ。

でもレジストリの管理が煩雑でいやになっちゃうから 早く .NET が普及
してほしいね!

640 名前:デフォルトの名無しさん :01/10/25 20:32
>>638
とりあえず『Rubyを256倍使うための本 邪道編』を勧める。

まぁ、代表的なCOMの用法というとIEコンポーネントのブラウザとか
かちゅーしゃとか、その辺かな。

641 名前:デフォルトの名無しさん :01/10/25 22:06
DLLもまだ使ったことないけど
、、、なんだか似てるな

642 名前:デフォルトの名無しさん :01/10/25 22:09
コンピュータにやさしいプログラムを書いているので、
文字配列の長さを16の倍数で書くことが多いです。

ヌル文字入れて10文字しか必要なくても、16って書きます。

でもこれはもしかすると32とかの方がよりやさしいといえますか?
それとも64取りますか?皆さんはどうしてますか?

643 名前:デフォルトの名無しさん :01/10/25 22:11
通は111とか222とか取る。

644 名前:デフォルトの名無しさん :01/10/25 22:17
>>642
意味がワカラン。
配列サイズなんか定数で指定しないもんよ。

645 名前:デフォルトの名無しさん :01/10/25 22:17
理由が全然わかりません。特に理由はなく無意味とかですか、、?>>643

646 名前:デフォルトの名無しさん :01/10/25 22:19
コンピュータ内部では16の倍数で管理や制御を行う
システムがあるのではないかと考えたからです。。>>644

647 名前:デフォルトの名無しさん :01/10/25 22:23
うーーーー厨房の変てこなレスをどうにかして欲しい・・・・

648 名前:デフォルトの名無しさん :01/10/25 22:29
>>646
アセンブラならともかくCでは無意味。
コンパイラが自動的にコンピュータにやさしくなるようにしてくれる。

649 名前:デフォルトの名無しさん :01/10/25 22:33
コンパイラのミス処理(まぁ、ないのかなぁ)とか、
負担とかを考えて自動化になるたけ頼らないように
心がける意味は、ありますか??

650 名前:デフォルトの名無しさん :01/10/25 22:58
>>637

ありがとうございます

書き込み禁止のファイルを書き込み可能にするにはこんな感じで
いいですよね?

// 書き込み禁止なら
if ( GetFileAttributes( file ) & FILE_ATTRIBUTE_READONLY ){
// 書き込めるようにします
if ( SetFileAttributes( file, FILE_ATTRIBUTE_NORMAL ) == 0){
// エラー処理
}
}

651 名前:デフォルトの名無しさん :01/10/25 23:03
ふーーーーやっとみつけた!こーぴぺ!

132 :デフォルトの名無しさん :01/10/22 22:01
"."や"->"はものすごく優先度が高い演算子で、ほとんど「名前の一部」とみなしていいほど。
・・・と、最初は思ってればいいよん。
bMfh.bfType[0] = 'B';
strncpy(bMfh.bfType, "BM", 2);

>bfTypeがchar[2]か[3]かわかんないので、
これは問題あると思うが。


141 :デフォルトの名無しさん :01/10/22 22:33
構造体あれこれ。

bf.bfType = MAKEWORD('B','M');
stBmpFileHeader.bfType = 0x4d42
bmHead.bfType = ('B' | ((WORD)'M' < < 8))
memcpy(&fh.bfType,"BM",2);
bmFileHead.bfType = 19778;
BmpFileHeader.bfType = 'MB'

char bfType[2];
146 :デフォルトの名無しさん :01/10/22 23:30
正解は、
bf.bfType = MAKEWORD('M', 'B');

以下略・・・・・・・・・・・・・

>>http://piza2.2ch.net/test/read.cgi/tech/1003418249/101-200
参考にして下さい。

652 名前:637 :01/10/25 23:52
>>650
だいたいそんな感じだと思うけど、GetFileAttributes()は失敗すると
-1(==0xffffffff)を返すので、それだとマズいのでは。

653 名前:637 :01/10/26 00:02
あと、フラグによっては副作用が出ることがあるので、必要なフラグのみ
セットするか処理後にフラグを書き戻すかした方がいいと思います。

654 名前:デフォルトの名無しさん :01/10/26 01:24
質問です、
FTPソフトと同じように、指定したURL上(HTTP)の
ディレクトリ&ファイル表示をしたいのですが、これらのディレクトリ
情報を取得する方法ってありますか?
教えてください

655 名前:デフォルトの名無しさん :01/10/26 01:28
せんせー
hdc = GetDC(hList);
SetTextColor(hdc,RGB(0,0,0));
SetBkColor(hdc,RGB(0,0,10));
SendMessage(hWnd,WM_CTLCOLORLISTBOX,(DWORD)hdc,(DWORD)hList);
ReleaseDC(hList,hdc);
で、リストボックスの描画色と背景色を変更したいのですが変わりません。
どーしたら良いのでしょう?

656 名前:デフォルトの名無しさん :01/10/26 01:32
HTTPを実装すればいいんでない。

657 名前:デフォルトの名無しさん :01/10/26 01:57
>>655
hWndはリストボックスの直接の親か?
つか、WM_CTLCOLOR〜って、親に送るんじゃなくて親がシステムから
受けるためにあるんだけど。
親がそのメッセージを受け取ってブラシハンドルを返すのが正しい。
あと、このメッセージはスレッドをまたがない。

658 名前:655 :01/10/26 02:02
はい、直接の親です。
うー、そうなんですか。
どうしたら色変更できますか?
SetSysColors使ったら全部のウィンドウの色が変わっちゃうし。

659 名前:デフォルトの名無しさん :01/10/26 02:13
>>658
よく読め。親でWM_CTLCOLOR〜のハンドラを実装する。
で、渡されたDCに適切なコンテキストを設定して、背景色にする
ブラシのハンドルを返す。
ていうかMSDNに書いてあるよ。

660 名前:658 :01/10/26 02:28
>>659
ごめんなさい。
MSDN英語で今一良く解らず。
一応
case WM_CTLCOLORLISTBOX:
hdc =(HDC)wP;
SetTextColor(hdc,RGB(10,20,255));
SetBkColor(hdc,RGB(100,20,20));
hBrush = GetStockObject(GRAY_BRUSH);
return (WORD)hBrush;
break;
と書いて出来ました。これで良いでしょうか。

661 名前:660 :01/10/26 02:37
あー、ありがとうございますって言ってないし。
>>657,659
ありがとうございました。

662 名前:デフォルトの名無しさん :01/10/26 10:54
あるプログラムを親プロセスから呼ばれないと起動しないようにできるでしょうか?
単体でエクスプローラからダブルクリックで起動しないのだけれどもある親プロセス
から呼ばれると問題なく動くようなものを作りたいのです。

663 名前:デフォルトの名無しさん :01/10/26 11:06
>>662
拡張子をexe以外にリネームしとく。って邪道?

664 名前:デフォルトの名無しさん :01/10/26 11:25
>>662
ある特定の引数を渡さないとすぐに終了させるようにする。
シェアウエアソフトなどのプロテクトみたいな考え。
これも邪道かな。

665 名前:デフォルトの名無しさん :01/10/26 12:07
>>662
親プロセスが子プロセスをまずサスペンドで起動する。

子プロセスのプロセス ID を使って、
親と子だけが知っているような名前付きのイベントや共有メモリなどの名前を生成したあと、
子プロセスをレジュームする。

実行を開始した子プロセスは、自分のプロセス ID を元にして先の名前をオープンし、
もしオープンできたら、親プロセスから呼ばれたとわかる。

もしオープンできなければ、赤の他人から起動されたとわかる。

666 名前:デフォルトの名無しさん :01/10/26 18:56
基礎的かもしれませんが・・・。マウスのボタンが押されているかどうかは
どうやって調べるのでしょうか?

667 名前:デフォルトの名無しさん :01/10/26 19:08
>>666
WM_{L|M|R}BUTTON{DOWN|UP}をハンドルして状態を保存するか、GetKeyStateを使う。

668 名前:デフォルトの名無しさん :01/10/27 20:28
>662
プログラムをexeではなくdllで作れば。

669 名前:デフォルトの名無しさん :01/10/27 22:41
厨房な質問させて下さい。
APIとシステムコールって何がどう違うのですか?
Winのプログラムを勉強し始めたら、やたらとAPIという
単語が出てきます。Linuxでやってた時はAPIという単語
は出てこなかったのですが。。。

670 名前:デフォルトの名無しさん :01/10/27 22:59
>>669
両者の正しい定義は知らないんですが、ニュアンスとしては、
システムコールは、OSに依頼せざるを得ない処理、ハード直結操作とか。
APIは、システムコール+各種のライブラリ、の総称。
という感じではないでしょうか。

671 名前:デフォルトの名無しさん :01/10/27 23:45
>>669
OS が直接提供するサービスを呼び出す、具体的にはソフトウェア割り込みなどを使って特権モード
で動いているカーネルプロセスに制御を移すのがシステムコールで、それ以外はすべてライブラリ
関数。

UNIX ではシステムコールがすべて公開されていますが、Win32 ではシステムコールは原則として
非公開で、アプリケーションプログラマが直接呼び出すのは禁止されています。で、代わりにシステ
ムコールを内部で呼び出す(呼び出さないものもあるライブラリ関数が標準化され公開されており、
この公開インターフェースを Win32 API と呼称しています。

672 名前:デフォルトの名無しさん :01/10/29 10:17
インストール中に二枚目のCDを入れると二枚目のCDROMのautorun.exeが起動してしまいます。
インストーラーが裏で動いているときだけ起動しないようにするにはどうすればいいでしょうか?

673 名前:デフォルトの名無しさん :01/10/29 10:27
>>672 2枚目の autorun.exe でインストーラを検出

674 名前:デフォルトの名無しさん :01/10/29 11:21
>673

どのようにすればインストーラを検出できるのでしょうか?

675 名前:デフォルトの名無しさん :01/10/29 11:23
>>674 & >672
Mutex作るなり、FindWindowするなりでインストーラプログラムを見つけろ。

676 名前:669 :01/10/29 14:51
>>670
>>671
レスありがとうございます。おかげで理解できました。

677 名前:デフォルトの名無しさん :01/10/29 16:07
データが1万件程あるせいかListView_DeleteAllItems()での削除が
遅いんですけど、多少でも速くなる方法はなんかあります?
(追加もまぁ遅いけどそっちは何故かあまり気にならない^^;)

678 名前:677 :01/10/29 16:08
誤sage age

679 名前:デフォルトの名無しさん :01/10/29 22:45
.NETが正式に採用されるとWin32APIは無くなるの?
今まで必死に覚えたのが無駄になる?

680 名前:  :01/10/29 23:39
>>677
仮想リストビュー使え。

681 名前:680 :01/10/30 00:03
>>677
おお、なるほどこんないーもんがあったのか。
ありがと。

682 名前:デフォルトの名無しさん :01/10/30 20:00
常にとあるWindowの前には出したいが
最前面はいやだっていう我侭に答えてくれるAPIってなんですか?

683 名前:デフォルトの名無しさん :01/10/30 20:03
うぃんさんにーあぴ。

684 名前:デフォルトの名無しさん :01/10/30 21:09
>>682
そのとあるWindowの子ウィンドウとしてモードレスダイアログにすれば良し。

685 名前:デフォルトの名無しさん :01/10/31 06:10
rewindだっけなぁ〜どうもわからんちん・・・・教えて

686 名前:デフォルトの名無しさん :01/11/01 17:57
あげろーーーーーーーーーーーーー

687 名前:デフォルトの名無しさん :01/11/01 18:24
謹んで質問させて欲しいのですが、、

POINT pt:
......
ptは、LBBUTTONUPの際の座標です。

hTarget=WindowFromPoint(pt);
hTargetChild=ChildWindowFromPoint(pt);

です。これで、MyDocumentのフォルダーの、キャプションを調べてみたものです。
やると、
hTarget:16進 ba8,10進 2984
hTargetChild:16進 ca8,10進 3240
(ちなみに、hTarget→ClassName:[CabinetWClass],
hTargetChild→ClassName:[SHELLDLL_DefView],)
なる結果となります。

hTargetChildが、まさに、キャプションのハンドルで、
   hTargetは、それが直接属するところの、親ウィンドウハンドル、
という解釈でいいのでしょうか?混乱しています。

マウスで選んだ対象が、子ウィンドウである場合は、ハンドルはhTargetChildであり、、
親ウィンドウである場合は、ハンドルはhTarget、、である。と考えればいいのかなぁ、


意味不明なので参考まで。↓
(しばしばhTargetChildは、0を返す場合があります。。このとき
このことを、「これは親ウィンドウだ」と、、理解、、している、、のですが。。

あぁ、鬱だ。。

688 名前:デフォルトの名無しさん :01/11/01 18:32
>>687
あぁ、鬱だは撤回させてください。。

689 名前:デフォルトの名無しさん :01/11/01 23:47
CreateFileMappingはメモリ共有以外で何に使えるのでしょうか?
これで巨大なメモリブロックを予約して、
テンポラリファイルみたいに使えるのですか?

690 名前:Spy :01/11/01 23:56
他のアプリで表示されてるテキスト文字列を取得するAPIは何でしたっけ?

691 名前:デフォルトの名無しさん :01/11/02 00:01
>>689

どっちかっていうとメモリ共有よりも
高速なファイルの読み書きに使うものでは?
Win98以降の場合、VCacheの中身が直接マッピングされるので、
読み書きとも無駄なメモリ間移動がなくなるので、
高速に(かつ省メモリで)動作させられる。

当然、共有モードで開いたファイルには使えないんだけどね。。。

692 名前:デフォルトの名無しさん :01/11/02 00:20
VCache と MapCache
http://home.impress.co.jp/magazine/dosvpr/q-a/9912/qa9912_3.htm

ファイルマッピングオブジェクトとは関係無さそうですが・・・。

693 名前:デフォルトの名無しさん :01/11/02 02:17
>>690
何のテキストだ。
EditコントロールならGetWindowText。
コンソールアプリの標準出力ならパイプとか出力コンソールのハンドルとか。

694 名前:690 :01/11/02 02:40
>693
アマ厨房なもので、Editコントロールかどうかちょっとわかりません(汗)。
コピペできない表示データ(1行程度)を現在は手打ちしてますので、
自動で取得できたらなと…。
でも、調べてみたら、GetWindowTextが使えそうなので、やってみます。
ありがとうございました。

695 名前:デフォルトの名無しさん :01/11/02 16:44
>>692

それ、説明悪いね。すべてのファイル入出力がマッピングされるかのように
読み取れなくもない。
たぶん、そこでいっているのは、あくまでもスワップファイルについての話だとおもう。

ファイルマップを使った場合には、
例えばファイルの中身を見てそれを画面に出力するというしょりは、
以下のようになる。

Disk->VCache->Display

たいして、通常のファイルI/O関数を使うと、
一旦アプリケーションのローカルメモリにコピーする処理が必要になる。

Disk->VCache->Buffer->Display

ファイルマッピングでは、VCache上に読み込まれているデータの
アドレスを直に得られるのがポイント。

試しに、適当なバイナリファイルを開いて、
それの中身をバイト単位かなんかで、すべてインクリメントしていくプログラムを書いてみよう。
ファイルマッピングを使ったときと使わなかったときで
処理速度が違うのがわかると思う。

696 名前:デフォルトの名無しさん :01/11/02 20:59
>>693
GetWindowTextはEditコントロールに対してはそのテキスト
の取得だけど、Editコントロールじゃないウィンドウハンドル
に対してはキャプションを返すよね。。

697 名前:689 :01/11/03 01:51
Disk->VCache->Display
つまり、MapViewOfFileはVCache内のポインタを返すのですね!

FlushViewOfFileとFlushFileBuffersの速度がかなり違いました。

698 名前:デフォルトの名無しさん :01/11/03 02:56
ちかぢか使いそうなのでage
身勝手でゴメン

699 名前:691==695 :01/11/03 18:21
>>697

わかった?
ま、正直あんま使いどころ無いんだけどね。
秒間何MB〜何十MBとか読み書きするようなプログラムでないとほとんど意味ない。
やっぱりマルチメディア系ですかねぇ、使いどころがあるとしたら。
WAVEファイルの読み書きとかAVIファイルの読み書きとかぐらいかも。

700 名前:689 :01/11/04 00:02
691さん、ありがとうございます。

テンポラリファイルは ReadFile/WriteFile でやります。

701 名前:デフォルトの名無しさん :01/11/04 05:34
fpStartHook = (PSTARTHOOK)GetProcAddress(hMyLib,"_StartHook");

・・・・・即答でおねがいします。




なぜかというと、dllのソースで,定義は「EXPORT BOOL StartHook()」としてたのです。
(#define EXPORT extern "C" __declspec(dllexport)

どうあってもfpStartHookがNullなので、あまりに不甲斐なく、暇ももてあまして
たのでいん歩ライブなどやってみて、しかも、偶然type hoge.libとすると、
各関数の前にアンダーバー_がついていたので、プログラムにもアンダーバーを
つけたらうまくいきました。どんなところをみてもアンダーバーなんか書いてなかった
ので、意味がわかりません。どうしてうまくいったのですか?

702 名前:デフォルトの名無しさん :01/11/04 05:44
あしたまでに即答だゴルぁ!

703 名前:デフォルトの名無しさん :01/11/04 05:56
自分で読み返してみれば直ぐわかりそうなもんだが…

704 名前:デフォルトの名無しさん :01/11/04 14:49
波動→真昇龍→上段即答蹴り→のっけあうつ

705 名前:デフォルトの名無しさん :01/11/04 17:05
701
どのような参考をみても、
fpStartHook = (PSTARTHOOK)GetProcAddress(hMyLib,"StartHook");
の形式なのに、なぜ、僕は、
fpStartHook = (PSTARTHOOK)GetProcAddress(hMyLib,"_StartHook");
としなければならなかったのか、アンダーバーの重要性がわかりません。

706 名前:デフォルトの名無しさん :01/11/04 17:37
#define EXPORT extern "C" __declspec(dllexport) __stdcall

707 名前:デフォルトの名無しさん :01/11/04 19:24
わかりました。なんとなく調べてみます。>>706

708 名前:デフォルトの名無しさん :01/11/04 19:44
IMEの変換中のフォントを変える方法ありませんか?
エディタコントロールならEM_SETIMECOLORで出来ますが
そうでない場合はどうするんでしょ。

709 名前:デフォルトの名無しさん :01/11/04 19:44
.NETになったらWin32APIは無くなるんですか?
それともずっと使えるんですか?

710 名前:デフォルトの名無しさん :01/11/04 19:46
今もDOS/Win3.1のプログラムが走るってあたりから推測できんかね

711 名前:デフォルトの名無しさん :01/11/04 20:13
.NETってあくまでもラッパーみたいもんじゃないの?

712 名前:デフォルトの名無しさん :01/11/04 20:23
>>712
ImmSet〜で始まるAPIを調べよ。

713 名前:708 :01/11/04 20:36
>712
えっと、こんな感じだと思うんですが、
どれも実現できなそうなんです。

ImmSetCandidateWindow...変換候補窓の位置
ImmSetCompositionFont...変換窓のフォント(色は無理)
ImmSetCompositionString...変換文字・情報
ImmSetCompositionWindow...変換窓の位置
ImmSetConversionStatus...変換状態
ImmSetOpenStatus...IMEオープン可否
ImmSetStatusWindowPos...IMEツールバーの位置

714 名前:デフォルトの名無しさん :01/11/04 20:54
>>713
お前、>>708に自分でなんて書いたかもういっぺん読んでみろ。

715 名前:708 :01/11/04 21:17
すいません。
EM_SETIMECOLORで通じると思ったんですが、
変換属性ごとのフォント・背景色などを設定したいわけです。
(↑入力、変換中、変換後、選択中といった属性)

716 名前:デフォルトの名無しさん :01/11/04 23:45
レジストリで、たまたま他のアプリが同一パスの同一キーを使う場合、
どうなるのでしょうか?
これを回避する仕組みがWindowsにあるのでしょうか?

717 名前:デフォルトの名無しさん :01/11/05 00:06
なんで「Easy-G」が公開停止になったか考えてみるがよい!
若人(あきら)よ!

718 名前:_ :01/11/05 00:34
つまらんおやじが常駐しているな。。。

719 名前:デフォルトの名無しさん :01/11/05 04:40
>>715
できません。

>>716
GUID

720 名前:デフォルトの名無しさん :01/11/05 10:50
ウィンドウを透明化するのにWin2000では、SetLayeredWindowAttributesを
使っていろいろ応用できそうですが、WinMe/98で同様のことをするのは
無理っぽいでしょうか?
またWinXPは、どうなんでしょうか。

ご存知の方、ご教授ください

721 名前:デフォルトの名無しさん :01/11/05 13:19
>>720
XPはOK。
ME/98は自分で描画するほかない。

722 名前:デフォルトの名無しさん :01/11/06 04:33
dllの変数の共有をやるには、#pragmaしかないんですか?ひょっとして
staticとかで、どうにかなりませんか?あぁ、、

#pragma data_segをつかうには.defファイルをつくらないとどうしても
だめですか?無料コンパイラBCC55をつかっているのでプロジェクトに参加
なんていう便利なポップアップは当然ありません。どうすれば、ば、いいどかな。

ちなみにWH_CALLWNDPROCを使っています(フックします、ご注意ください)

723 名前:デフォルトの名無しさん :01/11/06 10:57
>>722
メモリマップトファイル

724 名前:デフォルトの名無しさん :01/11/06 14:27
>>715
できます。
ImmGetCompositionStringで変換中の文字列を取得して、
それぞれの変換属性ごとに自分で勝手に好きな色で画面に書けばおっけー

725 名前:デフォルトの名無しさん :01/11/06 15:24
VC++のデバッグ実行時にカーソル(キャレット?)を変数に当てるとその値を表示してくれますが、
あんな感じのことをリストビューのアイテムに対しても出来るでしょうか?

726 名前:720 :01/11/06 16:12
>>721
合成処理は自分で行うつもりなのですが、
下地(デスクトップ)のパターンを取得しつつ
(するだけなら簡単ですが)
そこを、透明度0のウィンドウがあるという仮定が
できればいいのですが。
あ、Win95/98の話です。

727 名前:デフォルトの名無しさん :01/11/06 16:16
>>720
自分の下にあるウインドウを含めたデスクトップのイメージを取得することが出来ないので、
9x/MEでは不可能

728 名前:708 :01/11/06 16:35
>724
ありがとうございます。
Wordpadなど見ると、日本語入力中も随時「実際入力されたように」表示されるので、やはりそういう処理なんでしょうね。
そうするとIMEで設定出来るフォント情報はレジストリ辺りから拾えるのかな。調べてみます。

729 名前:724 :01/11/06 16:58
>>728
フォントも自分で勝手に好きなフォントで書けばおっけー。

730 名前:デフォルトの名無しさん :01/11/06 16:59
フォントデータをビットマップに変換するのに、いい方法があったら教えてください

731 名前:デフォルトの名無しさん :01/11/06 17:05
>>730
GetGlyphOutline

732 名前:デフォルトの名無しさん :01/11/06 19:06
あるDLLの中でWH_CALLWNDPROCシステムフックをかけると、
そのDLLはすべてのプロセスから共有されていることになりますか?

それと、hFileMapping=CreateFileMapping(...)は
複数個(hFileMapping1,hFileMapping2....というふうに)
使うことはできますか?

733 名前:ゲイ2 :01/11/06 20:40
CreateFontIndirect(&lf)
LOGFONT lf;

の使い方教えてください。

734 名前:デフォルトの名無しさん :01/11/06 21:29
>>732
システムフック:なりません。
ファイルマッピング:出来ます。
>>733
LOGFONT のメンバを全部設定して、CreateFontIndirect を呼ぶと、HFONT が得られるので、それをデバイスコンテキストに選択して使います。

735 名前:名無しさん :01/11/06 21:50
>>720
http://www.ksky.ne.jp/~seahorse/libgw/
これは?

736 名前:デフォルトの名無しさん :01/11/06 22:07
>>735
その程度のことなら以前市販ソフトのテキストエディタでやってたね。
LayeredWindowと違って、下のウインドウの再描画が去れない

737 名前:デフォルトの名無しさん :01/11/06 22:09
>708,728
IME未確定・変換文字列の描画は、「IMEが描画を行う場合」と「アプリケーションが描画を行う場合」の2種類ある。
普通ソフトは前者なんだが、WordPadみたいに一部のソフトは後者を採用してる。
このリンクの先に両方のケースのサンプルコードがあるよ。
http://www.justsystem.co.jp/tech/atok/download1.html

738 名前:デフォルトの名無しさん :01/11/06 22:53
>>737
つか、MSOfficeのコンポーネントがそうしてるからでしょ。
コンパネで設定する色はOfficeコンポーネントにしかきかんし。

739 名前:デフォルトの名無しさん :01/11/07 01:12
>>732-734
ウィンドウの無いプロセスはそのDLLをロードしないって事なのですか?

740 名前:デフォルトの名無しさん :01/11/07 01:23
>>739
すべてのプロセスで1つのDLLを共有するのではなく、それぞれのプロセス空間で別々にDLLがロードされます。メモリ空間が異なるのでやっかいな問題になります。

741 名前:739 :01/11/07 04:15
おっと、そういう意味でしたか。

WH_CALLWNDPROCはウィンドウが必要なので、ウィンドウの無いプロセスは
そのDLLをロードしないのか?
って質問だと思った・・・。

742 名前:740 :01/11/07 09:20
>>740
む。そう取れなくも無い。

743 名前:デフォルトの名無しさん :01/11/07 16:47
732です。
>>740
あ、そうなんです。いろいろやってみて
そんなようなことに気づき混乱したんです。
DLLで定義したint nCountが、それぞれの
プロセス(WH_CALLWNDPROCフックのかかっているすべてのプロセス)
で、独立にカウントされているようだったからです。
それぞれのプロセスが独立にそれぞれ、int nCountを設けている
感じでした。ので、それが困るのでCreteFileMappingを使いましたが、
うまくいかないので思考錯誤中です。

でエラーがでるので、まずはこの部分からみなおしてみました。
hFileMappintの複数設置は可能なのか・・・・と。
(DLL内のフック開始関数内で)
hFileMapping1 = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 4096*64, NULL);
buf=(char *)MapViewOfFile(hFileMapping1, FILE_MAP_ALL_ACCESS, 0, 0, 0);
hFileMapping2 = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 128, NULL);
buf1=(char *)MapViewOfFile(hFileMapping2, FILE_MAP_ALL_ACCESS, 0, 0, 0);*buf=NULL;
hFileMapping3 = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0,sizeof(int), NULL);
pnCount=(int *)MapViewOfFile(hFileMapping3, FILE_MAP_ALL_ACCESS, 0, 0, 0);
*pnCount=0;
・・・直後に hHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)MyHookProc, hInst, 0);
これはこれで、いいのかぁと考え中

744 名前:708 :01/11/07 16:53
>724
そうですね。IMEの設定と同期しようかと思ったんですが。
>737
ATOKのサンプルなんですね。初見です。ありがとうございます。
>738
なるほど。WordpadがIMEの設定と同期しないんで、自分のアプリもいいかなー思ってたんですが、そういうことなんですね。

皆さん参考になりました。

745 名前:デフォルトの名無しさん :01/11/07 17:19
Mapped File の本来の使い方は、片方のプロセスで、
   a) CreateFileMapping と
     MapViewOfFile
を実行し、もう片方のプロセスで
   b) OpenFileMapping と
     MapViewOfFile

こういうことだと思います。>>743

746 名前:740 :01/11/07 18:51
>>743
ファイルマッピングハンドルも、ポインタも、何もかもが、相手のプロセス空間に渡せないので、それだとダメです。

747 名前:デフォルトの名無しさん :01/11/07 19:54
>>745
本来の使い方じゃネーだろ

748 名前:デフォルトの名無しさん :01/11/07 22:31
>743
>>hFileMappintの複数設置は可能なのか・・・・と。
可能だけど、ほかのプロセスから呼びたいなら、それぞれのマッピングオブジェクトに名前をつけないとダメ。
CreateFileMappin()の最後の引数で。
それぞれに一意な名前を付けて、呼び出すときにほかのマッピングオブジェクトと区別するんだよ。
参考↓
http://members.tripod.com/~masapico/api_CreateFileMapping.html

749 名前:デフォルトの名無しさん :01/11/07 23:14
buf=(char *)MapViewOfFile(hMapFile1,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
フックプログラムなんですが、ファイルマップトファイルを使った
あとから問題が起こりました。そのプログラムを初めて起動した場合は
スムーズの実行されるのですが、一度終了して、2度め、3度目、と
回をおう毎に、(そのプログラムの)動作が遅くなっていきます。
というか、フックプログラムなのでフック中はパソ全体が重くなります。
(回をおう毎に)

そこで・・・・
buf=(char *)MapViewOfFile(hMapFile1,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
にstrcatを行っているところに注目したのですが。
bufはサイズ2048*128で、最後のほうまでいったらbufをクリアしています。が。
MapViewOfFileで指定されたこのbufに、*buf=NULLとすると、バッファクリア
になるでしょうか?それともzeromemoryかmemset('\0',sizeof())つかわないと
だめでしょうか、あとは、MapViewofFileは特殊っぽいので、SetFilePointer(File
_BEGIN)とかつかうのかわかりません。

疑問なんですが*buf=NULLてのは、buf[0]='\0'てことなのかなぁ。

750 名前:デフォルトの名無しさん :01/11/07 23:19
>>748おぉ!それはクリアできました。
名前を付けないと・・だめですよね。各プロセスが
判別する方法がないから。

あと、ファイルマップのハンドルの破棄は、それに対して一回だけすれば
いいのかなぁ、しかもそれは\0で完璧に埋めてくれるのかが疑問です。
あぁ・・・果てしない


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.