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


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

Win32API 質問箱 Build3
501 名前:デフォルトの名無しさん :02/05/02 18:08
そらそうだろ。
低域通過フィルタ作ってかぶせれば、なんぼかマシ

502 名前:デフォルトの名無しさん :02/05/02 19:18
ダイアログボックスで、Enterキーを押しても
終了しないようにするにはどうしたらいいですか?

503 名前:デフォルトの名無しさん :02/05/02 19:27
>>502
PreTranslateMessage()

504 名前:502 :02/05/02 21:10
自己解決しました。
レスサンキュです。

#OKボタンのIDをIDOK以外にして、IDOKをハンドルしない。

505 名前:デフォルトの名無しさん :02/05/03 00:40
システム全体じゃなくて、特定のリストボックスやコンボボックスのみ
スムーズスクロールをオフにするAPIってないの?

506 名前:デフォルトの名無しさん :02/05/03 00:49
DestroyWindow

507 名前:駆け出し :02/05/03 04:06
StretchDIBitsでビットマップを表示すると色がフィルタをかけた様に
ボケてしまいます。5倍以上に拡大したときは何故かボケません。


508 名前:デフォルトの名無しさん :02/05/03 04:07
それはドライバ依存。
nVidiaのビデオカードだとボケる

509 名前:駆け出し :02/05/03 04:12
>>508
解りました。レスありがとうございます。


510 名前::02/05/03 04:47
あのう
WindowsプログラムのエントリポイントはWinMainだって書いてあったから
そう書いてコンパイルしようとしたら
「mainが未解決」みたいなこと言われるんですが何でですか?

511 名前:デフォルトの名無しさん :02/05/03 04:50
ダイアログリソースを動的に作って
CreateDialogIndirect使ってみたいんだけど、
参考になる(できればまるっきりそのまま使える)ソース無い?

512 名前:デフォルトの名無しさん :02/05/03 04:51
プロジェクト作成でコンソールを選んだんだろ
プロジェクト>設定>リンク のタブを選んで、
プロジェクトオプションの中の
/subsystem:consoleを/subsystem:windowsに変える

513 名前:512 :02/05/03 04:53
キリ番とってた。
>>512>>510への返信ね

514 名前:デフォルトの名無しさん :02/05/03 04:54
>>512
リソースのダイアログをダンプしたのが一番参考になると思うが。

515 名前:デフォルトの名無しさん :02/05/03 09:48
HWNDは解っているExplorerが現在開いているディレクトリを
取得する方法ってありませんか?

現在は、ファイルパスをタイトルに表示、もしくはファイルパスを
アドレスバーに表示にして、そっちから取得してきているのですが、
これらを非表示(省略表示)にしても使える方法が知りたいのです。

516 名前:デフォルトの名無しさん :02/05/03 09:57
treeviewを覗く。

517 名前:515 :02/05/03 10:46
環境を忘れました。Windows2000です。

>>516
Spy++で見てみたところ、treeviewを表示させない状態で開かれたエクスプローラには、
最初はtreeviewが存在せず、「Toolbar->フォルダ」を選択すると、
以降そのウインドウには BaseBar-SysTreeView32というものができ、非表示にしても
そのクラスが残るみたいです。

treeviewを表示させないで開いたやつからも取得したい(というか、区別したくない)ので、
他の方法は無いでしょうか。

518 名前:デフォルトの名無しさん :02/05/03 12:17
>>515
まっとうなやりかたなら、Shellからごりごりとだね。

519 名前:515 :02/05/03 13:59
>>518
すみません、「Shellをごりごり」ってのは具体的には何を叩けばいいんでしょうか?
宜しければ参考になる資料か何かを教えてください。

520 名前:デフォルトの名無しさん :02/05/03 14:13
>>511
MSDNにDLGTEMPLというサンプルがある。
MFCだけど参考になると思う。

ちなみに、MFCはCDialog::DoModalでも
内部でLoadResourceしてからCreateDialogIndirectしてたような。

521 名前:510 :02/05/03 15:05
>>512さん、ありがちょう!
性交しましたサンクス!

522 名前:デフォルトの名無しさん :02/05/04 01:10
DLL内で起きて、そのDLL内で捕捉しなかった例外はどうなるのでしょうか?
そのDLL内の関数を呼び出した所に伝わるのでしょうか?
DLLが別のコンパイラ言語で作成されていても。


523 名前:デフォルトの名無しさん :02/05/04 01:14
WindowsのSEHなら伝わるんじゃないか?

524 名前:デフォルトの名無しさん :02/05/04 01:24
性交いうな

525 名前:デフォルトの名無しさん :02/05/04 01:25
ハァ?

526 名前:デフォルトの名無しさん :02/05/04 01:30
漏れも気になってた

