Win32API質問箱 Build51at TECH
Win32API質問箱 Build51 - 暇つぶし2ch511:509
07/04/03 21:02:37
どうも。言葉が曖昧ですんません
現在アクティブなウィンドウが非アクティブにならなきゃいいんです。。
つまりアクティブ化しないように出来ませんかってことで

512:506
07/04/03 21:02:43
>>508
CreateCursorを調べてみましたが、モノクロのビットマップカーソルは
作成できるようです。今回はカラー(24bit以上か、せめて16bit以上)
のマウスカーソルを作りたいのです。

システムグローバルではなくて、自アプリのカーソルのみです。

>>507
その方法だと、自アプリの縁を少しはみ出した状態で(ホットスポットが
自アプリ内)、クライアント領域の外にマウスが描画されないです。

513:506
07/04/03 21:11:20
カラーのマウスカーソルに関しては、CreateIconIndirectっていうのを
見つけました。

514:デフォルトの名無しさん
07/04/03 21:40:59
>>512
URLリンク(msdn2.microsoft.com)

515:デフォルトの名無しさん
07/04/03 23:23:11
Response & Balance 2600cc Dohc Engine Twin Turbo

516:デフォルトの名無しさん
07/04/04 01:19:05
>>511
違う方法になるけどWS_EX_TRANSPARENTは駄目?

517:509
07/04/04 02:20:26
>>516
ありがとうございます。

マウスホイールが透過するようになりました
が、クリックも透過してしまいます。
なんか情報後出しになってしまいましたが。


518:517
07/04/04 02:36:46
>>517
WM_COMMANDを監視してマウ筋から送られてくるコマンド(message)に対して
return値をごにょごにょする

519:デフォルトの名無しさん
07/04/04 06:46:10
>>509
WM_WINDOWPOSCHANGINGでSWP_NOACTIVATEを強制的に立てる

520:デフォルトの名無しさん
07/04/04 09:52:27
マウスフックを使用したプログラムを作成しているのですが、
システムフックが上手く機能しません。以下の事例と全く同じ現象です。
URLリンク(rararahp.cool.ne.jp)
他のプログラムのソースを参考にしたいので、何かあれば教えて下さい。
お願いします。<(_ _)>

521:デフォルトの名無しさん
07/04/04 10:32:21
>>520
その先読んでみたけど仕様を勘違いしているただの間抜けにしか見えないんだが

522:デフォルトの名無しさん
07/04/04 11:56:15
ウィンドウ上にボタンを配置し、クリックで新しいウィンドウを表示するプログラムを作成しています。
クリックで呼び出される側は  WM_DESTROY メッセージが来たときに

  SendMessage(hWnd, WM_CLOSE, 0, 0L);

として終了しています。
で、質問なのですがクリックで表示するウィンドウのCreateWindowで取得したハンドルは
クローズしなくてもリークしませんか?
しないといけない場合、どこですればいいのでしょうか?


523:デフォルトの名無しさん
07/04/04 14:50:19
親ウィンドウが破壊されるとき、
子ウィンドウも一緒に破壊される。

524:デフォルトの名無しさん
07/04/04 17:07:22
rand()の代替ルーチンがあったら教えてください

525:デフォルトの名無しさん
07/04/04 17:17:03
CryptGenRandom
再現性で問題が出るかもしれないが。

526:デフォルトの名無しさん
07/04/04 17:17:12
Win32APIにはないから自分で作れ。

527:デフォルトの名無しさん
07/04/04 17:19:42
まあ2000以降は仕様上プロセスが終了したら基本的にオブジェクトは何も残らんけどな

528:デフォルトの名無しさん
07/04/04 23:19:10
URLリンク(r.tabelog.com)
お○んこ画像

529:デフォルトの名無しさん
07/04/04 23:51:00
お○んこ!しかも無修正!!

530:デフォルトの名無しさん
07/04/04 23:51:07
>>528
うひょ~、よだれが出てくるぜ

531:デフォルトの名無しさん
07/04/04 23:55:44
>>528
もう我慢できない

532:デフォルトの名無しさん
07/04/05 00:00:44
>>528
綺麗に処理してあるな

533:デフォルトの名無しさん
07/04/05 00:04:27
こんやのおかずにちょうどいい。くれ。

534:デフォルトの名無しさん
07/04/05 00:11:10
俺、今がちょうどこういうのが欲しくなる時間なんだ

535:デフォルトの名無しさん
07/04/05 00:11:34
>>527
終了したプロセスへのハンドルをつかんでい00る、別プロセスがあるかもしれない。

536:デフォルトの名無しさん
07/04/05 01:22:33
> つかんでい00る
00ってなんじゃらほい

537:デフォルトの名無しさん
07/04/05 02:19:39
パーマン絵描き歌を思いだした

538:デフォルトの名無しさん
07/04/05 09:51:06
ここ何スレだよw


539:デフォルトの名無しさん
07/04/05 11:19:22
プロセスの実行時間を計るのはどうしたらいいんでしょうか?
実時間じゃなくてプロセスの一部の処理に使ったユーザー時間のようなもの
が欲しいです。
PDHとやらを使うのかと思ったんですがよく分かりません。

540:デフォルトの名無しさん
07/04/05 12:15:38
>>539
timeGetTimeの差分じゃダメ?

541:デフォルトの名無しさん
07/04/05 12:20:28
GetProcessTimesじゃらめぇ?

542:デフォルトの名無しさん
07/04/05 12:49:32
>>539
>実時間じゃなくてプロセスの一部の処理に使ったユーザー時間のようなもの
>が欲しいです。

ここを詳しく。
処理に費やした時間を計測したいのか?


543:デフォルトの名無しさん
07/04/05 12:58:29
CPU時間でしょ。
>>541でおk

544:539
07/04/05 13:24:19
>>542
そうです。Unixのtimeの結果のようなものを計算したいんです。
GetProcessTimesを使ってみます。ありがとうございました。

545:デフォルトの名無しさん
07/04/05 13:46:06
モジュール内で抜けるまでどれくらい時間がかかてtるのかを計測したいなら
GetTickCountでいいような希ガス

546:デフォルトの名無しさん
07/04/05 16:01:50
すいませんWin32API入門の第72章リソースで詰まってしまいました
BorlandC++にBCCFormを入れてます

EDGEで32×32のtest.bmpを作って、アイコンとして読み込みたいんですが
LoadIcon()は分かるんですが、そこに至るまでが???で

宜しくお願いします

547:デフォルトの名無しさん
07/04/05 17:00:16
>>546
「メニュー」→「プロジェクト」→「プロジェクトに追加」
ファイルの種類を「リソースファイル (*rc)」にして、作成したrcファイルを指定する。

これだけで、後はその例通りに行けるよ。

548:デフォルトの名無しさん
07/04/05 18:21:32
>>547
レスありがとうございます
でもどうやらどつぼにはまったようで、さっぱり分かりません

.RES拡張子のファイルがないので
リソースコンパイラがよく分かってないようです

549:デフォルトの名無しさん
07/04/05 18:25:35
BorlandC++なら自前で .res にコンパイルしなくても
コンパイラが自動でやってくれる。

550:デフォルトの名無しさん
07/04/05 18:45:41
FILETIME構造体の
DWORD dwLowDateTimeと DWORD dwHighDateTime
の各ビットの意味教えてください。
年と月と日と時間が何ビットに書かれているかわかりません。


551:デフォルトの名無しさん
07/04/05 18:53:36
>>546
ビットマップファイルとアイコンファイルは別物なので
まずbmp→icoの形式変換から始めなはれ

>>550
ここがそのまんま役に立ちそう
URLリンク(wisdom.sakura.ne.jp)

552:デフォルトの名無しさん
07/04/05 18:54:25
直接ビット見たことないな

553:デフォルトの名無しさん
07/04/05 18:54:52
>>550
URLリンク(msdn2.microsoft.com)
1601年1月1日 (UTC)からの100ナノ秒単位での経過時間。
1つの64ビット整数だと見なせばよい(実際にそう扱うならアラインメントに注意)。

そういうわけでどこのビットが年とか月とかそういう性質のものではない。
だから素直にFileTimeToSystemTimeでも使っていなさい。

554:デフォルトの名無しさん
07/04/05 19:17:29
素直にfiletimetosystemtime使ったほうが早そうですね
こちらで検討してみます。
ありがとうございました


555:デフォルトの名無しさん
07/04/05 19:25:07
Notepadのように、フォームの領域一杯にEDITを表示してフォームのサイズ変更に追従させたい。
ドットネットで言う
textBox1.Dock = DockStyle.Fill;
をやりたいのですが

これってCreateWindow時にウィンドウスタイルのようなもので設定するとばかり思っていたのですが
そのような設定が見あたりません。
もしかしてウィンドウプロシージャのWM_SIZEのところで、自分でEDITのサイズを変更しないといけないんでしょうか?

556:デフォルトの名無しさん
07/04/05 19:28:14
そのまんまサイズ渡してやるだけ

557:デフォルトの名無しさん
07/04/05 19:42:20
>>549 >>541
レスありがとう

EDGEに.icon保存形式があったのでそれにしました
色々弄ってみて最後にBCCデベロッパーのDOSアイコン(コマンド実行)から
brc32 test.rc main.exe と入力したら
何とかmain.exeのアイコンだけ変えることができました
exe起動後のウィンドウタイトルバーの横のアイコンが変わらないので
また弄ってみます

558:デフォルトの名無しさん
07/04/05 19:45:32
>>557
それはウィンドウクラスのアイコンを設定すればいい

559:デフォルトの名無しさん
07/04/05 19:49:08
>>556
できました。
覚悟はしていたが本当に全部で自分でやらないといけないんだな・・。

560:デフォルトの名無しさん
07/04/05 19:55:08
>>558
この部分のことですよね? winc.hIcon = LoadIcon();
一応LoadIcon(hInstance, TEXT("KITTY") );とやってるんですがならないので
初めからやり直してみます

561:デフォルトの名無しさん
07/04/05 20:21:26
>>140
URLリンク(www.codeproject.com)

562:アイコンで聞いた者
07/04/05 21:02:27
何とか上手くやれるようになりました!
何度も聞いて申し訳なかったです
レスしてくれたみなさんありがとうございました

563:デフォルトの名無しさん
07/04/05 23:18:48
>>561
すげえw

564:デフォルトの名無しさん
07/04/06 04:31:37
デモ落としてみたけど根性ありすぎwww

565:デフォルトの名無しさん
07/04/06 10:09:34
>>561
これWin32APIで作られてるのか!?

566:デフォルトの名無しさん
07/04/06 10:13:48
>>561
軽く漏らした

567:デフォルトの名無しさん
07/04/06 11:01:24
>>565
思いっきりWTLって書いてあるじゃねえか

568:デフォルトの名無しさん
07/04/06 19:05:55
mcisend

569:デフォルトの名無しさん
07/04/06 19:10:36
VC++とplatformSDKで
mcisendcommad()でデバイスを開くときに
MCI_OPEN_PARMS構造体を使う場合でデバイスタイプにMPEGVideoを指定する事は出来るんでしょうか?
mmsystem.hにはMCI_DEVTYPE_SEQUENCERまでしか定義されてないようですが…

570:デフォルトの名無しさん
07/04/06 21:05:13
64ビット環境では___asmが使えないってのは本当なの?


571:は@c178.016.c3-net.ne.jp ◆cplnFO9T0I
07/04/06 21:30:33 BE:90784692-2BP(1000)
リストビューを使うためにLV_COLUMN構造体を定義しようとしても「定義されていない識別子です」と突っぱねられます。
VC.net20003を使っているのですが、どうすればいいでしょう。
前に痛い目を見たので#define WIN32_LEAN_AND_MEANはカットしているんですがね....

572:デフォルトの名無しさん
07/04/06 21:30:39
>>570
スレ違い

573:デフォルトの名無しさん
07/04/06 21:35:36
UNIXでの ls -a -r に相当するコードが知りたいです。
隠しファイル等を含む全てのファイルを再帰的に取得する方法を教えてください。