527 名前:デフォルトの名無しさん :02/05/04 01:31
(*´Д`)ハァハァ

528 名前:デフォルトの名無しさん :02/05/04 02:58
>>507
SetStretchBltMode

529 名前:デフォルトの名無しさん :02/05/04 08:45
すごくしょもないことで申し訳ありませんが、
SendMessageでテキストボックスなどコントロールを
表示・非表示の切り替え や使用可能・不可能の切り替えはどう書けばいいでしょうか?



530 名前:デフォルトの名無しさん :02/05/04 09:26
SendeMessageよりは ShowWindow / EnableWindow を使うべし。

531 名前:デフォルトの名無しさん :02/05/04 12:46
lstrcpy と strcpy の速度を比較したら strcpyの方が圧倒的に(10倍とか)速い
んですが、そういうもんですか?

532 名前:デフォルトの名無しさん :02/05/04 12:53
そういうもんじゃない?

533 名前:デフォルトの名無しさん :02/05/04 14:26
そうだったのかぁ。知らなかった。

534 名前:デフォルトの名無しさん :02/05/04 14:28
>>531
lstrcpy は単純に movs で回してるから、データ量増えると遅いよ。strcpy は
4 バイト単位でコピーするように工夫してある。

535 名前:デフォルトの名無しさん :02/05/04 15:25
神がたくさんいるスレはここですか?

536 名前:デフォルトの名無しさん :02/05/04 15:29
lstrcpyはOSとのあいだでコンテキストスイッチがはいるから。
strcpyはユーザコード側で動くから、コンテキストスイッチ
しないので、たとえばlstrcpyとstrcpyがまったく同じコードでも
strcpyのほうがはやーくなるよ。

537 名前:デフォルトの名無しさん :02/05/04 15:41
コンテキストスイッチなんか入らないよ

538 名前:536 :02/05/04 16:02
あら、コンテキストスイッチとは言わないですか
(コンテキストスイッチはスレッド切り替え時のみの用語?)
すまそ。

ようはLPCでOS側にスイッチしないといけないので
遅いと。

539 名前:デフォルトの名無しさん :02/05/04 16:03
>>536
嘘つけ。

Win32 API は OS 呼び出すモノも多いが、ユーザ空間で動く単なるライブラリ
関数も多数ある。嘘だと思うなら lstrcpy にブレークポイント設定して、デバッ
ガで追いかけてみ?

540 名前:デフォルトの名無しさん :02/05/04 16:05
>>538
知ったか逝って良し!

> ようはLPCでOS側にスイッチしないといけないので
してねーよ。だいたい LPC は NT Kernel 内部でメッセージ通信するために
使ってるメカニズムの名前で Win32 API 経由で OS 呼び出すときには int
(ソフトウェア割り込み) 使ってるだろ。

541 名前:デフォルトの名無しさん :02/05/04 16:16
>>538
カーネルモードに?
案外大げさな関数なんですね。

542 名前:デフォルトの名無しさん :02/05/04 16:23
あらま、激しくすまそ!
デバッガでlstrcpyおってみたら、確かにひねりのないループした
77E3317D mov al,byte ptr [ecx]
77E3317F mov byte ptr [edx],al
77E33181 inc ecx
77E33182 inc edx
77E33183 test al,al
77E33185 jne 77E3317D

えー、かなり昔のCマガでそんな記事を読んだような、
そのままそんな気がしてたのは気の成果..

lstrcpyとは関係ないけど、intの後引数変換とかでカーネルとlpcで
通信してるって話も気のせい?
一般的にはユーザアドレス空間内のデータをどうやってカーネルモード
のサービスにわたしてるの(共有メモリ?)
どうか教えて!!




543 名前:デフォルトの名無しさん :02/05/04 16:27
>>542
リバースエンジニアリングしやがった
タイーホ

544 名前:デフォルトの名無しさん :02/05/04 16:31
げ、俺もlstrcpyが遅いのはAPI呼び出しのオーバヘッドがあるからだとおもってた
槍田氏

545 名前:デフォルトの名無しさん :02/05/04 17:25
>>542
> lstrcpyとは関係ないけど、intの後引数変換とかでカーネルとlpcで
> 通信してるって話も気のせい?
気のせい。そもそも LPC は同一ホスト上のプロセス間通信に用いるメカニズム
で、プロセスのカーネルモードとユーザモードの間のデータ受け渡しに使うメカ
ニズムではないって。(むしろ RPC のローカルマシン限定版と思っておいた方
が近い)

NT 系列 (x86) だと、eax レジスタにシステムコール種別、edx レジスタにパラ
メタを設定して、ソフトウェア割り込み int 2E だったかな。

> 一般的にはユーザアドレス空間内のデータをどうやってカーネルモード
> のサービスにわたしてるの(共有メモリ?)
ふつーはカーネルモードもユーザモードも、同一の仮想メモリ空間を見てる
(ただしセキュリティ上の要請から、一部はカーネルモードでしか読み書きで
きないようにしておく)。

ソフトウェア割り込みが発生すると、

1. カーネルモードに移行する。
2. 割り込み種別に応じて、事前に設定しておいた割り込みハンドラが呼ばれる。
  このときに、割り込み発生直前のプログラムカウンタ値などは、ハードウェア
  が自動的にスタックに積む。
3. レジスタ or スタックから必要な値を取り出した上で、それを解析してカーネル
  サービスを提供する。

という感じ。カーネルモードからユーザモードのメモリ空間は見えるので、必要な
データの読み書きは自由にできる(ただし validation 必須)。

ざっと読んだ感じ

 一つのプロセスが、カーネルモードとユーザモードという二つの側面を持つ

ということを理解できてない気がするんだが。詳しくは、タネンバウム先生の
OS 入門書でも読んで勉強してくれ。

546 名前:デフォルトの名無しさん :02/05/04 19:15
ExtCreateRegionで作ったハンドルは後始末で何か必要ですか?
APIのHELPには何も書いてない。
DeleteObjectするとBoundsCheckerが文句たれます。

547 名前:デフォルトの名無しさん :02/05/04 19:31
なんか、詳しい人が一杯いますね。すごいなー。

548 名前:デフォルトの名無しさん :02/05/04 19:36
というか、strcpyとかmemcpyはインライン展開されなかったっけ?

549 名前:デフォルトの名無しさん :02/05/04 19:36
オプションによる

550 名前:デフォルトの名無しさん :02/05/04 19:37
memcpyは遅いので使いたくないに1票

551 名前:デフォルトの名無しさん :02/05/04 19:41
組み込み関数の展開させれば、rep movsb くらいには
最適化されると思うヨ >550

552 名前:デフォルトの名無しさん :02/05/04 20:02
memcpyとCopyMemoryは同じくらいの速さですか?

553 名前:デフォルトの名無しさん :02/05/04 20:14
ねた?

554 名前:デフォルトの名無しさん :02/05/04 20:20
なんでそんなしょーもない低レベルの部分で早さを気にする?
そんなに気になるんじゃ、コピーしないで済む方法を考えろ

555 名前:デフォルトの名無しさん :02/05/04 20:25
>>552
同じくらいっつーか、同じ。

556 名前:デフォルトの名無しさん :02/05/04 21:08
>>554
正しい

557 名前:デフォルトの名無しさん :02/05/04 21:10
C++は知ってる
WindowsAPI 初心者が
Windows API without Direct X without MFC without SDLで
ゲームをつくれるまでいける
サイト無いですか?

558 名前:デフォルトの名無しさん :02/05/04 21:13
>>557
本買え。

559 名前:デフォルトの名無しさん :02/05/04 21:16
>>554
画像のコピーだったので。
自分でループまわしたらだいぶ速くなたーよ。

560 名前:デフォルトの名無しさん :02/05/04 21:20
memcpyと自分で回した場合の比較はここが詳しい
http://www-6.ibm.com/jp/developerworks/linux/011019/j_l-rt3.html

561 名前:515 :02/05/04 21:30
>>519 どなたかたのんますage (;´д`)

562 名前:デフォルトの名無しさん :02/05/04 21:40
>>557
MSDN Library かな。あとは Petzold 本読め。

563 名前:557 :02/05/04 21:44
>>562
良心的レスありがとうございます

564 名前:519 :02/05/04 21:54
>>561
ごめんごめん。見逃してた。「Shelからごりごりと」ってのは、ShellWindows
などのオブジェクトを使うってこと。

ShellWindowsコレクションから、InternetExplorerオブジェクトが取得できる。
InternetExplorerって言っても、普通のExplorerも含むからおっけー。

そんで、InternetExplorerのLocationURLプロパティで、今開いているパスが
取得できる。vbs でのサンプルは↓な感じ。


  Set s = CreateObject("Shell.Application")
 Set sws = s.Windows()

 h = ここにウィンドウハンドルを入れる

 For Each i In sws
  If i.hWnd = h Then
   MsgBox i.LocationURL
  End If
 Next

565 名前:デフォルトの名無しさん :02/05/04 23:00
フリーセルとか秀丸とかメニューの右端に文字が書いてあるんですけど
これってどうやって表示するんですか?

566 名前:デフォルトの名無しさん :02/05/04 23:29
>>565
オーナードローでは?

567 名前:デフォルトの名無しさん :02/05/05 00:14
>>566
右端に文字列を表示する具体的な方法がわかりません
メニュー項目にBMPを表示する方法を解説したサイトは沢山あるんですが…

568 名前:デフォルトの名無しさん :02/05/05 00:31
>>567
右端の文字というのがアクセラレータのことなら、
メニュー アクセラレータ WM_COMMAND
あたりをキーにして検索してみては。

569 名前:デフォルトの名無しさん :02/05/05 00:35
>>568
全然違うよ。
秀丸はメニューの右横にカーソルインジケータを表示してる。
Window DCを取得して、自力で書いてるっぽい

570 名前:568 :02/05/05 00:40
あ、違ったのか。
>>567 忘れてくらさい

571 名前:568 :02/05/05 00:44
>>569
秀丸落としてみたけどカーソルインジケータって
何のことかわからない・・・。

572 名前:568 :02/05/05 01:00
もしかして、>>569のはサブメニューの三角マークという落ちでそか

573 名前:デフォルトの名無しさん :02/05/05 01:11
>>568
メニューの横にカーソルの位置が書いてあるじゃん?
わかんない?

メニューの横って、フレームメニューの一番右端。


574 名前:568 :02/05/05 01:14
あー!わかりました。

575 名前:515 :02/05/05 01:38
>>564
ありがとうございます。参考にして調べてみたところ、方法は理解できました。

ただ、もう少し質問させてください。C++(BCC)/SDKで開発しております。
この環境で、>>564の CreateObject("Shell.Application") と同じことをやろうとしたら
どのように書いたらよいのでしょうか?

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q176792 に、
m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
という記述があったのですが、これをコンパイルしようとすると、
「ShellWindowsはSHDocVwのメンバーではない」 と言われてしまいます。

576 名前:デフォルトの名無しさん :02/05/05 01:50
UUID guid;
IShellWindows ishw;
UuidFromString(_T("Shell.Application"), &guid);
CoCreateInstance(guid, NULL, CLSCTX_INPROC_SERVER, IID_IShellWindows, &ishw);
じゃないのん?

577 名前:565 :02/05/05 02:13
お答えありがとうございます
結局ウィンドウに直書きすることで解決しました
ところでメニューで使われてるフォントのハンドルって取得できるんでしょうか?
画面のプロパティでメニューフォントは変更可能ですよね?

578 名前:577 :02/05/05 02:18
あ、いきなり SystemParametersInfo() で解決しました

579 名前:515 :02/05/05 12:37
>>576
IShellWindowsは抽象クラスなので実体は作れない、といったエラーが発生しました。