574:デフォルトの名無しさん
07/04/06 21:37:21
>>573
っ FindFirstFile
っ FindNextFile
っ FindClose

575:デフォルトの名無しさん
07/04/06 21:38:24
UNIX系のファイルシステムに、そもそも隠しファイルという概念など無い。
lsが勝手にフィルターしているだけ。

576:デフォルトの名無しさん
07/04/07 02:09:16
>>575
それを隠しファイルというんじゃないのか

WinだってExplorerが勝手にフィルターしてるだけだし

577:デフォルトの名無しさん
07/04/07 02:18:42
Win(というかFATとNTFS)にはファイル属性に隠しファイルビットがあるだろ
つーか質問はWindows上で隠しファイルを含めて検索する方法じゃないのか?
もう回答出てるけど

578:デフォルトの名無しさん
07/04/07 02:26:51
VC2005でダイアログボックスを作りたいのですが、どうやって作ったらいいのかわかりません。
VC2003だったらリソースの追加でできたのですがorz
ググッてみましたがわかりませんでしたので、教えてもらえると助かります。


579:デフォルトの名無しさん
07/04/07 02:56:36
>>578
Express Editionにはリソースエディタは付属しないので作れない。
別途にリソースエディタを用意するべし。

580:デフォルトの名無しさん
07/04/07 03:04:14
リソースエディタとはなんですか?
リソースの作り方すらわからない(´・ω・`)

581:デフォルトの名無しさん
07/04/07 03:07:18
これだからVCはオススメできない。

とりあえず、今までに作ったプロジェクトの拡張子が.rcの奴をテキストエディタで開け

582:デフォルトの名無しさん
07/04/07 03:12:15
開きましたー!!

583:デフォルトの名無しさん
07/04/07 03:13:34
>>580
2003で作ったときには開発環境でダイアログボックスを作れたでしょ?
あれは内部的にリソースエディタと呼ばれるツールを呼び出してただけなの
んでExpress Editionではその機能が削除されてるので作ることができない。

作ることができないといってもVCの開発環境で作ることができないだけで
リソースをプログラムから読み込むといったことは可能なので
フリーソフトのリソースエディタでダイアログを作るしかない、ってこと

584:デフォルトの名無しさん
07/04/07 03:20:29
>>583
親切にありがとう。

585:デフォルトの名無しさん
07/04/07 07:52:10
リソースって言っても二種類の意味で使われてない?

バイナリで書かれたリソースとテキストで書かれたのリソース
どう呼び分ければいいんだろう??

586:デフォルトの名無しさん
07/04/07 07:52:42
「書かれたリソース」の間違い

587:デフォルトの名無しさん
07/04/07 08:17:00
っ「リソーススクリプト」

588:デフォルトの名無しさん
07/04/07 08:19:44
リソース
 ├フォーマットがテキストの
 └フォーマットがバイナリの

589:デフォルトの名無しさん
07/04/07 09:02:01
コンパイル済みリソースがバイナリリソース。

590:デフォルトの名無しさん
07/04/07 17:13:30
テキストのリソースファイル(.rcファイル)+バイナリ(画像など)を
リソースコンパイラでコンパイルして .res ファイルをつくり
リンカで EXEにバインドする。直接.resを編集するツールもある。

591:デフォルトの名無しさん
07/04/07 21:12:44
僕ハッカー

592:デフォルトの名無しさん
07/04/07 21:15:17
僕バッカー

593:デフォルトの名無しさん
07/04/07 21:17:57
バカバッカー

594:デフォルトの名無しさん
07/04/07 21:18:00
バカばっかー

595:デフォルトの名無しさん
07/04/07 21:57:10
けこん

596:デフォルトの名無しさん
07/04/08 02:15:51
winAPIでテキストエディタに文字列を書き込んで保存したいのですが、どのようにしたらよいですか?
VC使って組んでいます。

597:デフォルトの名無しさん
07/04/08 02:18:20
意味が分からんな
外部のテキストエディタに文字を送り込むのか?
自前でテキストエディタを作るのか?

…単にテキストエディタじゃなくてテキストファイルってオチか?

598:デフォルトの名無しさん
07/04/08 04:21:34
普通にfopen、fwrite?

599:デフォルトの名無しさん
07/04/08 07:55:34
他のアプリケーションのウインドウの座標と大きさを取得するにはどうすれば良いですか?
また、座標と大きさを指定するにはどうすれば良いですか?

600:デフォルトの名無しさん
07/04/08 08:00:51
GetWindowRect
MoveWindow

プロセス跨いで使えたかはシラネ

 春 の 香 り 乙 !

601:デフォルトの名無しさん
07/04/08 08:51:32
>>600
ありがとうございました

602:596
07/04/08 10:28:48
>>597
テキストファイルの間違いでしたw

603:デフォルトの名無しさん
07/04/08 13:44:29
マウスフックについての質問です。MOUSEHOOKSTRUCT構造体の内容を
フックプロシージャから他のウィンドウプロシージャへ渡したいのですが、
上手くいきません。フックプロシージャのコードは次の通りです。
LRESULT CALLBACK HookProc(int nCode,WPARAM wp,LPARAM lp)
{
COPYDATASTRUCT cds;
if (nCode < 0) CallNextHookEx(hHook,nCode,wp,lp);
cds.dwData = wp;
cds.cbData = sizeof(MOUSEHOOKSTRUCT);
cds.lpData = (PMOUSEHOOKSTRUCT)lp;
SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cds);
return CallNextHookEx(hHook,nCode,wp,lp);
}
間違いがあれば指摘して下さい。又、参考になるソースがあれば教えて下さい。
お願いします。<(_ _)>

604:デフォルトの名無しさん
07/04/08 13:54:02
相手が別プロセスなら自メモリ領域のポインタを渡しても無意味。
相手のメモリ内に領域を確保してそのポインタを渡す。

605:デフォルトの名無しさん
07/04/08 14:12:44
Windows XPでのCPU使用率の取得方法を教えてください

606:603
07/04/08 14:19:45
>>604
そのためにWM_COPYDATAメッセージを使用しています。ファイルマッピングオブジェクトの
内容を参照するので、メモリを共有する必要は無いと思ったのですが。
URLリンク(yokohama.cool.ne.jp)

607:デフォルトの名無しさん
07/04/08 14:22:09
>>603
その中だとhWndが一番怪しい。
SendMessageするときにhWndにちゃんとした値が入ってる?

608:603
07/04/08 14:36:11
問題ありません。
「猫でもわかる」の162章のように、フックプロシージャ内での処理には成功しました。

609:デフォルトの名無しさん
07/04/08 14:49:03
そもそもうまくいかないって何が巧くいってないんだ?
WM_COPYDATA が hWnd の WindowProc に来ないのか、来た WM_COPYDATA からデータが取れないのか

610:603
07/04/08 15:00:54
>>609
WM_COPYDATAメッセージは届くのですが、COPYDATASTRUCT構造体の内容の参照が上手くいきません。
フックは次のようにセットしています。
#define EXPORT __declspec (dllexport)
#pragma data_seg(".shared")
static HHOOK hHook = NULL;
static HWND hWnd = NULL;
#pragma data_seg()
EXPORT HHOOK SetHook(const HWND hCaller)
{
hWnd = hCaller;
hHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)HookProc,hInst,0);
return hHook;
}
ウィンドウプロシージャでは次のように処理しています。
case WM_COPYDATA:
if (((PCOPYDATASTRUCT)lp)->dwData == WM_NCLBUTTONDOWN) {
pmhs = (PMOUSEHOOKSTRUCT)lp;
if (pmhs->wHitTestCode == HTCAPTION) {
SetWindowText(pmhs->hwnd,"猫でもわかるフック");
}
}
break;


611:デフォルトの名無しさん
07/04/08 15:22:04
>>610
> pmhs = (PMOUSEHOOKSTRUCT)lp;
pmhs = (PMOUSEHOOKSTRUCT)((PCOPYDATASTRUCT)lp)->lpData;
だろ常識的に考えて

612:603
07/04/08 15:38:41
>>611
すみません。ウィンドウプロシージャの処理を訂正します。(^_^;)
PCOPYDATASTRUCT pcds;
PMOUSEHOOKSTRUCT pmhs;
case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lp;
pmhs = (PMOUSEHOOKSTRUCT)(pcds->lpData);
if (pcds->dwData == WM_NCLBUTTONDOWN) {
if (pmhs->wHitTestCode == HTCAPTION) {
SetWindowText(pmhs->hwnd,"猫でもわかるフック");
}
}
break;
ローカルフックには成功したのですが、グローバルフックに失敗します。

613:デフォルトの名無しさん
07/04/08 16:03:20
SetWindowText が気になって仕方ないが、
WindowProc 内での pcds->dwData とか pmhs->wHitTestCode とかはどうなんだ?
正しい値を示してるのか?

614:603
07/04/08 16:46:12
他のアプリケーションにフックDLLがロードされていることは確認できたのですが、
COPYDATASTRUCT構造体の内容が空のようです。

615:デフォルトの名無しさん
07/04/08 18:41:35
URLリンク(msdn.microsoft.com)
> ほかのプロセス内のコントロールのテキストを設定するには、SetWindowText 関数を
> 呼び出すのではなく、直接 WM_SETTEXT メッセージを送ります。

何でフックがうまくいってないと思い込めるんだかさっぱり分からん。
明らかに間違ってたソースも「訂正します」の一言で済まされるし。

616:603
07/04/08 18:54:38
あたながたが思いのほか低スキルだったのでがっかりしています。
2ちゃんもたいしたことないですね。

617:デフォルトの名無しさん
07/04/08 18:56:30
↓真603による「616は私ではありません」というレス

618:デフォルトの名無しさん
07/04/08 18:56:33
615は無視かよ

619:603
07/04/08 19:50:46
>>615
SendMessage(pmhs->hwnd,WM_SETTEXT,0,(LPARAM)"猫でもわかるフック");
としたのですが、ウィンドウタイトルは変更されません。
間違ったソースを掲載したことについては深くお詫びします。大変申し訳ありませんでした。

620:デフォルトの名無しさん
07/04/08 20:43:43
>>619
dll.defに
SECTIONS
.shared SHARED READ WRITE
が有るか確認するとか

char sz[100];
wsprintf(sz, "pmhs->hwnd:%p ", pmhs->hwnd);
SetWindowText(hWndExe, sz);
として様子を見るとか

621:デフォルトの名無しさん
07/04/08 23:19:23
うまくいかないときには何がおきてるのかを見極めて原因究明。
期待通りにいくかいかないかだけを判断してたらいつまでたってもなおらん

622:デフォルトの名無しさん
07/04/09 00:44:15
デバッガ使ってないのかね?
1ステップずつ確認すれば、問題点はすぐに分かると思うが。

623:デフォルトの名無しさん
07/04/09 00:47:43
フックプロシージャのステップ実行なんて出来るの?

624:デフォルトの名無しさん
07/04/09 01:14:11
フック先のプロセスにアタッチしろ。

625:デフォルトの名無しさん
07/04/09 10:09:06
別にデバッガ使わなくてもログをファイルに書き出せばいいだけだし

626:603
07/04/09 10:33:11
>>620-624 レスありがとうございます。
>>620 モジュール定義ファイルは作成済みです。内容は次の通りです。
LIBRARY hook
SECTIONS
.shared READ WRITE SHARED
EXPORTS
HookProc @1
ResetHook @2
SetHook @3
pmhs->hwndの値をウィンドウプロシージャ内で出力したところ、
ローカルフックでは00060AA2でした。グローバルフックでは何も出力されませんでした。
グローバルフックではWM_COPYDATAメッセージが届いていないようです。(^_^;)
>>622 デバッガは使用していません。OutputDebugStringを使って変数の値をトレースしています。
>>623 プロセス間を跨いだデバッグ作業はどのように行うのでしょうか?
>>624 明示的にアタッチする方法があるのですか?
>>621 今までの状況を整理してみました。
・ローカルフックには成功し、グローバルフックには失敗する。
・ローカルフックの場合、フックDLLがロードされ、WM_COPYDATAメッセージが届く。
・グローバルフックの場合、フックDLLはロードされるが、WM_COPYDATAメッセージは届かない。

627:デフォルトの名無しさん
07/04/09 11:00:13
WindowsXPの[ユーザのログオフ]-[ユーザー切替]-[指定したユーザーのログオン]
という作業をプログラムから操作したいんですけど可能でしょうか?
可能なら使用するAPIを教えて頂けないでしょうか?

628:デフォルトの名無しさん
07/04/09 11:05:12
不可

629:627
07/04/09 11:11:17
やっぱりですね
即レスありがとうございました。

630:デフォルトの名無しさん
07/04/09 11:31:48
>>627
Ginaで何とかなるでしょ。Ginaでぐぐってみたら?

631:デフォルトの名無しさん
07/04/09 11:40:23
>>627
レジストリに自動ログオンの設定を書き込んで再起動

632:デフォルトの名無しさん
07/04/09 11:58:25
>>626
プロセスにアタッチするのははDLLをデバッグする場合の基本操作なんだが、
そんな当たり前のことを自分で調べられないのか?

633:デフォルトの名無しさん
07/04/09 14:27:57
グローバルフック成功してないんじゃね?

634:デフォルトの名無しさん
07/04/09 15:14:14
Windowsで標準入力や出力がリダイレクトされてるかどうか知る方法を教えてください。

635:デフォルトの名無しさん
07/04/09 15:56:31
現在VS2005を使っているのですが、作成してるネイティブアプリのVisualStyleを切るにはどの様な方法がよろしいでしょうか?
よろしくお願い致します。

636:デフォルトの名無しさん
07/04/09 16:28:21
まにふぇすとぶっこわす

637:デフォルトの名無しさん
07/04/09 17:01:54
むしろバージョン5のcomctl32.dllを使うようにマニフェスト書け

638:デフォルトの名無しさん
07/04/09 17:27:19
>>626
コードを一から書いたら、グローバルフックでもタイトルバーが変わった。
期待した動作にならなかったら、一から作り直すのも手かと。

つか、サンプルコードのコピペはおすすめできない。

639:デフォルトの名無しさん
07/04/09 18:06:07
>>636-637
レスありがとうございます。
というか何か勘違いしてました。。
VS2005では勝手に有効になると思ってましたがならないんですね・・・
この前作ったときはなってたような・・・気のせいか・・・orz

640:デフォルトの名無しさん
07/04/10 00:34:29
ツリービューのノードのアイコンを一つだけ変える場合って
どうすればええすか?
Expandしたら広がったフォルダを表示とか。


641:デフォルトの名無しさん
07/04/10 08:34:36
TVM_SETIMAGELIST で ImageList セット
TVM_SETITEM での fMask に TVIF_IMAGE|TVIF_SELECTEDIMAGE なり TVIF_STATE なり...

642:デフォルトの名無しさん
07/04/10 12:49:04
USBリムーバブルハードディスクのデバイス識別子?(USB\Vid_04xx&Pid_10xx)とかから
割り当てられている論理ディスクのボリューム名を取得したいのですが
どの辺を参照したらいいでしょうか。
「管理ツール」→「ディスクの管理」で下側ビューの左側「ディスクn」を右クリックしてプロパティを表示させて、
「ボリューム」プロパティーシートの下側リストビューに表示されているものが欲しいです。

643:デフォルトの名無しさん
07/04/10 16:50:17
SetMenuContextHelpIdに渡す「ヘルプコンテキスト識別子」ってなんなんですか?
「ヘルプコンテキスト」ってリソースで用意するんでしょうか?
それってどのような物で,どうやって作るんでしょうか?


644:デフォルトの名無しさん
07/04/10 18:08:33
Win32API を使って、DLL 中のダイアログリソースの PUSHBUTTON の文字列を取得することはできますでしょうか?
FindResource -> LoadResource -> LockResource まではできましたが、文字列の取得が分からない。

645:デフォルトの名無しさん
07/04/10 18:31:28
自分で解析

646:デフォルトの名無しさん
07/04/10 21:03:23
>>643のレスで思ったのだが、そーいや、2005からののヘルプはどうなんお?
昔は、HTML Help Workshopとかゴリゴリ作ったが?

URLリンク(msdn.microsoft.com)

ここでいいっけ?


それとも、暗黙でツールが入ってるのかな?

647:デフォルトの名無しさん
07/04/10 21:10:22
ゲームプログラムで質問ですwin32apiの関数を使うよりdirectxを使った方が画像の描画は早いですか

648:デフォルトの名無しさん
07/04/10 21:18:57
>>647
ちなみに、何系ゲーム?

649:デフォルトの名無しさん
07/04/10 21:30:43
シューティング系ゲームです。既にwin32apiで作ったのですが画面のスクロール速度を一定以上にあげるとフレームスキップが起こるです。

650:648
07/04/10 21:38:04
>>649
画面更新に速度を要求するなら、
DirectXなんじゃね?

DirectX~系の別スレがよろしいかと・・・

651:デフォルトの名無しさん
07/04/10 22:52:12
>>644
MSDN に PEFILE.cpp というサンプルがあって、.exe/.dll の先頭から
.rsrc section を割りだし、section 内のテーブルを追い掛けると、
個々の rsrc leaf に行き付ける例があったと思う。
dialog template の構造は MSDN に説明があった。

ただ、これらを取り出したり、差し替えたりするのに、ファイルとして
開く際、使用中だと開けないことがある。開く際の属性を指定すると
可能なのかも知れないが。

652:デフォルトの名無しさん
07/04/10 23:30:31
>651
いや、メモリに一度読み込めば問題なし。
昔、ダイナミックにダイアログリソース作ったときはそうやったよ。


653:デフォルトの名無しさん
07/04/10 23:36:48
GetCommandLine関数を利用する場合、
みんあは〝や空白の分割とかどしてる?

思いつき関数作ったけど、意見求む。

654:653
07/04/10 23:38:46
前半
DWORD OrderCommandLine(LPTSTR lpBuffer, LPDWORD lpcchBuffer)
{
DWORD i, dwLen, dwPos, dwCnt, dwDiv;
TCHAR tcChr;
TCHAR szCmd[0xFFFF];
TCHAR szDmy[0xFFFF];
int fDQ;
LPTSTR lpszCur;

/* 初期化 */
::lstrcpy(szCmd, ::GetCommandLine());
dwLen = (DWORD)::lstrlen(szCmd);
szCmd[dwLen++] = _T('\0');

/* 捜査 */
for (i = 0, dwPos = dwDiv = 0, fDQ = 0, lpszCur = szCmd; i < dwLen; i++, lpszCur++){
tcChr = *lpszCur;
if (tcChr == _T('\"')){
fDQ = !fDQ;
}else
if ((!fDQ) && (tcChr == _T(' '))){
tcChr = _T('\0');
}

szDmy[dwPos++] = tcChr;
if (tcChr == _T('\0')){
dwDiv++;
}
}
szDmy[dwPos++] = _T('\0');


655:653
07/04/10 23:39:39
後半
/* 整理 */
dwCnt = 0;
if (dwDiv > 0){
for (i = 0, dwPos = 0, lpszCur = szDmy; i < dwDiv; i++, lpszCur++){
dwLen = (DWORD)::lstrlen(lpszCur);
if (dwLen > 0){
::lstrcpy(&szCmd[dwPos++], lpszCur);
lpszCur += (dwLen);
dwPos += (dwLen -1);
szCmd[dwPos++] = _T('\0');
dwCnt++;
}
}
szCmd[dwPos++] = _T('\0');
}

/* 結果 */
if (lpcchBuffer){
if (*lpcchBuffer >= dwPos){
*lpcchBuffer = dwPos;
if (lpBuffer){
::CopyMemory(lpBuffer, szCmd, dwPos * sizeof(TCHAR));
}
}
}

return dwCnt;
}


656:653
07/04/10 23:42:59
DWORD OrderCommandLine(LPTSTR lpBuffer, LPDWORD lpcchBuffer)の
LPTSTR lpBufferはバッファ
LPDWORD lpcchBufferはlpBufferのサイズ(文字単位)の入った変数のポインタ
んでOrderCommandLineは分割した数を返す。

どっかおかしいとこない?

657:デフォルトの名無しさん
07/04/10 23:48:04
自作せずにCommandLineToArgvWを使ったほうが楽なのでは?

658:653
07/04/11 00:01:57
>>657
CommandLineToArgvW関数はしりませんですた... orz
調査してみますね。

659:デフォルトの名無しさん
07/04/11 00:07:01
main関数のargc, argvは駄目なの?
main関数から始まるけどコンソールプログラムでないというのは変わっているかもしれないけど。

660:デフォルトの名無しさん
07/04/11 00:13:42
boostにコマンドライン解析があった希ガス

661:デフォルトの名無しさん
07/04/11 00:25:19
>>659
WinMain関数のLPSTR lpszCmdLine問題があったので、
片手間で作成してみました。
そりゃ、_tmain関数みたいなのが、一番いいですが。

>>660
URLリンク(www.boost.org)ですよね?
ここも見てみます。


662:デフォルトの名無しさん
07/04/11 00:25:41
__argv,__argcとかいうのもあったような

663:デフォルトの名無しさん
07/04/11 00:43:11
Googleからも出てる。
URLリンク(code.google.com)

664:デフォルトの名無しさん
07/04/11 03:12:11
CommandLineToArgvW以外はスレ違いじゃね?
>>661
_tWinMain
VC++以外や、VC++でもバージョンによっては存在しないみたいだが
その場合はGetCommandLineW
つーかCommandLineToArgvWは_tmainが存在しなかったバージョンのVC++で
GetCommandLineWと組み合わせて使うために提供されていた(だからW版しかない)ので

665:653
07/04/11 08:17:09
>>664
情報ありがとうございます。
へー_tWinMain関数ってあるんですかー。

特に変な意識して、関数作る必要もなかったのかな?


一回、整理して考え直してみます。
皆様ありがとうございました

666:デフォルトの名無しさん
07/04/11 08:55:12
>>644
不可視でダイアログ開いて、GetDlgItemText()したら?


667:デフォルトの名無しさん
07/04/11 11:33:08
CSV(カンマテキスト)を分割するAPIを教えてください

668:デフォルトの名無しさん
07/04/11 11:59:02
ない

669:デフォルトの名無しさん
07/04/11 12:55:54
ウィンドウズの起動時間(timeGetTimeやGetTickCountで返される数値)を変更する方法ありますか?

DirectShow辺りが怪しいので
デバッグで24日間放置した状態にしたいのです


670:デフォルトの名無しさん
07/04/11 13:05:35
>>669
hookして、好きな値返すとか?

671:デフォルトの名無しさん
07/04/11 13:13:31
>>668
ADO等で出来なくもない気もするが

672:デフォルトの名無しさん
07/04/11 13:45:05
猫でもわかる・・の第10章タイマーで、コーディングして実行したところ、
一応動くのですが、文字列が再描画されず、字が重なったようになって
しまいます。この場合、うまく表示するにはどうしたらよいでしょうか?
よろしくお願いします。

673:デフォルトの名無しさん
07/04/11 13:56:55
大学院レベルの猫にしかわからないってことだね

674:672
07/04/11 13:57:59
↑で質問したものです。
InvalidateRect(hWnd, NULL, FALSE);
こいつを
InvalidateRect(hWnd, NULL, TRUE);にしたらなおった。
でも載ってるのは最初のほうですよね。
なんかほかに方法があるのかなぁ

675:デフォルトの名無しさん
07/04/11 14:01:28
つ SetBkMode

676:672
07/04/11 14:04:28
>>675
実装済みです

677:デフォルトの名無しさん
07/04/11 14:14:29
前と同じ幅の文字で上書きしてないとか

678:デフォルトの名無しさん
07/04/11 14:33:38
>>676
TRANSPARENT で描画、リクエストをInvalidateRect(...FALSE) にしてたら
672 のように多重の重ね書きになるわけだが?

まぁ、OPAQUEにしたところで、文字列の実描画長が短くなったら
なんらかの方法で背景色で消すコードを書くはめにはなるがね

679:デフォルトの名無しさん
07/04/11 14:34:58
fillrect

680:デフォルトの名無しさん
07/04/11 14:41:57
ExtTextoutを結構多用したなあ

681:デフォルトの名無しさん
07/04/11 16:34:21
質問です。

親のウインドウとは独立した子ウインドウで、親よりは必ず前面に。
ただし他のアプリのウインドウがより前面にある時は(親ともども)きちんとそのウインドウの背面に。

というウインドウをCreateWindowExで簡単に作ることはできないでしょうか。

・子ウインドウは、親ウインドウの中に存在するわけではない(つまりWS_CHILDではない?)
 お絵かきツールのパレットウインドウなんかがこんな感じ。
・WS_EX_TOPMOSTにすると、他のアプリのウィンドウよりも前にきてしまう


682:デフォルトの名無しさん
07/04/11 16:45:13
殆ど自分で答え言っているような気がす…
親をオーナーにして (WS_CHILD と排他な)WS_POPUP で作れば良いんじゃない?

683:デフォルトの名無しさん
07/04/11 16:46:37
>>681
WS_POPUPとWS_EX_TOOLWINDOWつけてみたらどう?

684:デフォルトの名無しさん
07/04/11 16:51:40
>>681
URLリンク(msdn.microsoft.com)
>A window can own, or be owned by, another window. An owned window always appears in front of its owner window,
>is hidden when its owner window is minimized, and is destroyed when its owner window is destroyed.

685:デフォルトの名無しさん
07/04/11 16:56:53
URLリンク(msdn.microsoft.com)
Owned Windowsのところをよく読め

686:デフォルトの名無しさん
07/04/11 17:00:46
日本語でおk

687:デフォルトの名無しさん
07/04/11 17:12:48
アドバイスありがとうございます。
とりあえずWS_CHILDとWS_POPUPは共存できないようです。

D-Pixedのツールウインドウが同じ実装になっていたのを思い出し、Spy++で覗いてみました。
>>683さんの言うとおりのオプションを使っていましたが、それが原因で望んだ挙動をしているわけではないようです。

とりあえず下記を、親と子両方に入れてやったところ上手く狙った挙動ができているようです。
なので問題ないといえばないのですが、より上手い方法があれば教えていただけると幸いです。

if (WA_INACTIVE != wParam)
{
 ::SetWindowLong(hChildWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW | WS_EX_TOPMOST);
 ::SetWindowPos(hChildWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
else
{
 ::SetWindowLong(hChildWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
 ::SetWindowPos(hChildWnd, hParentWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
 ::SetWindowPos(hParentWnd, hChildWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}


688:デフォルトの名無しさん
07/04/11 17:13:57
他アプリウィンドウ - オーナー - ポップアップ - (最前面) で
他アプリウィンドウをタスクバーのクリックでアクティブにすると、
オーナー - 他アプリウィンドウ - ポップアップ - (最前面)
ってなることがあるんだよなあ。
Alt+Tabだと発生しないけど、なんだかなあと思う。

689:デフォルトの名無しさん
07/04/11 17:25:44
>>687
共存できないとわざわざ書いたのはなぜ?
もしかして>>682を誤解してる?

690:デフォルトの名無しさん
07/04/11 17:29:41
>>687
>より上手い方法があれば教えていただけると幸いです。

そういうウィンドウはOwned Windowと言います。>>685のリンク先を読んでください。

691:デフォルトの名無しさん
07/04/11 17:29:47
…なぜに SetWindowLog & SetWindowPos なんだ?
CreateWindowEx でのスタイル指定で解決できるのに…

ターゲットの窓が他プロセスの持ち物なのか?

692:デフォルトの名無しさん
07/04/11 17:32:35
>>689-691
すいません、682さんを誤読した上に、685さんのレスとレスがすれ違いました。
WS_POPUPとは、親ウインドウを持つウインドウのことだったのですね。

正直、オーバーラップウインドウと、ポップアップウインドウの区別がわからず
今ググっていて682さんの文章に対する誤読に気づきました。
685さんのリンク先を実践してみます

693:デフォルトの名無しさん
07/04/11 17:50:25
解決できました。
WS_POPUPの解説である「ポップアップウインドウを作成する」の「ポップアップウインドウをはなんぞや?
という知識が無かったのが問題でした。

ポップアップウインドウそのものが、私の望んでいたもののようです。
WM_ACTIVEなどをまったく使わずWS_POPUPを指定しただけで解決できました。

ありがとうございました。

694:デフォルトの名無しさん
07/04/12 00:43:50
DOS窓で、CreateWindowてどうやるの?
メッセージループとか。

695:デフォルトの名無しさん
07/04/12 00:53:29
どうやってやるも何も普通に出来るだろ。
いったい何を言っているんだ?

696:デフォルトの名無しさん
07/04/12 01:40:30
>>694
日本語でおk

697:デフォルトの名無しさん
07/04/12 03:17:19
ソースコードを読んで勉強したいのですが、C言語 + Win32 API で書かれたオープンソースのアプリケーションでお薦めって何かありますか?
実践的なコードの書き方を勉強したいので、お手本になりそうなアプリがあったら教えてください。
また逆に、「このソフトの書き方は真似するな」的なのもあれば教えて頂けると有り難いです。
宜しくお願いします。


698:デフォルトの名無しさん
07/04/12 04:13:51
> お薦めって何かありますか
猫でもわかる

> このソフトの書き方は真似するな
猫でもわかる

699:デフォルトの名無しさん
07/04/12 04:16:14
>>698
禿道と言わざるを得ない

700:デフォルトの名無しさん
07/04/12 07:39:02
あまりにも禿同杉てワラタw

701:デフォルトの名無しさん
07/04/12 08:18:22
ヒントにはなるが真似は出来ない

702:デフォルトの名無しさん
07/04/12 09:19:39
左右分割ウインドウをMFCを使わずに作っているのですが、相談させてください。

まず、ウインドウ全体を親ウインドウとします。

子ウインドウとして
「左側用にWS_THICKFRAMEを使ったウインドウをちょっと大きめに作って配置」
「右側に余り部分の大きさ分のウインドウ」
を貼り付けて実現しています。
左側用のウインドウの大きさが変化するたびに、右側のウインドウの大きさも変更されるようにしています。

ただ、WS_THICKFRAMEは角の近くだと「マウスドラッグで縦横の大きさを変えられる」モードになってしまいます。
まず「横の大きさしか変えられないウインドウ」は作れないのでしょうか?

それをさせないために今は「上下に大きめに作る」ようにしているのですが(角付近を触れないように)、ウインドウはデスクトップウインドウのサイズより大きくは作れないようです(?)。
そのため親ウインドウをデスクトップ画面並に大きくされてしまうと困ってしまいます。
何か対策はありませんでしょうか?

左右ができれば、上下はその応用で作成可能だと思います。


703:デフォルトの名無しさん
07/04/12 09:30:11
>>702
左右の境界に少し隙間を開け、そこをドラッグすると左右に大きさが変わるようにする。
というようにMFCはなってたと思う。

704:デフォルトの名無しさん
07/04/12 09:47:03
>>703
なるほど。つまり自前でドラッグシステムを作っているわけですね。
WS_THICKFRAMEを使った方法も、この斜め問題さえ解決すれば実用に耐えるのですが…。

とはいうものの、WM_SIZEを捕まえて上下の大きさが変更されたら強制的に元に戻す処理は入れています。
ただそれは格好悪いもので、もし良い方法があればと思って相談しにきました。

705:デフォルトの名無しさん
07/04/12 10:44:16
WM_GETMINMAXINFO捕まえたらどうだろう
MFCしか使ってないんで良く分からないけど

706:デフォルトの名無しさん
07/04/12 11:34:55
>>705
できました!
まったく知らないWMでした。ありがとうございます。

これで
tagMINMAXINFO *p = (tagMINMAXINFO*)lParam;
p->ptMaxTrackSize.y += 128;
としてやることで、デスクトップサイズよりでかいウインドウを作ることに成功。
期待通り動作できるようになりました。

707:デフォルトの名無しさん
07/04/12 11:48:53
>>702,706
WM_NCHITTESTを捕まえてDefWindowProc()が
HTTOP,HTBOTTOM,HTTOPLEFT,HTTOPRIGHT,HTBOTTOMLEFT,HTBOTTOMRIGHTのときだけ
もみ消してしまう方がいいのでは?

708:デフォルトの名無しさん
07/04/12 11:53:52
スクリーンショットを撮るAPIってありますか

709:デフォルトの名無しさん
07/04/12 12:00:33
>>707
ウィンドウの四隅(スプリットバーの端っこ)が使えなくなるんでお薦めできない
それで無効になる領域って結構大きいし

710:デフォルトの名無しさん
07/04/12 12:02:23
>>708
GetDC

711:デフォルトの名無しさん
07/04/12 12:29:16
>>709
言われてみれば確かに…。16*16ほどか。
なら、座標計算して嘘の値を返すなんてのはどう?
例えば、DefWindowProc()がHTBOTTOMRIGHTの場合で
マウスが右の方にあるときはHTRIGHTを返し、下の方にあるときは0を返すとか。

712:デフォルトの名無しさん
07/04/12 12:35:13
>>710
その答えで>>708が報われる事は絶対に無いだろう

713:デフォルトの名無しさん
07/04/12 12:36:19
>>707
そこまでするぐらいなら普通に>>706でいいと思うんだが…
まあどっちみちWM_NCHITTESTは使うんだけど。
例えば左右に動くスプリットバーがあったとして、
その端っこにポインタを合わせたら斜め向いたカーソルが出るんじゃ
格好がつかないんで
HTTOPLEFTを受け取ったらHTLEFTを返す、みたいなことをする

714:デフォルトの名無しさん
07/04/12 12:37:31
なんかアンカー間違えたり誤読したりで嫌になってきた

715:デフォルトの名無しさん
07/04/12 12:40:03
適当にぐぐったらすぐサンプルコードが見つかったんで、ついで。
>>708
URLリンク(www13.plala.or.jp)

716:デフォルトの名無しさん
07/04/12 13:10:09
>>713
斜め向いたカーソルがでないように、上下64ドットずつ大きいウインドウを作りました

717:デフォルトの名無しさん
07/04/12 17:35:48
普通は自前で全部やるものだよ。作り直したほうがいい。

718:デフォルトの名無しさん
07/04/12 18:12:40
>>717
______   _      _| ̄|_  _         _
|____   |   |  | 口口  |_  _|  \\       | |  __     __ __
     / /   |  |        | |  _   ̄ ___  | |  |__|  _| |_| |_
    / /    |  |   _    | |  _| |_  |___| | |        |_  _  _\
    | |      |  \_/ /   / / /。 _|        | |  ___    .| |.|__|/ /
    \\     \   /     ̄  \/           | | |___|    |__|   ̄
       ̄       ̄ ̄                      ̄

719:デフォルトの名無しさん
07/04/12 18:30:06
>>702
Splitterなんて死ぬほどサンプルあるよ
URLリンク(www.codeguru.com)

君の場合は、手を抜こうとして逆に面倒なことになってる気がする。
素直にフルスクラッチした方が楽だと思うよ。

720:デフォルトの名無しさん
07/04/12 21:06:03
WTLのスプリッタのソースが見やすいと思われ

721:デフォルトの名無しさん
07/04/12 21:58:22
すみません
いまコンソールのC言語のプログラムを
WinMainで始まるプログラムでも使えるようにしようとしている
のですがエラーがでてしまいコンパイルできません
エラーの内容はunsigned char*をchar*に変換できません等のものなのですが
なんとかソースを書き換えずにコンパイルできるようにできないものでしょうか?

722:デフォルトの名無しさん
07/04/12 22:04:32
え、キャストしちゃいけないの?

723:デフォルトの名無しさん
07/04/12 22:10:59
キャストすると1000ヶ所以上あってどうにもならない感じです

724:デフォルトの名無しさん
07/04/12 22:12:58
BCCにするんだ

725:デフォルトの名無しさん
07/04/12 22:14:49
置換使えないのかい

726:デフォルトの名無しさん
07/04/12 22:18:07
1000箇所ぐらいなら1時間で何とかなると思うが・・・
というかSuletiGay

727:デフォルトの名無しさん
07/04/12 22:20:01
置換も使えなさそうです
文字列の型にunsigned char*を使っているのが問題のようで
置換をしようにもどうにも絞れません

728:デフォルトの名無しさん
07/04/12 22:23:39
#define unsigned

729:デフォルトの名無しさん
07/04/12 22:29:26
charをデフォルトでunsignedとみなすコンパイルオプションがなかったっけ?

730:デフォルトの名無しさん
07/04/12 22:29:47
VCには存在するな

731:デフォルトの名無しさん
07/04/12 23:05:42
unsigned char*からchar*へ変換できないなんて、
単にWindowsプログラムのほうではC++としてコンパイルしているだけだと思う。
Cなら(警告は出るだろうが)エラーにならずにコンパイルできるはず。

732:デフォルトの名無しさん
07/04/12 23:21:58
コンパイルオプション/Jでは配列のunsignedchar*がchar*に変換できないらしく
だめでした情報ありがとうございます

733:デフォルトの名無しさん
07/04/12 23:26:48
とりあえず F4 でエラー行に飛べることを知ってるだけで
効率はかなり変わると思うよ
F4 → カーソル移動 → Ctrl+V → (以下ループ)

734:デフォルトの名無しさん
07/04/12 23:27:36
ごめん、VC 限定ね… VC スレと勘違いした

735:デフォルトの名無しさん
07/04/12 23:52:06
いえ、ありがとうございます
ですが元のソースはいじるわけにはいかないんですよ
ちょっと勝手に書き換えるとまずい事情がありまして

736:デフォルトの名無しさん
07/04/12 23:59:12
WinMainから始まろうと、mainから始まろうと、
同じCのソースコードであることに変わりはない。

片方でコンパイルできたものが、もう片方でコンパイルできないなんて、
(argc/argcやmainそのものに依存している場合などを除いて)有り得ない。

>>731は試した?

737:デフォルトの名無しさん
07/04/13 00:00:18
>>735
そういうことってよくあるよね。
あ~邪魔臭いコードでもいじれない。

738:デフォルトの名無しさん
07/04/13 00:22:56
>>735
Cでは警告は出ないようだ。
こんな感じでC++とCのコードは混ぜることが出来る。

extern "C" {
#include "古いコード.h"
}

cl 新しいコード.cpp 古いコード.c


739:デフォルトの名無しさん
07/04/13 01:03:16
とりあえず古いソースのヘッダをincludeしている箇所を
extern "C"{}で囲ってみましたが効果ないっぽいです
情報ありがとうございます

740:デフォルトの名無しさん
07/04/13 01:18:34
>>739
意味わかってないだろ

741:デフォルトの名無しさん
07/04/13 01:26:44
IDEから使うと /TP がデフォになってるな。
これをはずせば拡張子に応じたコンパイルをしてくれるが、
プリコンパイルヘッダーやら他のところで引っ掛かりが出てるよ。
混ぜるのはこいつのレベルじゃ無理かもしれんね。

742:デフォルトの名無しさん
07/04/13 09:35:23
文字列に付けるszってなんですか?

743:デフォルトの名無しさん
07/04/13 09:39:19
Win32APIでは構造体のサイズを取得してそのサイズを構造体にセットするというのをよく使いますが、
何故このようなやり方をするのでしょうか?

744:デフォルトの名無しさん
07/04/13 09:42:10
>>742
ハンガリアン記法

745:デフォルトの名無しさん
07/04/13 09:43:57
>>743
バージョンが上がって仕様が変わって構造体の内容が変わっても
互換性を維持するため。

746:デフォルトの名無しさん
07/04/13 10:06:09
まじ?

747:デフォルトの名無しさん
07/04/13 10:09:16
>>742
zero(\0)終端string(文字列)の略

748:デフォルトの名無しさん
07/04/13 10:36:38
nsはなんですか?

749:デフォルトの名無しさん
07/04/13 10:46:51
>>748
質問まとめてしろよ

750:デフォルトの名無しさん
07/04/13 12:01:00
>>746
>745のことならマジ。

751:デフォルトの名無しさん
07/04/13 13:47:56
ちょっと思うんだけど、
ファイルパス長ってMAX_PATHバイト?MAX_PATH文字数?
MAX_PATHバイトだったら、マルチバイト文字で半分になるんだけどいいの?
それとも、
#define MAX_PATH_NAME (MAX_PATH * (2 / sizeof(TCHAR)))
な事すんの?

752:デフォルトの名無しさん
07/04/13 13:50:14
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するからMAX_PATH自体あまり意味無いような・・・

753:751
07/04/13 13:50:49
補足
TCHAR szFile[MAX_PATH_NAME + 1];

とつかうとして

754:デフォルトの名無しさん
07/04/13 13:57:06
まあDOS/Windows 3.1時代の遺物なんで

755:751
07/04/13 14:01:31
>>752
CreateFileの説明の通り
In the ANSI version of this function,
the name is limited to MAX_PATH characters.To extend this limit to 32,767 wide characters,
call the Unicode version of the function and prepend "\\?\" to the path.
For more information, see Naming a File.

ワイド文字で32767文字って事は、65534バイト宣言しとけばいいの?
ちょいもったいない気が・・・

756:デフォルトの名無しさん
07/04/13 14:19:59
必要に応じて動的に確保すればいいんじゃないの?
どうしても固定長にしたいわけ?

757:デフォルトの名無しさん
07/04/13 14:24:08
OPENFILENAME の戻り用の器は MAX_APTH 使った固定長だな。

758:751
07/04/13 14:36:11
>>756
固定長にしたい理由というわけじゃありませんが、
明確な理由があれば、それに準じたいと思っています。

もちろん、実用的な側面でも判断しますが

759:デフォルトの名無しさん
07/04/13 15:23:35
ぐだぐだ言ってないで実用的な面でどうなるか
試してみろよ。
FAT32,NTFS,共有ドライブで長い名前のファイル名作るくらいできないの?


760:デフォルトの名無しさん
07/04/13 17:02:48
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから
文字数でもバイト長でもMAX_PATH以上のファイルパスって普通に存在するから

761:デフォルトの名無しさん
07/04/13 17:07:47
>>760
うるさいばか

762:デフォルトの名無しさん
07/04/13 17:12:13
>>758
9x系OSでANSI版のAPIつかってみなはれ

ちなみにMSでは、MAX_PATHは文字数としてあつかっとるよ
稀にMS社内でも開発者が混乱してしもて、
大穴あけてしもうたこともあるけどね

763:デフォルトの名無しさん
07/04/13 17:13:42
まったく1文字1Byteの連中はこれだから・・

764:デフォルトの名無しさん
07/04/13 17:25:11
>>763
初心者にこのスレは不向きですよppp

765:デフォルトの名無しさん
07/04/13 17:26:38
>>751
これ以上はスレ違い
APIではなくコーディングの話なら
Cスレに行け

766:デフォルトの名無しさん
07/04/13 17:35:44
>>764
欧米の方ですか?

767:デフォルトの名無しさん
07/04/13 17:47:03
いいえ東亜です。

768:デフォルトの名無しさん
07/04/13 17:52:25
>>763
いや、ワイドキャラクタでも1文字2バイトじゃ済まないはずなんだが。
サロゲートペアとかあると4バイトになる。
あれ、Win32APIってUCS-2のままだったっけ?
まぁサロゲートペア対応しても、そもそも文字の定義ってなに?ってなるし。


769:デフォルトの名無しさん
07/04/13 18:14:56
ファイルの更新日時を変更するAPIを教えてください

770:デフォルトの名無しさん
07/04/13 18:23:11
GetFileTime

771:デフォルトの名無しさん
07/04/13 18:26:48
Sじゃねーのか

772:デフォルトの名無しさん
07/04/13 18:28:36
お前さん頭いいな。

773:デフォルトの名無しさん
07/04/13 18:36:47
Mですから

774:デフォルトの名無しさん
07/04/13 18:42:44
>>768
ビル・G

数種類の奇妙な文字で文章を書く、親愛なる日本人の皆さん。
私はアルファベット26文字で美しい詩的な文章を綴り、人々を感嘆させるビル・Gである。
ユニコードとは何か。簡単に言えば、あらゆるプラットフォームで様々な言語を共通に扱えるようにするための統一的なコード体系のことだ。
もっと簡単に言おう。アルファベット以外の野蛮な絵文字を使ってコミュニケートする第三世界の人間に対する、心からの配慮だ。
今までも手を焼いてきた。2バイトコードの各国語対応も、少しは楽になるのだけどね。
君たちの国でも、ユニコードの問題が盛んに議論されているようだね。
日本や中国や台湾で使っている漢字コードやフォント違うって? 
それは君たちが今までに勝手な文字を作りすぎてきたツケに過ぎないよ。
また、『固有の文化』という言葉で語られる微妙な差異に関する議論は、
私にはちょうど「靴下は右足から履かなければならない」
「いや、左足から履くのが伝統だ」と言い争いをしているようにしか聞こえない。そんなことはどうでもいいじゃないか!

775:デフォルトの名無しさん
07/04/13 18:54:31
拘りすぎてバカを見るのが東洋人
大雑把過ぎてバカを見るのが欧米人

776:デフォルトの名無しさん
07/04/13 19:25:50
CJK以外にもBidiとか言語タグとか対応するのが
遅かったねぇ。
BMPを16bitじゃなくて32bitにしてれば、もう少し問題先送りできたのに。
あとはユニコードまでも取り込んだGB18030とかどうするんだろうっていう。。。


777:デフォルトの名無しさん
07/04/13 19:31:01
XP以降のメモ帳で右から左に読むにして
Hello, World打つだけでも軽く死ねるなw


778:デフォルトの名無しさん
07/04/13 20:22:24
神の罰です

779:デフォルトの名無しさん
07/04/13 21:24:16
>>748
ナノ秒
冗談じゃなくて素直に考えて

780:デフォルトの名無しさん
07/04/13 21:26:31
>>768
ファイル名の制限という観点ではコードユニットの数で数えるから関係ない

781:デフォルトの名無しさん
07/04/13 21:31:48
ウニコードはうまそうだ

782:デフォルトの名無しさん
07/04/13 21:42:17
>>780
NTFSはどのエンコーディングを使ってんの?

783:デフォルトの名無しさん
07/04/13 21:54:10
>>780
ドキュメント上の問題のことです。
n文字という表現では最大バイト数は判りにくい。


784:デフォルトの名無しさん
07/04/13 21:54:42
>>782
おそらくUTF-16

785:デフォルトの名無しさん
07/04/13 21:55:22
もちろんUTF-16LE

786:デフォルトの名無しさん
07/04/13 23:01:50
結局、MAX_PATHの単位はなんなんだ?
明らかにバイト数じゃない
文字数も数えてみたがなんかちがう
会社によって1バイトのズレも許さないからこのあいまいな仕様がかなりムカつく
ちなみにファイルダイアログの最長はXPSP1までは0xFFFFだったがXPSP2からはどこまではいるのかよくわからん
ドラッグアンドドロップの限界は一体どこなんだ?

787:デフォルトの名無しさん
07/04/13 23:18:44
WinNTのNTFSドライバのパス名制限が (2^15-1) UTF-16符号単位だったと思うが

788:751
07/04/13 23:29:46
>>759
もちろん、\\.\~の長いファイル名前をCreateFileで作成し、
動作を確認しています。

しかしながら、エクスプローラも捕らえられないファイル名は実用的か?
それともMAX_PATH以上32767文字以下で、もっともらしい定数があり、
自分が知らないだけかわからんとです。



789:デフォルトの名無しさん
07/04/13 23:44:40
GUIアプリでコンソールを表示するにはどうすればいいのでしょうか?

やりたいことは、
・起動した時にはコンソールアプリのように振る舞う。
・ある入力があった時点でウィンドウを表示し、GUIアプリとして振舞う

main()で起動するとコンソールは出ますが、WinMain()の第一引数で取得できる
HINSTANCEが取得できないので、GUIアプリとして振舞えない。
WinMain()で起動するとGUIは出せるが、コンソールへ出力を行えない。

WinMain()でGUIアプリとして起動しておいて、必要に応じて(何らかの関数呼び出しによって)
コンソールを表示させるのが正しいやり方なのかと思っていますが、調べてもやり方が見つかりません。
どなたかお助けを・・・

790:デフォルトの名無しさん
07/04/13 23:49:13
>>789
HINSTANCE == GetModule(0) だったハズ。

791:デフォルトの名無しさん
07/04/13 23:51:05
コンソール部分は別にしてCreateProcessは?

792:791
07/04/13 23:51:06
あ、すまん間違えた。
×:GetModule
○:GetModuleHandle

793:792
07/04/13 23:52:04
>>792==>>790!=>>791
もう寝る!

794:デフォルトの名無しさん
07/04/13 23:54:36
>>789
CreateProcess, GetStdHandle, SetStdHandle, CreatePipeでリダイレクト。


795:デフォルトの名無しさん
07/04/13 23:54:38
AllocConsole stdout

796:デフォルトの名無しさん
07/04/13 23:56:39
コンソール プロセスを生成して標準ハンドルをリダイレクトする方法
URLリンク(support.microsoft.com)

797:デフォルトの名無しさん
07/04/14 00:00:43
>>789
WinMainから始まるプログラムにAllocConsoleを使う方法も出ているが、
個人的には、手間要らずにC stdioやC++ iostreamを使えるので、
mainから始まるプログラムにした方がいいと思う。
EXEのインスタンスハンドルは791のとおりGetModuleHandleで。

798:デフォルトの名無しさん
07/04/14 00:31:27
>>777
前からおもってたのだが、右から左に読む文化圏に対応してるなら、
上から下に読む文化圏にも対応してていいんじゃないかと思ったりするのだがまぁいいや。

そういえば、昔、Macのことえりだったか縦書きIME変換やってくれてた記憶があったな~

799:デフォルトの名無しさん
07/04/14 00:44:47
MS-IMEも、Wordなんかで縦書きにすればそれにあわせてくれる。

800:デフォルトの名無しさん
07/04/14 06:13:01
質問です。GetProcAddressを使ってDLL内の関数を呼び出したいのですが、
上手くいきません。プログラムを実行すると、そのまま強制終了してしまいます。

FARPROC SetHook,ResetHook;
SetHook = GetProcAddress(LoadLibrary(TEXT("hook.dll")),TEXT("_SetHook"));
ResetHook = GetProcAddress(LoadLibrary(TEXT("hook.dll")),TEXT("_ResetHook"));

として関数のアドレスを取得しています。各関数のアドレスは

SetHook : 011412A0
ResetHook : 011412D4

でした。tdump.exeでは

Exports from hook.dll
3 exported name(s), 3 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
000012D4 1 0000 _ResetHook
000012A0 2 0001 _SetHook
00009158 3 0002 ___CPPdebugHook

という結果が得られました。

GetProcAddressの使い方が間違っているのでしょうか?
コンパイラの設定に問題があるのでしょうか?
どのあたりに原因があるのか指摘して下さい。お願いします。<(_ _)>
コンパイラはBCCです。BCC Developerでビルドしています。

801:デフォルトの名無しさん
07/04/14 06:20:21
GetProcAddress の第2引数は LPCSTR だが。

802:800
07/04/14 06:38:04
>>801
SetHook = GetProcAddress(LoadLibrary(TEXT("hook.dll")),"_SetHook");
ResetHook = GetProcAddress(LoadLibrary(TEXT("hook.dll")),"_ResetHook");
としたのですが、上手くいきません。関数名の指定が間違っているのでしょうか?

803:デフォルトの名無しさん
07/04/14 06:46:26
>>800
まずは「強制終了」する場所を探らないと。
その情報だけじゃ、GetProcAddress() 絡みの問題かどうかなんてわ
からん。


804:800
07/04/14 06:57:58
>>803
関数の呼び出し時に強制終了します。
インポートライブラリを通しての呼び出しには成功したのですが。

805:デフォルトの名無しさん
07/04/14 07:02:09
それはGetProcの問題じゃないだろうな
FARPROCの宣言はどうなってる?

806:デフォルトの名無しさん
07/04/14 07:07:26
>>804
インポートライブラリを通しての呼び出しには成功ってんだったら
GetProcAddressで失敗なんじゃなくて
それで取った情報を使う時の失敗だろ
どうやって関数呼び出してんのか見せてみぃや

807:デフォルトの名無しさん
07/04/14 07:12:39
>>805
VCだと「typedef int (*FARPROC)(void)」だが、BCCはどうなんだろう・・・
ていうかそのまんま使ったら普通コンパイルとおらないかも?

808:デフォルトの名無しさん
07/04/14 07:16:41
呼び出し規約が間違っている。それでスタック壊れているんだろ。

809:デフォルトの名無しさん
07/04/14 07:18:09
普通目的の関数に合致した関数ポインタの型を定義してそれで使うもんじゃね?
ただのFARPROCにぶち込んでるヤツ初めて見た

810:800
07/04/14 07:39:35
>>805-809 レスありがとうございます。

#define EXPORT __declspec (dllexport)
typedef EXPORT HHOOK (*SETHOOK)(const HWND hCaller);
typedef EXPORT void (*RESETHOOK)(void);
SETHOOK SetHook;
RESETHOOK ResetHook;

と関数ポインタの型を定義してから

SetHook(hWnd);
ResetHook();

という感じで呼び出してみたのですが、やはり上手くいきません。

811:デフォルトの名無しさん
07/04/14 08:02:06
もう一度レスを見直すんだ。そこに答えがある。

812:デフォルトの名無しさん
07/04/14 08:17:26
VC2005でstrlen等を使うと

813:800
07/04/14 08:17:48
>>811
呼び出し規約の整合性に問題があるのでしょうか?
もう少し詳しく教えて頂けないでしょうか?

814:デフォルトの名無しさん
07/04/14 08:34:30
提供する側では__declspec (dllexport)が必要だろうが
使う側では要らないだろ。

提供する側でも使う側でも__stdcallとかを指定したほうが安全。
デフォルトに任せれば同じになっている可能性が高いけど
不一致になる危険性がある。
GetProcAddressじゃなくて暗黙のリンクでもいえることだけどね。

GetProcAddressの戻り値が0ってことはないよね。

815:デフォルトの名無しさん
07/04/14 08:56:00
>>810
DLL側のソースでその2つの関数がどう定義されているかもチェック


816:デフォルトの名無しさん
07/04/14 08:57:17
うまくいかないのと直接の関連はないが、
一々LeadLibraryするな。
1回ロードしたら、そのハンドルを使いまわせ。

817:デフォルトの名無しさん
07/04/14 08:58:36
LeadLibrary

818:デフォルトの名無しさん
07/04/14 09:01:36
一度だけLoadLibraryして、そのハンドルを保持して使うってのもそうだけど
GetProcAddressに直接ぶち込むのもどうかと
誤動作の原因になる可能性は充分にあるかと

819:デフォルトの名無しさん
07/04/14 09:06:34
誤動作するとは思えないが、直接GetProcAddressに渡していたら、
FreeLibraryするのに不便だろう。
GetModuleHandleで後から解放用にハンドルを得るなんて無茶も甚だしい。

820:デフォルトの名無しさん
07/04/14 09:08:22
誤動作するとは思えないって思うのが危ないな
常に誤動作するかも知れないと思ってコーディングすべし


821:デフォルトの名無しさん
07/04/14 09:09:01
>>787
UNICODE_STRINGの構造上の問題だな
同様の理由でNT系はコマンドラインの長さにも32767文字(UTF-16符号単位)制限がある
驚くべきことにWin9xだとコマンドライン長が1MB超えても大丈夫。

822:800
07/04/14 09:09:21
>>814-819 レスありがとうございます。
DLLの関数を

#define EXPORT __declspec (dllexport)
EXPORT HHOOK WINAPI SetHook(const HWND hCaller);
EXPORT void WINAPI ResetHook(void);

とし、関数を呼び出すプログラムで

typedef HHOOK WINAPI (*SETHOOK)(const HWND hCaller);
typedef void WINAPI (*RESETHOOK)(void);
SETHOOK SetHook;
RESETHOOK ResetHook;

HMODULE hook_lib;
hook_lib = LoadLibrary("hook.dll");
SetHook = GetProcAddress(hook_lib,"SetHook");
ResetHook = GetProcAddress(hook_lib,"ResetHook");

として関数を呼び出したのですが、やはり駄目です。GetProcAddressの戻り値を
再度確認したのですが、0ではありませんでした。


823:デフォルトの名無しさん
07/04/14 09:10:20
32767文字を超えるコマンドライン自体普通無いだろ・・・

824:デフォルトの名無しさん
07/04/14 09:12:32
typedefのWINAPI要らなくね?

825:デフォルトの名無しさん
07/04/14 09:18:50
>>822
あんまり関係ないけどGetProcAddressの戻り値ってキャストしなくてもコンパイル通るのか?

826:デフォルトの名無しさん
07/04/14 09:58:58
関数ポインタの宣言なんだが・・・

typedef HHOOK (WINAPI *SETHOOK)(const HWND);
typedef void (WINAPI *RESETHOOK)(void);

じゃねーの?WINAPIの位置が違うとか。

>>825
警告が出るだけだったような。

827:デフォルトの名無しさん
07/04/14 10:03:42
呼び出し規約の記述位置は括弧の中だね。
戻り値に付属なわけじゃなくて、
関数に付属する情報だからなんだろうけど、
最初は戸惑うよね。

828:デフォルトの名無しさん
07/04/14 10:07:09
Borlandの昔のコンパイラだと微妙に仕様が違ったり
標準キーワードじゃないから仕方ないけど

829:デフォルトの名無しさん
07/04/14 10:14:48
なんでだろうね?
間違って古いDLLが残っているとか。

830:デフォルトの名無しさん
07/04/14 10:18:02
DLL側と呼び出し側のソースをまとめてうpってもらった方が話が早くていいかもしらんな

831:デフォルトの名無しさん
07/04/14 10:20:56
VCの場合、
#define EXPORT __declspec(dllexport)

EXPORT HHOOK WINAPI __stdcall SetHook(const HWND hCaller);
EXPORT void WINAPI __stdcall ResetHook(void);

こうじゃないかな。__stdcallはなくても動きそうな気がするけれど

832:デフォルトの名無しさん
07/04/14 10:27:28
>>831
WINAPIは
#define WINAPI __stdcall
とかされてるだけだから、どっちかだけで十分

833:800
07/04/14 10:33:36
>>824-832 レスありがとうございます。

typedef HHOOK (WINAPI *SETHOOK)(const HWND hCaller);
typedef void (WINAPI *RESETHOOK)(void);
SETHOOK SetHook;
RESETHOOK ResetHook;

HMODULE hook_lib;
hook_lib = LoadLibrary("hook.dll");
SetHook = (SETHOOK)GetProcAddress(hook_lib,"SetHook");
ResetHook = (RESETHOOK)GetProcAddress(hook_lib,"ResetHook");

としたのですが駄目でした。VCのExpress Editionで上手くいくかどうか試してみます。

834:デフォルトの名無しさん
07/04/14 10:38:30
>typedef HHOOK (WINAPI *SETHOOK)(const HWND hCaller);
今思った
引数は型だけで名前はイラネ

835:デフォルトの名無しさん
07/04/14 10:40:22
>>800
Borlandデバッグ環境は知らんが、DLL側のSetHook()の入り口にブレークポイント仕掛けるなり、MessageBox()
出すなりして、そこまで来ているか(強制終了がどの段階で起きているか)確認しろ。

関数名から何がやりたいか想像はつくが、もう少し経験をつんでからやることを強く勧める。


836:デフォルトの名無しさん
07/04/14 10:42:32
つーか無理にLoadLibraryでやらんでもいいことだけどな

837:デフォルトの名無しさん
07/04/14 10:47:16
そりゃまあごもっともです

838:デフォルトの名無しさん
07/04/14 10:48:32
>>800
>>インポートライブラリを通しての呼び出しには成功したのですが。
が本当なら、そのヘッダーファイルでの関数プロトタイプ宣言(は正しいはずだからこれ)にあわせろ。

おれもお前には、Hookは10年早いと思う。


839:800
07/04/14 12:15:58
>>834-838 レスありがとうございます。
マウスフックを使ったプログラムを作成しています。システムフックにより
他のウィンドウのタイトルを変更することには成功しました。そのため、
フックの処理自体には問題が無いと考えているのですが。

VCで実行してみたのですが、SetHook内で処理が中断しました。
インポートライブラリを使用した場合、何も問題は起きなかったのですが。(?_?)

840:デフォルトの名無しさん
07/04/14 13:02:13
SetWindowTextでタイトルが変わらないとか騒いでた奴か。
やっぱりおまえには早いと思うぞ

841:デフォルトの名無しさん
07/04/14 15:40:25
DLL や EXE に含まれているリソースの番号だけって取得できますか?
たとえばこの DLL の STRINGTABLE には、1000番 1001番の STRING が含まれています、という感じの API です。

842:デフォルトの名無しさん
07/04/14 15:45:04
FindResoource?

843:デフォルトの名無しさん
07/04/14 15:45:31
EnumResourceNames()

844:デフォルトの名無しさん
07/04/14 16:57:55
「普通ないだろ」が生む○○問題

845:デフォルトの名無しさん
07/04/14 18:00:38
>>825
Cだとコンパイルできる
C++だとコンパイルできない

846:デフォルトの名無しさん
07/04/14 18:26:15
なんで最近そんなことになってんだろうね
C言語でコンパイルできたソースが普通にC++で通らん

847:デフォルトの名無しさん
07/04/14 18:37:39
[アニメ DVD] ヤミと帽子と本の旅人 第04話 「マリエル」 (640x480 DivX511).avi


848:デフォルトの名無しさん
07/04/14 18:40:03
>>846
C++は、例えCとの互換性を失ってでも危険な香りがする暗黙の型変換を禁止した。
これだけは譲れないというやつ。

849:デフォルトの名無しさん
07/04/14 18:42:44
思いややりが無い朝鮮人的な思考だ

850:デフォルトの名無しさん
07/04/14 18:48:31
つーか、すっぱりと別言語にしちゃえば良かったのに
中途半端に互換性を持ってるからすごいカオスに

851:デフォルトの名無しさん
07/04/14 18:52:09
unsigned char*とchar*の代入なんてエラーにするほど危険かなぁ
なんか言語潔癖症的変な奴いるじゃないかなぁ
おかげで意味のないキャストをプチプチ入れてく無駄作業
こんなとこ明示的にキャストしたところでどうだというのか・・・

852:デフォルトの名無しさん
07/04/14 19:01:27
C++って型キャストが必須なんだっけか
俺Cメインだからうろ覚えだぜ

853:デフォルトの名無しさん
07/04/14 19:12:04
>>851
reinterpret_castが必要な場面ってそんなにある?

854:デフォルトの名無しさん
07/04/14 20:13:26
やっぱCがいいな。

855:デフォルトの名無しさん
07/04/14 20:16:32
C++で生のWin32 APIを使うとreinterpret_castだらけ。
Win32 APIは所詮Cを念頭において作ったという感じ。

>>849-851
それはC++作ったBjarneに言ってやれ。
静的型付けで強い型安全性でプログラマを守るというのがC++。

856:デフォルトの名無しさん
07/04/14 20:48:33
>>850
今までに何千人のプログラマが同じことを思っただろうな…
すべてが今更の話だが…

857:デフォルトの名無しさん
07/04/14 21:03:28
>>850
ゲイツ・ビルに言ってやってくれ

858:デフォルトの名無しさん
07/04/14 21:05:41
>>857
ビル・ゲイツの出した解がC#では?
いやビルが実際作ったわけではないけどさ。

859:デフォルトの名無しさん
07/04/14 21:13:34
C#もヤバい方向にいってると思うけどな
varってJavaScriptみたい

860:デフォルトの名無しさん
07/04/14 21:15:39
ヴァー

861:デフォルトの名無しさん
07/04/14 21:15:57
そうか?
型推論や関数型プログラミング的な機能を取り入れるのは最近の流行だよ。

862:デフォルトの名無しさん
07/04/14 21:29:34
所詮学者の独りよがりだよな
明らかになにも作ったことがないグズが言語仕様を決めてる気がする

863:デフォルトの名無しさん
07/04/14 21:50:53
おまえに32ビットの羅列ほいと渡して何型の変数か分かるのか?

864:デフォルトの名無しさん
07/04/14 21:55:46
>>862
言語の一つでも作ってみろよグズ

865:デフォルトの名無しさん
07/04/14 21:56:26
型推論はソースの冗長性を削る意味で有用だろうが。

866:デフォルトの名無しさん
07/04/14 21:56:41
>>862みたいにブツクサ独りよがりで文句を言うだけで、
かといって別に妙案も何にも持っていない奴を色んなところでよく見かける。

867:デフォルトの名無しさん
07/04/14 21:58:49
つーか、議論したけりゃ他所でやれ。

868:デフォルトの名無しさん
07/04/14 22:01:50
varをVariant型とかObject型と勘違いして拒否反応示している奴が結構いるみたいだな。
あとC++のテンプレート関数が型推論やってくれてるの知らない奴も多杉。

869:デフォルトの名無しさん
07/04/14 22:30:25
>>851
signed char が-128~127の整数の集合
unsigned char が0~255の整数の集合

例えば前者の変数を作成して
「リンゴをA店で100個、B店で155個買いました。
全部で何個でしょう」
という問題を解いて、答えが-1個だったらおかしいでしょう。

あまり問題だと思わないのは、先に16進ありき、だからじゃないかな。

870:デフォルトの名無しさん
07/04/14 22:39:53
もう止めようぜ
お前らこそ冗長にもほどがある

871:デフォルトの名無しさん
07/04/14 22:40:11
Dのautoキーワードの場合で書くと、
HogeClass obj = new HogeClass();

auto obj = new HogeClass();
みたいに書ける
ジェネリックプログラミングとかで
型がよく分からない時なんか更に便利

多分C#も同じ感じかと

872:デフォルトの名無しさん
07/04/14 22:42:06
>>870
リロードしてなかった
すまん

873:デフォルトの名無しさん
07/04/14 22:48:00
ザ・スレチガイ

874:デフォルトの名無しさん
07/04/14 22:53:41
(´ω`)