Web上に C++/SDK 用の資料が殆ど見当たらないのが厳しい。
何か1つ動作するサンプルがあれば、もうちょい理解しやすそうなのですが(;´д`)

とりあえず本屋にでも行ってきます。

580 名前:デフォルトの名無しさん :02/05/05 12:58
>>579
いや、576はミスでIShellWindow* ishw;ダーヨ

581 名前:515 :02/05/05 21:39
本屋にそれっぽいのが何も無くて鬱。
>>580, >>576

UuidFromString(_T("Shell.Application"), &guid);
HRESULT result = CoCreateInstance(guid, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pShellWindows);
if (FAILED(result)) {
    printf("failed\n");
    return 1;
}
//pShellWindows->GetCount();
pShellWindows->Release();

これはfailedが表示されますので、多分guidが間違ってるのかと推測しました。
で、CoCreateInstanceの第1引数を、CLSID_Shellにするととりあえず
failedは表示されないようになるのですが、その後に>>575のURLを参考に
pShellWindows->GetCount(); とやってみたところ、
「GetCountはIShellWindowsのメンバではない」と言われ、コンパイルがとおりません。

582 名前:デフォルトの名無しさん :02/05/05 23:15
UuidFromString -> CLSIDFromString
んで、IShellDispatch::WindowsでIDispatchを得て・・・
ってな感じで、オートメーションを利用しないとだめっぽ

583 名前:デフォルトの名無しさん :02/05/06 00:48
waveOutGetDevCaps()で情報を取得したところ、

wMid = 1
wPid = 100
vDriverVersion = 0.1280
szPname = YAMAHA DS-XG Audio (WDM)
dwFormats = 4095
wChannels = 65535
dwSupport = 0x2c

↑のようにwChannelsが65535になっちゃったのですが、
これってどういうケースなんでしょうか?

584 名前:デフォルトの名無しさん :02/05/06 00:54
>>583
チャンネル数65536個のスーパー音源

585 名前:デフォルトの名無しさん :02/05/06 01:03
>>583 ステレオ

586 名前:デフォルトの名無しさん :02/05/06 01:27
>>585
ありがとうございます。
ところで、どうして65535がステレオなのでしょうか?
MSDNにその記述が見つからないのですが。
1か2としか書いてなかったので。

587 名前:デフォルトの名無しさん :02/05/06 01:43
いまさら「適当でした」とか言ったらぶっ殺されるだろうか・・・
(((;゚Д゚)))ガクガクブルブル ちなみにうちも65535返します・・・

588 名前:デフォルトの名無しさん :02/05/06 02:02
モノラルしかサポートしてないサウンドカードなんて無視していいんじゃねーの?
ちなみにウチのDS-XG Wave Playbackはなぜか4を返している。
WAVE_MAPPERを指定してやるとちゃんと2を返すんだが。よくわからん。

589 名前:デフォルトの名無しさん :02/05/06 02:20
(((;゚Д゚)))ガクガクブルブル ああ、うちもWAVE_MAPPER指定で2を返した

590 名前:583 :02/05/06 04:26
ウチもWAVE_MAPPERを指定すると2を返します
んー、なんでだろ

591 名前:デフォルトの名無しさん :02/05/09 02:21
winInetを使って、色々と試しているのですが
タイムアウトの設定変更がうまくできません。
Win2k(SP2)+IE5.5SP2で、BCB5Proをつかってます。

HINTERNET hSession;
DWORD Timeout;
DWORD newTimeout;
DWORD BufSize;
bool isResult;
char buf[1024];

hSession = InternetOpen( "MyApp", INTERNET_OPEN_TYPE_DIRECT, NULL,NULL, 0 );

BufSize = sizeof(DWORD);
InternetQueryOption(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
sprintf(buf,"初期状態の接続タイムアウト: %d msec", Timeout);
printf("%s\n",buf);

if( hSession ){
 newTimeout = (DWORD)15*1000; //15秒に設定
 isResult = InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,&newTimeout,sizeof(newTimeout));
 if(!isResult) {
  printf("設定失敗\n");
 }
 else {
  InternetQueryOption(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
  sprintf(buf,"設定変更後の接続タイムアウト: %d msec", Timeout);
  printf("%s\n",buf);
 }
}

InternetCloseHandle(hSession);

って、たったこれだけなんですが標準状態の300秒から変わってくれません。
何かアドバイスもらえませんか?
IE5.0ではバグがあったが、5.01でなおしたというMS情報には
たどり着いたんですが、5.5でこの機能は無くなってしまったんでしょうか?

#IEコンポーネントを使い倒すスレの方が良かったのか。。。


592 名前:デフォルトの名無しさん :02/05/09 03:17
InternetQueryOptionの第一引数ってNULLじゃなくて
hSessionじゃあないのかなあ、とか
その設定は hSession が Open されている間しか有効じゃないような
気がするなあ、とか

593 名前:デフォルトの名無しさん :02/05/09 03:50
ぐおぉ、神様、仏様、592様
マジでこんなに遅くありがとうございました。
つーか、俺がバカなだけでしたね。。。。
おっしゃるとおり
InternetQueryOption(hSession, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
としたら、一発でした。
マジでありがとうごぜーますだ。


594 名前:デフォルトの名無しさん :02/05/09 14:07
mingw32でwindowsプログラムを
始めようと思います
windows APIでプログラムする範囲で、
VC++にできてmingwでできないことはあるのでしょうか?


595 名前:デフォルトの名無しさん :02/05/09 14:26
コンパイルオプションに関して質問なんですがいいですか?

/Zc:wchar_t,forScope
このオプションを/cと併用するとファイル名とみなされて
しまうんですがどうしたらいいでしょうか?

やりたいことはこうです。
$cl /Zc:wchar_t,forScope /CLR /c *.cpp

596 名前:デフォルトの名無しさん :02/05/09 14:52
IE6で、お気に入りのアイコンを押すと、左にお気に入りのウィンドウが表示されますが
あれって、どのAPIを使用すれば実現できますか?

597 名前:デフォルトの名無しさん :02/05/09 18:38
ファイルが移動可能かどうか調べるには、どんな方法がありますか?

598 名前:デフォルトの名無しさん :02/05/09 19:07
>>594
WindowsAPIがすべて使えればWindows上で出来ることに関しては出来ないことはない。

599 名前:デフォルトの名無しさん :02/05/09 19:16
COM関連わ?

600 名前:デフォルトの名無しさん :02/05/09 19:41
>>599
問題ない

601 名前:594 :02/05/09 20:09
>>598-600
レスありがとうございます
じゃ、mingw32使ってみます


602 名前:ばか者D :02/05/09 21:12
IE が使用する Client UrlCache について操作する
モジュールについて説明されている場所をご存知の方

教えて頂けませんか?

IEの作成するキャッシュデーターを操作するのが目的です


603 名前:デフォルトの名無しさん :02/05/09 22:11
>>594
SJIS や UNICODE の文字列リテラルを使うこと、かなぁ。あとはリソース関連
も辛くない?

604 名前:デフォルトの名無しさん :02/05/09 23:13
Wininet.dllのInternetReadFile関数ってHDDにバッファを書き込むのでしょうか?
InternetReadFileを使ったプログラムのI/Oをタスクマネージャでモニタリングしてると、
InternetReadFileのファイル取得ループ内にHDDに書き込んでいるようなのですが・・・
ちなみにVBだったりするんですけど、VCも同じなのかな・・・?

605 名前:デフォルトの名無しさん :02/05/09 23:24
メモリに書いても、場合によってはスワップにかかるから、
HDDにアクセスすることはある。

606 名前:デフォルトの名無しさん :02/05/09 23:27
>>605
スワップは0に設定してあって、メモリだと思うのですが・・・。なんでだろう・・・。

607 名前:デフォルトの名無しさん :02/05/09 23:42
普通に使ってるとディスクキャッシュするのでは?>WinInet
何かNOCACHEとかオプションあるのかもしれないが。

608 名前:デフォルトの名無しさん :02/05/09 23:57
>>607
HttpOpenRequestのオプチョンに
INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_PRAGMA_NOCACHE
がありました!とりあえず試してみます。

609 名前:デフォルトの名無しさん :02/05/10 00:08
>>607
わーーーおぉおおぉぉぉおぉおおぉ。いけました!
べりーべりーさんくすです。
これで2重書き込みしなくて済みそうです。
どうもでした

610 名前:デフォルトの名無しさん :02/05/10 12:25
プロパティページの WM_INITDIALOG では、ボタンのテキストを
変更できないんでしょうか。どういう訳か、変更されません。
こういう仕様なのかなとも思うんですが、みなさんの環境でも同じ
現象が起こりますでしょうか?

BOOL CALLBACK MyPropPageProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM)
{
switch (uMsg) {
case WM_INITDIALOG:
{
// ボタンテキストの変更 (失敗する)
HWND hBtn = GetDlgItem(hDlg, IDC_BTN_XXXX);
SetWindowText(hBtn, "hogehoge");
}
return TRUE;
}
return FALSE;
}

通常のダイアログ(プロシージャ)では上手く変更できます。ペゾルド本
などを漁ってみましたが、それらしい記述は見当たりませんでした。
件に関して何か情報をお持ちでしたら、よろしくお願いします。


611 名前:デフォルトの名無しさん :02/05/10 15:45
610
SetDlgItemText()

612 名前:デフォルトの名無しさん :02/05/10 18:37
CreateProcessで起動したプロセスハンドルのCPU使用率を
求めたいのですが、どのような方法がありますでしょうか。
どうか教えてください。

613 名前:デフォルトの名無しさん :02/05/10 18:43
PDH

614 名前:デフォルトの名無しさん :02/05/10 19:01
>>610
環境は?
WM_INITDIALOGは来てる?
どうゆう環境だったかでプロパティシートでWM_INITDIALOGが
来ないって現象があったようななかったような。
普通は610のコードで問題ないはずだけど。

615 名前:デフォルトの名無しさん :02/05/10 22:11
BCCでWinMain変数使おうとしたら、こんなエラーが出ました。
Error: 外部シンボル '_main' が未解決(C:BORLAND\B
CC55\LIB\C0X32.OBJ が参照)
などというエラーが出ます。
BCC5.5.1.2
winXP
どうか助けてください。

616 名前:デフォルトの名無しさん :02/05/10 22:12
>>615
ウインドウズ用にコンパイルしてますか?

617 名前:デフォルトの名無しさん :02/05/10 22:13
-tW

618 名前:デフォルトの名無しさん :02/05/10 22:22
基本的なことが分かってないので教えてください。
ソケットを作ってrecvしたんですけど、中身を表示すると
文字化けしています。でもたまに平気なサイトもあります。

キーワード何で調べればいいですか?

(エンコード、変換、関数、文字化けなどで調べました。
CGIの説明で惜しいのはあるんですけど、やっぱり
さっぱりです。お救いください)



619 名前:デフォルトの名無しさん :02/05/10 22:24
610
static HWNDにしな。

620 名前:デフォルトの名無しさん :02/05/10 22:24
>>618
あなた、マルチポストについてまず謝ってください。

621 名前:デフォルトの名無しさん :02/05/10 22:28
wakaTtayoGomennne..

622 名前:デフォルトの名無しさん :02/05/10 22:29
>>620
あなたになんで謝るの??

623 名前:デフォルトの名無しさん :02/05/10 22:29
今度は、外部シンボル'_main'が未解決のところが、
外部シンボル'WinMain'が未解決
になっただけでした。
いったいどういうことなんだ。
>>616>>617さんありがとうございます。

624 名前:デフォルトの名無しさん :02/05/10 22:30
WinMainを書いてないからだろ
スペルミスとか、ソース入れ忘れとか

625 名前:デフォルトの名無しさん :02/05/10 22:33
だからー、そもそもこれは文字化けなのかも謎だし、
おせーてくれ。

626 名前:デフォルトの名無しさん :02/05/10 22:33
>>624さん、何回見てもWinMainとかいてあります・・・。

627 名前:デフォルトの名無しさん :02/05/10 22:38
>>625
socketについて・・・いや、そのインターネット=WWWっていうお前は素人か?っていう発想からたたき直してこい。

628 名前:デフォルトの名無しさん :02/05/10 22:39
>>626
引数変とか。思いっきりオーバーロードになってたり。

629 名前:デフォルトの名無しさん :02/05/10 22:45
>>626
WinMainのプロトタイプと、コンパイル時のコマンドラインを書いてみろ

630 名前:デフォルトの名無しさん :02/05/10 22:46
>>628
初心者なのでよく分かりませんが、多分大丈夫だと思います。

631 名前:デフォルトの名無しさん :02/05/10 22:48
>>630
初心者なら勝手に大丈夫だと決めつけないで、聞かれたことには答えておきなさい

632 名前:デフォルトの名無しさん :02/05/10 22:58
>>629さん、一応ソース全文をのせときます。
ちなみに"helloworld"と表示するだけの単純なものです。
#include<windows.h>

int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow*/)
{
MessageBox(NULL,"hello world","hello world", MB_OK);
return 0;
}
コンパイル時のコマンドラインは
bcc32 -tW winhello.cpp
です。どうにかならないでしょうか・・・。

633 名前:デフォルトの名無しさん :02/05/10 22:59
>>632
int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow*/)


なぜにコメントアウト・・・?

634 名前:デフォルトの名無しさん :02/05/10 23:01
>>631
初心者だからってあまり舐めないでください。

635 名前:デフォルトの名無しさん :02/05/10 23:02
>>634
なめられるに値することしてるぞ?

636 名前:デフォルトの名無しさん :02/05/10 23:05
>>633
自分でも気づかなかった・・・。
普通にコンパイル、リンク、実行、できてしまいました。
レスしてくださった皆様、本当にすいませんでした。

637 名前:デフォルトの名無しさん :02/05/10 23:09
>初心者なのでよく分かりませんが、多分大丈夫だと思います。

>int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR lpCmdLine, int nCmdShow*/)

>>636はネタかアフォか神か?


638 名前:デフォルトの名無しさん :02/05/10 23:13
>>615
おい!今WTLのウィザードで作り、Debugで動いてるのをReleaseで
コンパイルしたら、同じエラーが出たよ!こっちはVC++だけどなんて偶然!

というわけで鬱鬱……なんで〜オレのアフォー(;´Д`)

639 名前:638 :02/05/10 23:21
真面目にお訊きします。VC++6、WTLのウィザードでダイアログベースの
アプリを作成し、Debug版では問題なく動いているのですが
Release版だと次のエラーが出てしまいます…。

LIBCMT.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Release/rd_setup.exe : fatal error LNK1120: 外部参照 1 が未解決です。

Debug版だと動くのが不可解で…。便乗ですがよろしくお願いします。

640 名前:615 :02/05/10 23:22
オレはなんてアフォなんだ〜〜〜〜〜〜〜

641 名前:デフォルトの名無しさん :02/05/10 23:22
プロジェクトのオプション設定で-subsystem:windowsにしろ

642 名前:デフォルトの名無しさん :02/05/10 23:27
ATL_MIN_CRT指定してて、かつ、CRTライブラリが必要な
関数を使っていると、リンク時にmainがないと怒られる。
ソースからぁゃιぃコードを処理するか、MIN_CRTをあきらめるか、
どっちかにするとよい。

643 名前:638 :02/05/10 23:44
>>641-642
ででで、できました!これで何をやったのか分からないので、
これから調べてきます。本当にありがとうございました。

オレもなんてアフォなんだ〜〜〜(゚∀゚)〜〜〜

644 名前:デフォルトの名無しさん :02/05/11 06:42
LoadLibrary()でDLLを呼び出したはいいんですが、DLLにあるクラスには
どうやって手を出せばいいんでしょうか。
「DLL内の関数アドレスを取得する」というGetProcAddress()しかありません。
何とぞ、よろしくお願いいたします。

645 名前:デフォルトの名無しさん :02/05/11 06:57
>644
各メソッドの修飾された関数名を使ってGetProcAddress()する、
のかなあ・・・?
コンストラクタやデストラクタの処理とか大変そう。
DLL側の仕様を変更できるならそっちを考え直した方がいいでしょうね。
COMにするとか、第一引数でthisを(ハンドルみたいに)渡すように
するとか。

646 名前:デフォルトの名無しさん :02/05/11 07:05
動的結合じゃ解決できないんで、
静的もしくは遅延結合で解決するしかありません

647 名前:デフォルトの名無しさん :02/05/11 11:37
BCC 5.5.1を使ってSDKのアプリを作ろうとしているのですが、質問があります
InvalidateRect(hStatic, NULL, TRUE)によってSTATICの部分のみを
任意のタイミングで再描画させようと思うのだけどイマイチ動作が不審
一応iが加算はされているから、WM_PAINTは呼ばれているようなのですが
パラメータでNULLを指定しているのに背景色で塗りつぶされません
hStaticをグローバル宣言にしても同様の結果でした
ソース
#include<windows.h>
LRESULT CALLBACK StaticProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
static int i=0;
TCHAR wcStr[128];
HDC hDC;
PAINTSTRUCT ps;
static WNDPROC *pDefStaticProc;

if (hwnd==NULL){ pDefStaticProc=(WNDPROC *)wp; return 0; }

switch (msg) {
case WM_PAINT:
i++;
hDC=BeginPaint(hwnd, &ps);
SetBkMode(hDC, TRANSPARENT);
wsprintf(wcStr, TEXT("i=%d"), i);
TextOut(hDC, 10, 10, wcStr, lstrlen(wcStr));
EndPaint(hwnd, &ps);
return 0;
}
return CallWindowProc(*pDefStaticProc, hwnd, msg, wp, lp);
}

648 名前:sage :02/05/11 11:37
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HWND hStatic;
static WNDPROC DefStaticProc;

switch (msg) {
case WM_CREATE:
hStatic=CreateWindowEx(0, "STATIC", NULL, WS_CHILD | WS_VISIBLE,
10, 10, 100, 100, hwnd, (HMENU)100,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
DefStaticProc=(WNDPROC)GetWindowLong(hStatic, GWL_WNDPROC);
StaticProc(NULL, 0, (WPARAM)(&DefStaticProc), 0);
SetWindowLong(hStatic, GWL_WNDPROC, (LONG)StaticProc);
return 0;
case WM_LBUTTONDOWN:
InvalidateRect(hStatic, NULL, TRUE); return 0;
case WM_DESTROY:
PostQuitMessage(0); return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}

649 名前:デフォルトの名無しさん :02/05/11 11:38
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
PSTR lpCmdLine,int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS wc;

wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL ,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL ,IDC_ARROW);
wc.hbrBackground=(HBRUSH)COLOR_WINDOW;
wc.lpszMenuName=NULL;
wc.lpszClassName=TEXT("Tom");

if (!RegisterClass(&wc)) return 0;

hwnd=CreateWindowEx(
0, TEXT("Tom"), TEXT("Jim"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 200, 200, NULL, NULL, hInstance, NULL);

if (hwnd==NULL) return 0;

while(GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);
return msg.wParam;
}

ソースここまで
hStaticをhwndにすれば一応ちゃんと動作はしますが、それだと何か嫌なので...
何が原因なのでしょうか?分かる方がおりましたら、解決法をおねがいします

650 名前:デフォルトの名無しさん :02/05/11 11:39
名前にsageとか書いてしまった...鬱だ...

651 名前:デフォルトの名無しさん :02/05/11 14:49
>>647-649
> パラメータでNULLを指定しているのに背景色で塗りつぶされません
どこのことだ。NULLって。


652 名前:デフォルトの名無しさん :02/05/11 15:13
>>651
InvalidateRect(hStatic, NULL, TRUE)
多分↑の2つ目の引数

653 名前:644 :02/05/11 16:02
レスthanks
ひょっとしてDLLにあるクラスを使うというのは一般的じゃないんですか?
インポートライブラリーを使えばできるんですが・・・。

いまいち勉強が足りないんでしてきます。

654 名前:デフォルトの名無しさん :02/05/11 16:55
WindowsにはCOMがあるからいいけど、
UNIXでC++のライブラリを使う場合は静的バインドしか
ないのかな?房&スレ違いスマソ

655 名前:デフォルトの名無しさん :02/05/11 17:02
>>654
カーネルにはモジュールとかあるけどね。

656 名前:デフォルトの名無しさん :02/05/11 17:27
以下がコンパイラやバージョンで異なるため、C++クラスライブラリは
UNIXではあんまり使いやすくない。
もちろん閉じた環境(g++2.95以外使わない等)であれば問題ないけど。

1.メソッドの引数や戻り値の型情報をそのシンボル名に埋め込む方法
2.例外の扱い
3.フリーストアの扱い
4.テンプレートの実体化の方法
5.static initializerの実行方法

COMではこういう問題は起こらないことになってる。

657 名前:デフォルトの名無しさん :02/05/11 17:46
inner-process限定だったとおもうけど、もじらの
XPCOMとか。

658 名前:デフォルトの名無しさん :02/05/11 18:21
>>656
なるほど、房に対しての親切なお答えありがとうございます。

659 名前:647-649 :02/05/11 19:22
>>651
InvalidateRect(hStatic, NULL, TRUE)の中のNULLの事です

>>652
フォローサンクスです

660 名前:デフォルトの名無しさん :02/05/11 21:04
Win32APIでLIBを作ろうと思うのですが、関数の宣言に「WINAPI」というのを
つけなければならないのでしょうか?


661 名前:デフォルトの名無しさん :02/05/11 21:06
>>660
いーえ。別に付けなくとも宜しい。WINAPI は __stdcall のことで、__stdcall の意味はヘルプで見れば出てきます。自分で判断したまい。

662 名前:デフォルトの名無しさん :02/05/11 21:07
>>661
PASCAL

663 名前:デフォルトの名無しさん :02/05/11 21:27
>>662
何が言いたいんだ?

664 名前:デフォルトの名無しさん :02/05/11 21:48
>>663
662では無いが、PASCAL形式の呼び出しルールって事だろ。


665 名前:デフォルトの名無しさん :02/05/11 21:55
#define PASCAL __stdcall
#define FAR __far
#define WINAPI FAR PASCAL



666 名前:デフォルトの名無しさん :02/05/11 22:02
MSDNの__stdcallの項目に

/Gz コンパイラ オプションを指定すると、ほかの呼び出し規約で
明示的に宣言されていないすべての関数が __stdcall になります。

とありました。
AppWizardでスタティックライブラリプロジェクトを選択したところ、
プロジェクト設定に/GZオプションが設定されていました。
ということは、この場合WINAPIを明示的に書かなくても自動的に
__stdcall=WINAPIを書いたことと同じことになるのでしょうか?

667 名前:デフォルトの名無しさん :02/05/11 22:12
なる、が、ソースだけ見たとき __stdcall/PASCAL/WINAPIが関数名についていると
一目で外向けインタフェースだとわかるし、
万が一だれかがコンパイルオプションを変更してたとしても問題が出なくなる。

書くべきところには、明示的に書いた方がいい。

668 名前:デフォルトの名無しさん :02/05/11 22:12
>>664
Win32ではPASCAL規約はなくなりました__stdcallに置き換えられます

みたいな記述がどこかにあった
したがって__stdcallが現在の呼び方なのだろう

669 名前:デフォルトの名無しさん :02/05/11 22:14
>獣の数字
CL のオプションはcase-sesitive。
/GZはデバッグ関連のオプションかと。

670 名前:デフォルトの名無しさん :02/05/11 22:15
>>668
実際PASCAL呼び出し形式とstdcall呼び出し形式は違ったはず。
WIN16時代やね。

671 名前:デフォルトの名無しさん :02/05/11 22:15
PASCAL呼び出し形式は、Win16の時の名前。
Win32ではSTDCALLと称する、という話があったような。

672 名前:デフォルトの名無しさん :02/05/11 22:16
>>667
なるほど、これですっきりしました。
>>661からの流れで、明示的に書かなくてもいいけど
書いておいたほうが良いということですね。

673 名前:デフォルトの名無しさん :02/05/11 22:18
>>669
え!/Gzと/GZは違うんですか…

674 名前:デフォルトの名無しさん :02/05/11 22:18
>>672
いや、書かないと_cdeclに。
C同志で双方のプログラマが申し合わせてるなら良いけど・・・。


675 名前:デフォルトの名無しさん :02/05/11 22:20
C++Builder 6 はご存じのように32ビットコンパイラですが、
__pascal キーワードが未だ存在しています。__stdcall とは別物です。
Pascal 言語である Delphi との互換性のためにあるのかと思いきや、
Delphi のデフォルトは fastcall です。なんじゃこりゃ。

676 名前:デフォルトの名無しさん :02/05/11 22:21
本当だ、/GZはデバッグビルド時についてるローカル変数初期化オプションだった…

677 名前:デフォルトの名無しさん :02/05/11 22:24
>>675
fastcall = PASCALじゃないの?
Win16がなぜPASCALだったのかというとそれが一番高速だった(関数側でプッシュポップ?)からとかなんとか。

678 名前:デフォルトの名無しさん :02/05/11 22:29
>>677
fastcall はレジスタ渡しです。32ビット以下のサイズの引数3つまで、レジスタに入れて渡します(残りはスタック)。MS の fastcall と Borland の fastcall は互換性がないらしく、__msfastcall というキーワードもあります。。。

679 名前:デフォルトの名無しさん :02/05/11 22:34
あのー、結局外から呼び出される関数にはWINAPIつけとけってことなんでしょうか…


680 名前:デフォルトの名無しさん :02/05/11 22:39
まあWINAPIがMSとBorlandで異なることは無いだろうしねえ・・・

681 名前:デフォルトの名無しさん :02/05/11 22:39
>>679
付けとけばとりあえず問題はない。
付けない場合は以下のような問題があるが、当てはまらない場合は付けなくても良い。

「コンパイルオプションを変えてデフォルトの呼び出し規約を変更してしまったら、そのライブラリを呼び出せない。」

682 名前:デフォルトの名無しさん :02/05/11 22:45
>>681
わかりました。つけておくことにします。
ありがとうございました。

683 名前:デフォルトの名無しさん :02/05/11 23:32
>>644
Microsoft 的正解は

 COM にする

じゃないかなぁ。

684 名前:デフォルトの名無しさん :02/05/11 23:38
>>656
COMはOSに統合されたミドルウェアだから
そこでCOMを持ち出すのはアンフェアじゃないか?

685 名前:デフォルトの名無しさん :02/05/11 23:45
KOU Kou[6];

hFile = CreateFile("Kou.dat",GENERIC_READ,0,NULL,OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL,NULL);
//読みこみを失敗したら終了
if(hFile == INVALID_HANDLE_VALUE){
 ErrorRead();
 GameExit();
}

ReadFile(hFile,&Kou,sizeof(KOU)*6,&byteCount,NULL);
CloseHandle(hFile);

ReadFileの中は,あっているんでしょうか?

686 名前:デフォルトの名無しさん :02/05/11 23:50
>>685
その場合も&いらない。

687 名前:デフォルトの名無しさん :02/05/11 23:53
> KOU Kou[6];
なら、次のどれか。
 ReadFile(hFile,&Kou,sizeof(KOU)*6,&byteCount,NULL);
 ReadFile(hFile,Kou,sizeof(KOU)*6,&byteCount,NULL);
 ReadFile(hFile,&Kou,sizeof(Kou),&byteCount,NULL);
 ReadFile(hFile,Kou,sizeof(Kou),&byteCount,NULL);

Cスレの前の方にあった
> KOU *Kou = /*なんかメモリ確保関数 */
の場合なら話は別。

688 名前:デフォルトの名無しさん :02/05/11 23:59
>>686
ありがとうです
配列ですもんね
居酒屋行って来ます

689 名前:645 :02/05/12 05:38
>>653
(DLLのC++クラスを利用する)
インポートライブラリを使えば簡単にできてしまいますね。でも…。
装飾関数名の問題(>>656さんの1と同じこと)とかLoadLibrary()で
使えなくなるとかいうことを考えると、後々になってそのDLLを
利用するときに困る*かも*しれません。
とにかく個人的にはお勧めしません。
>683に同感です。

690 名前:デフォルトの名無しさん :02/05/12 06:37
言語/処理系入り乱れを無視していいなら、普通のC関数exportして、そん中で
newしたclassのポインタ戻すって手はあるがなぁ。
まぁでもやっぱCOMだろうな。

691 名前:デフォルトの名無しさん :02/05/12 12:04
_stprintf と wsprintf
_tcscpy と lstrcpy
など、同じことをする関数だと思うのですが、何か違う働きをするのでしょうか?

692 名前:デフォルトの名無しさん :02/05/12 12:14
>>691
>_stprintf と wsprintf
取りあえずwsprintfはWindowsAPI

693 名前:デフォルトの名無しさん :02/05/12 12:18
>>692
誰もそんなこと聞いてないと思われ

694 名前:デフォルトの名無しさん :02/05/12 12:20
>>692
Linuxではswprintfか。紛らわしいな。

695 名前:デフォルトの名無しさん :02/05/12 12:22
wsprintfは浮動小数点をサポートしない
_tcscpyとlstrcpyは同じ。

ちなみにlstrncpyは末尾に必ず'0をコピーするが、
_tcsncpy/strncpy/_mbsncpyは0はコピーしない処理系もある。

書式、長さを扱う文字列処理関数の場合、
APIで指定したロケールSetThreadLocaleに従うか、
setlocale, _tsetlocaleで指定したロケールに従うかで
挙動が変る可能性がある。


696 名前:井筒監督 :02/05/12 12:22
俺はWin32API使うようにしてる。
理由?そんなもん無い。そんなもん無くたっていい。

697 名前:デフォルトの名無しさん :02/05/12 12:24
>>694
Windowsの処理系にもswprintfはある。
sprintfのwchar_t版だろ。

swprintfとwsprintfは別物


698 名前:デフォルトの名無しさん :02/05/12 12:28
ほんとだ、%fが無い。

699 名前:デフォルトの名無しさん :02/05/12 12:32
俺はC関数のほう使うようにしてる。


700 名前:デフォルトの名無しさん :02/05/12 12:33
>>698
小数点型って言語依存したような。

701 名前:デフォルトの名無しさん :02/05/12 14:17
>sprintfのwchar_t版だろ。
wsprintfWダネ

702 名前:デフォルトの名無しさん :02/05/12 14:44
swprintfとwsprintfは別物だっつーの。
つまりswprintfとwsprintfA/wsprintfWは別物なの。
知ったかぶっても恥ずかしいだけなの


703 名前:デフォルトの名無しさん :02/05/12 15:01
んでどうよ。おまえらどっち使ってんのよ。

704 名前:デフォルトの名無しさん :02/05/12 15:06
_sntprintf/_vsntprintf

705 名前:デフォルトの名無しさん :02/05/13 03:51
あるウィンドウ(A)がアクティブになったことを別なウィンドウ(B)に知らせるAPIはありますか?
(A)のメッセージをフックして(B)に通知する以外の(DLLが不要な)方法を知りたいです

706 名前:デフォルトの名無しさん :02/05/13 03:57
WM_ACTIVATE

707 名前:デフォルトの名無しさん :02/05/13 05:04
>>706
それはフックしないと読みとれないからダメなんです

708 名前:デフォルトの名無しさん :02/05/13 05:12
自分自身が非アクティブの時でもって事か?

709 名前:デフォルトの名無しさん :02/05/13 05:53
えーとつまり(A)も(B)も他のプロセスのウィンドウなのでフックしないと読めないんです
自分のプロセスだったらAPIも何もないんですが

710 名前:デフォルトの名無しさん :02/05/13 06:04
タイマー回して現在のアクティブウィンドウとAを比較
同じならBにメッセージを送る

・・・くらいしか思いつかん
他にいい方法あるんかいな

711 名前:デフォルトの名無しさん :02/05/13 06:23
自分自身がアクティブだったら、
他のウインドウがアクティブになり、自分が非アクティブになることを
WM_ACTIVATEで伝えてくれるんだが、これじゃ不足なのか?
もちろん、どのウインドウがアクティブになるのかも伝えてくれるんだが

712 名前:デフォルトの名無しさん :02/05/13 09:24
>>711
試しにコードを書けば判りますが、どのウインドウがアクティブになるのかは伝えてくれません
ともかく特定のウィンドウがアクティブじゃないと通知されないというのだと全く役に立たないんです

タイマーは回しすぎると処理が重くなりますし、回しが少ないとラグが発生してしまいます
アクティブウィンドウの変化を特定ウィンドウに知らせるようなAPIはないもんですかね

713 名前:デフォルトの名無しさん :02/05/13 09:26
>>712
フックすればいいじゃん。

714 名前:デフォルトの名無しさん :02/05/13 09:58
>>713
>>705

715 名前:デフォルトの名無しさん :02/05/13 09:59
>>714
無い以上そうするしかないんじゃ?
実力がないなら実力以上のことはしないことだ。

716 名前:デフォルトの名無しさん :02/05/13 10:33
俺は710じゃないが、コイツはシカトされたのか?
まっとうな答えだと思うが。

717 名前:716 :02/05/13 10:47
スマソ、ポインタ無しで>>712で参照されてたのか


718 名前:デフォルトの名無しさん :02/05/14 10:37
>>632
コメントの色を赤にしなさい。

719 名前:デフォルトの名無しさん :02/05/14 10:52
Win2Kで「別のユーザとして実行」でexeを動かした時の、
「別のユーザ名」を取得したいのですが、何か良いAPIを知りませんか?

...別のユーザとしてプロセスを動かしているので、ログインしたユーザとは違いますよね?
ご存知の方、よろしくお願いします。

720 名前:デフォルトの名無しさん :02/05/14 10:58
WNetGetUser( NULL, )とかGetUserName()でなんとかなりませんか

721 名前:デフォルトの名無しさん :02/05/14 11:10
「ハンドル」という概念が良くわかりません。
アドレス(ポインタ)のようなものですか?


722 名前:719 :02/05/14 11:25
>>720サソ
動かしてるEXEの中で呼ぶんだから、
GetUserName()で動かしたユーザ名が取れますね...
思い切りボケてました(^^;

723 名前:デフォルトの名無しさん :02/05/14 13:20
キタ━━(゚∀゚)━━ァ!

最近、本格的にWindowsプログラミングでGUI系のやり始めたけど・・
コンソールじゃできないことがイパーイできるじゃんかYO
アイデアがモリモリキター

724 名前:デフォルトの名無しさん :02/05/14 14:14
>>723
たとえば?


725 名前:デフォルトの名無しさん :02/05/14 15:28
...Win2Kなんですけど、
自分がどのユーザグループに所属しているのかを取得するAPIを知りませんか?



726 名前:_ :02/05/14 15:40
VBでエクスプローラのファイルリストビューの内容を取得するプログラムを作ろうとしています。
LVM_GETITEMTEXTメッセージを送るとエクスプローラがコケるんですが、何が悪いのでしょうか?
ソースはおよそ以下の通り。

LVITEM.mask = LVIF_TEXT
LVITEM.iItem = 1&
LVITEM.iSubItem = 0&
LVITEM.cchTextMax = 255&
LVITEM.pszText = String(.cchTextMax + 1&, vbNullChar)
Call SendMessage(ExplorerhWnd, LVM_GETITEMTEXT, 1&, LVITEM)  '←ここでエクスローラがコケる

どなたかご存じの方、教えて頂きたく宜しくお願い致します。

727 名前:デフォルトの名無しさん :02/05/14 16:20
何故かLoadLibrary()が0x10000000を返します。
GetLastError()で調べてみると「ハンドルが無効です」と出ました。
DllMain()ではしっかりとTRUEを返してます。
もちろんDLLもプロジェクトと同じフォルダに入っております。
この問題の原因はどういった事が真っ先に考えられますか?

728 名前:デフォルトの名無しさん ◆E12W1IlM :02/05/14 16:33
パスの区切りが\\でなく\になってるってことはない?


729 名前:デフォルトの名無しさん :02/05/14 16:51
>>725
NetUserGetLocalGroups


730 名前:727 :02/05/14 16:55
>>728
いえ、なってません。パスを間違えるとGetLastErrorは「指定されたモジュールが見つかりませんでした」と
言ってきます。ちなみにDLLの関数を一回だけ呼ぶ、というテスト的なプログラムで
妙なコードは一切無いです。DLLの方も小さい関数が3つほどあるだけなんですが・・・。

731 名前:デフォルトの名無しさん :02/05/14 16:58
LoadLibraryの戻り値の0x10000000って有効じゃないの?

732 名前:デフォルトの名無しさん :02/05/14 17:03
LoadLibraryで戻ってくるのはHINSTANCEと言うオチ

733 名前:_ :02/05/14 17:07
>>727
>>730
LoadLibraryの戻り値はモジュールのハンドルなのでそれで良いと思われ。
エラーの時は0が返るはず。

734 名前:727 :02/05/14 17:08
>>731
GetProcAddressで使うとNULLが返ってくるんです。

735 名前:デフォルトの名無しさん :02/05/14 17:10
>>734
コード出せ。おじさんがみてあげよう。

736 名前:デフォルトの名無しさん :02/05/14 17:26
ゲトProcAddrへの関数名数がちがうとか、
名前が修飾されている罠。

737 名前:727 :02/05/14 17:33
>>735 どうも、助かります。

HINSTANCE hInstDll;
void (*hoge)(char*, ...);
DWORD ec;

hInstDll = LoadLibrary("DLL\\TEST.dll");
ec = GetLastError();
hoge = (void (*)(char*, ...))GetProcAddress(hInstDll, "test_func");

//(*hoge)("テストです、押忍。");

738 名前:デフォルトの名無しさん :02/05/14 17:47
>>737
関数名の修飾はどうなってるんでしょう?

739 名前:デフォルトの名無しさん :02/05/14 17:56
Test.dllのdefファイル大丈夫?
てかdll側の問題と思われ。

740 名前:デフォルトの名無しさん :02/05/14 18:01
GetLastErrorの位置がなんかおかしいような。

741 名前:727 :02/05/14 18:40
#define EXPORT __declspec(dllexport)

#include <windows.h>
#include <stdio.h>

//お知らせ風メッセージボックスを出す。
EXPORT void test_func(char* message, ...)
{
  va_list list_ptr;
  char buf[200];

  va_start(list_ptr, message);
  vsprintf(buf, message, list_ptr);
  va_end(list_ptr);

  MessageBox(hwnd, buf, "お知らせ", MB_ICONINFORMATION);

  return;
}

TEST.DLLのtest_funcの実装と、それに必要なコードです。hwndはグローバル変数です。
ちなみにこのDLL、インポートライブラリを通してならば問題なく使えますが、これは何かのヒントになりますか?

742 名前:727 :02/05/14 18:45
>>738-739
すいません、質問の意味がよくわからないので今調べているところです。

743 名前:デフォルトの名無しさん :02/05/14 19:00
DEFファイルない?
そらエクスポートできん。

744 名前:デフォルトの名無しさん :02/05/14 19:08
dumpbin /exports dll\test.dll
の結果は?

745 名前:743 :02/05/14 19:18
スマソ
__declspec(dllexport)あるからdefファイルいらん。

746 名前:デフォルトの名無しさん :02/05/14 20:12
C++の名前修飾されてるんじゃないの?

747 名前:727 :02/05/14 21:31
修飾に関するレスが多いので色々調べてみた結果、エクスポートする関数に extern "C" を加えたらうまくいきました。
皆様、ありがとうございました。
つまり、C++の決まりに従ってDLLにある test_func() は void_test_func_char() のように飾られて
しまっているので GetProcAddress()で "test_func" を指定しても見つかりっこねえやってこったと解釈したんですが
よろしいでしょうか。

748 名前:デフォルトの名無しさん :02/05/14 21:33
>>747
コンパイラが都合の良いように名前変えちゃうのよね。

749 名前:デフォルトの名無しさん :02/05/14 21:41
>>747
その解釈であってるよ

750 名前:デフォルトの名無しさん :02/05/15 01:23
良スレな感じ。マターリ


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