875:デフォルトの名無しさん
07/04/14 23:13:38
SuspendThread(this);

876:デフォルトの名無しさん
07/04/14 23:20:36
解決方法がわからないので教えてください。
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _memmove はすでに LIBCMTD.lib(memmove.obj) で定義されています
というエラーが15個出ます(まったく同じlib同士なので制限の関係で割愛します)
どちらかをunloadすればいいかとおもってプロジェクトの設定からやってみたんですが、どちらを行った場合でも、Libファイルがないためのエラーが出ます。
どうかおねがいします。

877:デフォルトの名無しさん
07/04/14 23:42:19
>>876 おちつけ。大体意味は分かるが。

878:デフォルトの名無しさん
07/04/15 00:03:44
どちらかをunload→どちらか一方とリンクする という意味じゃないのか?
プロジェクトの中に、誰かが作ったライブラリ(スタティックリンクしちゃったやつ)が混じっているんじゃないか?

1.プロジェクトの設定-一般-MFCのスタティックライブラリを使用
2.プロジェクトの設定-C/C++-[カテゴリ]コード生成-[使用するランタイムライブラリ]マルチスレッド (デバッグ)
に設定したらビルドできるか?(EXEでなくてDLLを作る場合は マルチスレッド (DLL、デバッグ))

あと、↑の例はVS6だが、環境も知らせておくように。


879:デフォルトの名無しさん
07/04/15 00:29:00
GDI+のファイルの書き出しについて保存です。
読み込み、書き出しそのもの情報はあるのですが、Graphics→Imageにする方法がわかりません。
Imageにファイルを読み込んで、別の形式で保存するというのはあるのですが。
猫でもわかる~を見ても読み込みまでしかかかれていないもので・・・
Graphics graphics(hdc);
//描画処理
このGraphicsをImageに変換するにはどうしたらいいのでしょうか?

880:デフォルトの名無しさん
07/04/15 00:37:17
>>878
ありがとうございます。できました

881:デフォルトの名無しさん
07/04/15 00:48:12
>>879
GDI+の扱いは分からんのだけども
GraphicsからBMPオブジェクト作ってImage.FromBitmapじゃ駄目?

882:881
07/04/15 00:51:32
不安になってMSDN見てみたらそんなメンバ無かったw
忘れてくれ

883:デフォルトの名無しさん
07/04/15 01:04:10
>>881
わざわざ調べていただいてありがとうございます。こちらでも確認したのですが、
Graphicの方にしかありませんでした。

884:デフォルトの名無しさん
07/04/15 01:06:28
間違ってました。Graphicsの方にもなかったです(汗 あるのはGraphics::FromImageですね。

885:デフォルトの名無しさん
07/04/15 01:08:59
それ何語?

886:デフォルトの名無しさん
07/04/15 01:10:16
エスペラント語でないことだけは確かだ

887:デフォルトの名無しさん
07/04/15 01:24:28
謎語を適当に喋ってみるテスト

Bitmapを作ってそこからGraphics:FromImage(bmp)で作ったGraphicsに
hdcをソースにして描画すればいいんじゃね

このスレ的にはhdcからBitBltするのかな?

888:デフォルトの名無しさん
07/04/15 01:32:04
>>887
ありがとうございます。その方法でいけました。
BitmapがImageと同じように使えるんですね。

889:デフォルトの名無しさん
07/04/15 02:40:09
ハンドル(CreateFileが返す値)から、元のファイルのフルパスを取得することができるAPIってありますか。

890:デフォルトの名無しさん
07/04/15 02:41:52
CreateFileで開いてフルパスじゃ無いって事は
カレントディレクトリパス+CreateFileに渡したパスで良いと思うけどどうかね?

891:デフォルトの名無しさん
07/04/15 04:52:59
他のアプリのフォーカスがあるコントロールへデータを送りたいのですが
以下の様なコードだと、アプリによっては正しくデータが送れません。

またブラウザで表示された、HTML領域のコントロールへも
データが送れたらなと思うのですが、どういう方法がありますでしょうか?

DWORD myid = ::GetWindowThreadProcessId(m_hWnd, NULL);
DWORD toid = ::GetWindowThreadProcessId(::GetForegroundWindow(), NULL);

::AttachThreadInput(myid, toid, TRUE);
//::SendMessage(::GetFocus(), WM_PASTE, 0, 0); //←貼り付けの場合は当り前だけど全て無問題
::SendMessage(::GetFocus(), WM_SETTEXT, 0, (long)"TEST STRINGS!!!");
::AttachThreadInput(myid, toid, FALSE);

892:デフォルトの名無しさん
07/04/15 04:55:36
HANDLE からもとのファイル名が知りたいって事じゃね?

俺はそんなAPI知らないけど。

893:デフォルトの名無しさん
07/04/15 04:57:23
送り先が間違っているんだろ

894:デフォルトの名無しさん
07/04/15 05:07:56
俺も送り先が間違っているに一票

他にもたまにウィンドウがフォーカス持ってないように見えてフォーカス持ってたり
フォーカス持ってるようしか見えないのにフォーカス持ってなかったりする場合がある

フック使ってフォーカスの移動でも見てみればいい

895:デフォルトの名無しさん
07/04/15 05:14:12
>>891
ブラウザは良く知らんが↓が参考になるかも試練

URLリンク(k-gensai.hp.infoseek.co.jp)

Webのフォームはウィンドウじゃないから普通に操作すんのは無理

896:デフォルトの名無しさん
07/04/15 05:59:00
>>893-894
アプリの種類によっては、エディットではなく
タイトルバーの文字列が設定されてしまう場合とかあるんですよね。。
完全にエディットにフォーカスがあるのを確認して、SendMessage()しているのですが…
もう少し試行錯誤してみます。

>>895
やっぱりフォームのコントロールへのデータ送信は
ちょっとややこしそうですね。
また自分でも色々と調べてみますね。

解決したらご報告致します。

897:デフォルトの名無しさん
07/04/15 06:04:32
>>889
GetFileInformationByHandleEx
Vista以外では
URLリンク(www.microsoft.com)
をインストールする必要があるけど。
Win9xでは公開された方法は存在しない

898:896
07/04/15 06:13:25
具体的にいうとこんな感じなんですけどね。。

メモ帳のエディット部に送信 → 無事設定される
サクラエディタのエディット部に送信 → タイトルバーに設定される
Firefoxのアドレスバーに送信 → 無反応。。

やっぱり見た目にフォーカスがあっても
内部ではフォーカスが無い場合ってのがあるんでしょうね。

899:896
07/04/15 06:15:07
IEのアドレスバーには問題なく設定できるようです。
とりあえずどうしようもないので調べます。

900:デフォルトの名無しさん
07/04/15 06:19:13
あ、Fileextd.libはスタティックだからインストールが必要なのは開発者のほうだけね

901:デフォルトの名無しさん
07/04/15 06:23:19
>>898
Windows標準のエディットコントロールはWM_SETTEXTを独自に処理してるので
エディット部に設定される
それ以外のほとんどのウィンドウはWM_SETTEXTを処理しないのでデフォルト処理で
タイトルバーへの設定が行われる
子ウィンドウでタイトルバーが表示されていなければ無反応に見える
エディットコントロール(のように見えるもの)にテキストを設定する汎用的な方法は
存在しない

902:896
07/04/15 06:40:29
>>901
なるほど~
確かにWM_SETTEXTで設定出来るのは
どれもオーソドックスなエディットだけですね。
う~ん、困ったなぁ。。。

903:デフォルトの名無しさん
07/04/15 06:58:58
そもそも WM_SETTEXT は外から使うことを考慮していない。使えるように実装されているだけ。
文字を送るだけなら他の方法がある。

904:デフォルトの名無しさん
07/04/15 07:06:10
でも使えるように実装するのが普通だよな
今FireFox見てみたけどおかしな作りだな

905:896
07/04/15 07:25:30
別アプリのWebFormのコントロールに
データを設定する事なんて果たして可能なのかなぁ。。

906:デフォルトの名無しさん
07/04/15 07:48:59
IWebBrowser2で検索すると参考になりそうなサイトは沢山ある

が、理解できるかは知らんよ

907:896
07/04/15 07:50:37
>>906
情報ありがとうございます。
頑張って調べるしかないですね。

908:デフォルトの名無しさん
07/04/15 08:04:31
IEなんかは一見標準コントロールを使っているように見えるが
あれは全て自前描画のフルスクラッチだから、普通の
コントロールのように扱うのは無理だよ。

909:896
07/04/15 08:09:08
>>908
MSのアプリってそういうの多いみたいですね。。
あとAdobeのものとかも自作コンポーネントとかが沢山で。

ウェブフォームの方は、情報が色々と出てきて
どうにかなりそうな気がしてきました。

助言を下さったみなさま、ありがとうございました。

910:デフォルトの名無しさん
07/04/15 10:22:07
Windows Presentation Frameworkのコントロールも全部(API的には)自前描画だな
アンマネージなアプリから設定するのは結構骨が折れる

911:デフォルトの名無しさん
07/04/15 10:24:23
Windows Presentation Foundationだった
.NET Frameworkと微妙に混ざった
あとJavaのSwingアプリとか(AWTやSWTはプラットフォームのコントロールを使ってる)

912:889
07/04/15 10:35:31
>>897
ありがとう。
GetFileInformationByHandleEx の FileNameInfo で99%できた。
しかし、ドライブレターが無いのだ。
つまり、L"\\Windows\\System32\\ntdll.dll" みたいなのが返ってくる。
C: の部分はどうやったら良いかもお願いします。

913:デフォルトの名無しさん
07/04/15 11:04:30
>>912
VistaならGetVolumeInformationByHandleW
2000/XPだとGetFileInformationByHandle(Exじゃないほう)と
FindFirstVolume/FindNextVolume/FindVolumeClose/GetVolumeInformationの
ボリュームシリアル番号を付き合わせる、くらいしか思いつかない。

914:デフォルトの名無しさん
07/04/15 16:31:07
おにいさま…涙が…止まりません

915:デフォルトの名無しさん
07/04/15 21:06:53
辛子明太子を食べろ

916:デフォルトの名無しさん
07/04/15 21:23:52
エディットボックスで英数字だけ使うのってできないんだっけ

917:デフォルトの名無しさん
07/04/15 21:32:53
エディットボックスでWM_CHAR引っ掛ければ余裕

918:デフォルトの名無しさん
07/04/15 21:50:32
クリップボード経由でペーストされたら?

919:デフォルトの名無しさん
07/04/15 21:52:15
WM_PASTE見張ってれば良いじゃん

頭使ってる?

920:デフォルトの名無しさん
07/04/15 22:20:42
WM_SETTEXTとかEM_REPLACESELとかも見張る必要あるだろ

921:デフォルトの名無しさん
07/04/15 22:21:09
見張ればいいじゃん。

労力使ってる?

922:デフォルトの名無しさん
07/04/15 22:24:53
他にもワナがありそうだな。

EditBoxのあるダイアログのOKボタンが押されたときにでも、
データが適切であるかを確認する方がよほど楽だろうな。

923:デフォルトの名無しさん
07/04/15 22:26:46
頭も使う労力も無い人に金言を授けよう

 駄 目 な 奴 は 何 を や っ て も 駄 目


924:デフォルトの名無しさん
07/04/15 22:28:52
本人から言われると重みがあるな

925:デフォルトの名無しさん
07/04/15 22:30:53
あれ、英数字ってなかったっけ?
俺の気のせいか

926:デフォルトの名無しさん
07/04/15 22:31:52
数字だけならあったけどな

927:デフォルトの名無しさん
07/04/15 22:32:54
>>925
MFCのDDXならデジットチェックあるんだよ。
だけどここはWin32APIだから。

928:デフォルトの名無しさん
07/04/15 22:46:22
DDXも入力はできちゃう

929:デフォルトの名無しさん
07/04/15 22:55:15
って EM_CHANGE / EM_UPDATE じゃいかんのけ?

930:デフォルトの名無しさん
07/04/15 23:52:12
>>929
いいんとちゃう?

931:912=889
07/04/16 00:58:15
>>913
OSはXPです。
FindFirstVolume/FindNextVolume/FindVolumeClose だと "\\?\Volume{GUIDっぽい文字列}\" みたいな文字列で、どう扱ってよいか分からず断念。
ドライブレターありきで、割り切ることにしました。
マウントでも破綻するかもしれないですが、これも割り切り。
(1) ファイルのハンドルを GetFileInformationByHandle に渡して、ファイルのボリュームシリアル番号を得て、
(2)GetLogicalDriveStrings の結果を GetVolumeInformation に渡して、各ドライブのボリュームシリアル番号を得て、
(3)上記(2)のボリュームシリアル番号のうち、(1)のボリュームシリアル番号に一致するのがファイルが居るドライブと判定。
という方法でとりあえずやりたいことはできるようになりました。
御礼を兼ねて報告。

932:デフォルトの名無しさん
07/04/16 01:24:18
>>931
こんなの見つけた。Win2kだとさらにやり方が違うみたい
URLリンク(www.ultrasync.net)
もし非公開API使ってもいいならNtQueryVolumeInformationFileがたぶん使える

933:デフォルトの名無しさん
07/04/16 01:39:17
あーどっちにしろ"\\?\Volume{GUIDっぽい文字列}\"からドライブ名への変換は
必要か。じゃあGetLogicalDriveStringsからたどるのが一番簡単だな

934:デフォルトの名無しさん
07/04/16 12:04:45
どうでもいいけど、>890の方法はダメだな。
カレントディレクトリパスなんてファイルダイアログを開くだけで変わってしまう。
APIを駆使する方法以外では、素直にCreateFile時にフルパスを保存しておくしかないね。

935:デフォルトの名無しさん
07/04/16 14:28:11
wParamとlParamについてどなたか
やさしく教えてください。

936:デフォルトの名無しさん
07/04/16 14:44:33
>>935
最早その名前に何の意義も無いので、適当に使い分けましょう。

937:デフォルトの名無しさん
07/04/16 14:44:42
メッセージに追加の情報を付加するためのもので、メッセージ毎に意味が違う。
個々のメッセージ毎にどういう意味を持つかはMSDN Libraryに書いてある。

938:デフォルトの名無しさん
07/04/16 14:46:00
イベントが呼ばれたときに設定される変数で
意味はそのイベントによって異なる。

939:デフォルトの名無しさん
07/04/16 14:46:01
>>936
使い分けだったら、ポインタはlParam、ハンドルはwParamに入れられる傾向にある。
Win16で、ハンドルとwParamが16ビット、FarポインタとlParamが32ビットだった名残だが。

940:デフォルトの名無しさん
07/04/16 14:50:40
lParamのlってlongのこと?
じゃあwはword?


941:デフォルトの名無しさん
07/04/16 14:56:05
l
w

942:デフォルトの名無しさん
07/04/16 15:09:26
>>940
そうだよ。Win16では当初ウィンドウプロシージャもこういう宣言だった。
LONG FAR PASCAL WindowProc(HWND, unsigned, WORD, LONG);
Win16後期になってくると、LRESULT/UINT/WPARAM/LPARAMが出てきて、
現在のWin32でも通用する形になった。
LRESULT FAR PASCAL WindowProc(HWND, UINT, WPARAM, LPARAM);

943:デフォルトの名無しさん
07/04/16 16:54:13
リソースの STRINGTABLE の最大文字列長は何バイトですか?

944:デフォルトの名無しさん
07/04/16 17:41:21
>>943
ちょっと的を得てなくて申し訳ないんだが、
リソースも所詮ファイルなので、リソース全体ではNTFSの2TB弱が限界だろうか。
この辺ウラとってなくて申し訳ない。

Win32APIだとLoadString関数を使う事になるが、これは文字数にintを使ってる。
さらに、32bitのWindows2000系でのユーザーメモリ空間は2GBなので、
VC/VC++6.0では1回で使える文字列は2GB弱が限界だと思われる。

#VB6.0のString型はUNICODEで32766文字。

945:デフォルトの名無しさん
07/04/16 17:48:28
>>944
>VB6.0のString型はUNICODEで32766文字。
便乗でスマソ
BSTR型は、ポインタの一つ前に文字長が入っているんだっけ?

946:デフォルトの名無しさん
07/04/16 17:54:15
>>943
WCHAR形式で格納されていて、最大0xFFFF文字(NULL文字を含まない)

947:デフォルトの名無しさん
07/04/16 17:55:20
>>945
文字長ではなく終端を含まないバイト数

948:デフォルトの名無しさん
07/04/16 20:16:07
RASCALってなんですか?

949:デフォルトの名無しさん
07/04/16 20:17:10
アライグマ

950:デフォルトの名無しさん
07/04/16 20:49:44
Helphiじゃないの

951:デフォルトの名無しさん
07/04/16 20:51:13
RASICかもしれん

952:944
07/04/16 20:54:53
>>943
さっきは適当な事を言ってすみません。

URLリンク(blogs.msdn.com)

この、(2007年1月頃の)ページでは、「ヘルプで明文化されている最大値の最低限は4097バイトである」
(つまり、デフォルトで4097バイトまでは問題ない)
「しかも、他の地域版のMSDNヘルプでは限界すら書いてない。本当の限界を調べてみないか?」とあるが、
レスは「そんな意味の無い事を・・・」とにべもない。

フォーマット的には>>946でしょうが、このアーティクルが本当なら
サードパーティツールを考慮して4097バイト(2047文字)に抑えた方が良さそうです。

#VB6のString型は、最大32767文字なのですが、最大まで使ってしまうと
#ヌルターミネータ(文字列最後の0)が入らないまま保存されます。
#VC/VC++6.0では、最も重要なCComBSTRですら文字列長プレフィックスを考えてません。
#だから、安全にプログラムするなら32766文字が良いです。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch