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


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

Win32API【2】
501 名前: :02/02/02 06:53
ここ知ってる。他? >> 500

502 名前:デフォルトの名無しさん :02/02/02 06:58
APIヘルプ

503 名前: :02/02/02 06:59
冷たいこと言うなよ。英語でも構わん。 >> 502

504 名前:デフォルトの名無しさん :02/02/02 07:02
VC++2.0までに付いていたWin32の日本語ヘルプ


505 名前:デフォルトの名無しさん :02/02/02 07:03
>>503
Platform SDK についてくるドキュメント

HTML Help 形式だが、HTML にばらせると思われ

506 名前:499 :02/02/02 07:04
俺が欲しいのは Windows XP、Windows 2000、Windows 98など
API バイブルに載ってない API の詳しいリスト。(しかも、コード例なども)
>> 504

507 名前:デフォルトの名無しさん :02/02/02 07:07
SDKのサンプルでgrepかけて調べたらどうよ?

508 名前:デフォルトの名無しさん :02/02/02 07:08
贅沢な奴だな。ここで我慢しとけ。
http://msdn.microsoft.com/library/en-us/win32/append_4cs3.asp
http://msdn.microsoft.com/library/en-us/win32/funcrel_5f6t.asp

509 名前:499 :02/02/02 07:12
とりあえず、SDKドキュは活用してるが、コード例などが不十分だから言ってるわけ。
API バイブルは本当に出来がいい。これと同じくらいの Web 版ない。
無ければ、本とかでも紹介してくれ。 >> 507,508

510 名前:デフォルトの名無しさん :02/02/02 07:20
WinInet.DLL関係とかか?
MSDN以外は俺も知らんな。
いい本があればこっちが教えて欲しい。

511 名前:デフォルトの名無しさん :02/02/02 07:22
別のスレで質問したのですが、スレ違いっぽいんでこっちに書きます(転載スマソ

CreateThread()で作ったスレッドからCランタイムライブラリの関数呼ぶと
メモリリークが起こるんですよね?(と、MSDNライブラリに書いてある)
ではnewも出来ないのでしょうか? なんとなく中でmalloc()してそうだし。。。

# だめなら _beginthread() 使います

512 名前:デフォルトの名無しさん :02/02/02 07:25
むしろ素直に_beginthreadex()を使おうと思わなかった
理由が聞きたい

513 名前:デフォルトの名無しさん :02/02/02 07:29
Win32 APIじゃないから。。。じゃだめ?
まー気分の問題だから、まずければ_beginthread*()使うんだけど

514 名前: :02/02/02 07:29
>>511
あの…どの辺りに書いてありましたか?
プラットフォームSDKのCreateThreadの中に、Cランタイムライブラリの
関数を使うスレッドは〜を使う様にしてください。 と記述されてましたが、
リークに関する記述は見つからず…

515 名前:511 :02/02/02 07:31
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpwinpf/_win32_createthread.htm

516 名前:511 :02/02/02 07:32
>>514
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpwinpf/_win32_createthread.htm
から、引用
「C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。
この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。」

517 名前:デフォルトの名無しさん :02/02/02 07:33
リークの記述は俺も見たことないけど
プロジェクトの設定の中のC/C++の
使用するランタイムライブラリはマルチスレッドの設定にしてる?

518 名前:514 :02/02/02 07:34
有り難うございました(;´Д`)

519 名前:デフォルトの名無しさん :02/02/02 07:35
つーか、Win95APIバイブルにもbeginthred使え、って書いてあるな。

520 名前:511 :02/02/02 07:43
beginthread()系の方が良いのは分かってるんだけど、
どうも納得がいかないんです。
だって、スレッドなんてめちゃOS依存なんだから、APIでやるべき。
セマフォとかミューテックスはAPIなのに、なんでスレッドだけ
Cランタイムライブラリ(CRT)の関数使うの? なんだかなー・・
というわけでCRT抜きでやろうとしてたんだけど、よく考えたら
C++のnewがmalloc()使ってるんじゃないかと。じゃあnewも出来ないのだろうか?
誰か同じようなこと考えた人いるなら教えてアロエリーナ

521 名前:デフォルトの名無しさん :02/02/02 08:12
>>520
> なんでスレッドだけ Cランタイムライブラリ(CRT)の関数使うの?
C Runtime Library 関数が、事前に内部データが初期化されていることを前提としてる
から。シングルスレッドの場合には (w)WinMain を呼ぶ前に初期化コードが実行される
んだが、マルチスレッドだと

 スレッド単位で初期化が必要なデータ

が存在するため、CreateThread と同時に初期化処理を実行する必要がある。

> C++のnewがmalloc()使ってるんじゃないかと。
たしか malloc() はスレッド毎の初期化は不要だった気がするんだが、もし必要な場合
でも

 自前で HeapAlloc, HeapFree なんかの API を使って operator new() を実装する

で問題ないでしょ。

522 名前:デフォルトの名無しさん :02/02/02 08:13
あほか。
Cランタイムが何やってるかなんてOSが知るわけないんだから
初期化や後始末はCランタイムじゃなきゃできるわけないだろ。
_beginthreadex()だってCreateThread()を最終的に呼び出すに
決まってるだろ。
意味不明なたわごとでスレを汚すなボケ。

523 名前:511 :02/02/02 08:33
>>521
ありがとうございます。非常によく分かった。
http://support.microsoft.com/support/kb/articles/Q104/6/41.ASP
ここにも同じ事書いてあるね。

つまり静的な領域が必要な関数用に確保した70〜80バイトがリークするらしい。
例えばerrnoをセットする関数、静的バッファを返す関数(ctimeとか)などがまずいようだ。

これをみるとmalloc()は大丈夫っぽい。
動的にスレッド起動終了をしないような設計にすることでごまかすことにします。

> もし必要な場合でも
> 自前で HeapAlloc, HeapFree なんかの API を使って operator new() を実装する
> で問題ないでしょ。

やっぱ最後はそれですか。。。

524 名前:511 :02/02/02 08:36
>>522
そんなこと当たり前の前提なんだけど。

525 名前:デフォルトの名無しさん :02/02/02 08:55
>>524
分かってるくせに意味不明な質問をする荒らしということですね。
とっとと消えろ。

526 名前:デフォルトの名無しさん :02/02/02 08:57
> これをみるとmalloc()は大丈夫っぽい。

マルチスレッドライブラリのほとんどの関数は再入を防ぐために
使うクリティカルセクションの初期化が必要だと思うが。
正直>>522を当たり前の前提だとほざいておきながら
_beginthreadex()の何をそこまで嫌がるのかさっぱりだね。
勝手にメモリリークでも競合条件によるデータ破壊にでも悩んでろ。

527 名前:デフォルトの名無しさん :02/02/02 09:02
>>526
クリティカルセクションはスレッド間で共有するから、CRT のスタートアップルーチンで
初期化してると思う。

> _beginthreadex()の何をそこまで嫌がるのかさっぱりだね。
まったくもって謎ですな。

528 名前:デフォルトの名無しさん :02/02/02 09:06
CRTのソース見れば_beginthreadex()やDLL_THREAD_ATTACH
で何してるかくらいわかるだろ。
それ見て自分で判断しろよ。こんなところまでわざわざ聞きに
来てるのは何か問題が起きたときの責任転嫁でもしたいからか?

529 名前:511 :02/02/02 09:19
>>526 & >>527
524は確かにこっちが悪かった。調べていくうちに分かったことなのに
煽り口調で書かれたので(522)、ついやっちゃった。すいません

> マルチスレッドライブラリのほとんどの関数は再入を防ぐために
> 使うクリティカルセクションの初期化が必要だと思うが。
何故クリティカルセクションが必要なのか分からない。
ここでいうマルチスレッドライブラリが何指してるのかわからんのだけど、
文脈から言ってCRTだよね?

> 競合条件によるデータ破壊
これはどういう場合に起こるのか考えつかない。
複雑な場合を考えれば2次的なものとしては考えつくけど、直接的には?
まさかロックし忘れの話じゃないよね?

_beginthreadex()が嫌な理由はもうすでに書いた。

http://www.microsoft.com/msj/0799/win32/win32textfigs.htm

530 名前:511 :02/02/02 09:30
>>528
Borland C++ Compiler とMSDNライブラリでやってるから
CRTのソースがない。

531 名前:デフォルトの名無しさん :02/02/02 09:48
>>529
> 何故クリティカルセクションが必要なのか分からない。
……マジ?

532 名前:511 :02/02/02 09:51
>>531
。。。マジ
教えて君で悪いけど。。。

533 名前:デフォルトの名無しさん :02/02/02 09:53
とりあえず527に同意なので、まぁどうでもいいが…

>>529
マルチスレッド版って、中でそれなりに排他処理してるからマルチスレッド版なのだが。
MutexかCriticalSectionだかは内部で必要に決まっておろう。
MT対応のランタイムライブラリ呼ぶときも全部自前でロックする気なのかキミは?

534 名前:511 :02/02/02 09:53
CRTのマルチスレッドライブラリの話だよね? >>531

535 名前:511 :02/02/02 09:58
>>533
CRTって単なるAPIのラッパーだよね?
だったらスレッドごとにCRT用の静的なデータ領域持っておけば
いいだけのような気がするんだけど。


536 名前:デフォルトの名無しさん :02/02/02 10:03
>>532
たとえば malloc() あたりの関数を考えて欲しいんだが、Win32 だと大抵

1. 大きなメモリサイズを要求されたら HeapAlloc() API に投げる
2. 小さなメモリサイズの場合には、一定サイズを HelpAlloc() で確保しておいて、
 それを細分して malloc() してきた関数に渡す

という実装になってる(全部 HeapAlloc() 丸投げだとパフォーマンスも、メモリ利用
効率も落ちるから)。

これを実現するためには malloc() はどこかに

 HeapAlloc() でとってきたメモリの塊
 そのうち、クライアントに渡してあるもの

なんかを記録しておく必要があるわけだが、このデータを複数のスレッドが同時に
触ったら、滅茶苦茶になってしまうでしょ?

537 名前:511 :02/02/02 10:14
>>536
よく分かりました、ありがとう。僕が間違ってました。

例として出したものに対して聞くのは悪い気がするんだけど、
HeapCreate()が重い処理をやっているだけで、
HeapAlloc()の方は大したことやってない気がする。
malloc()の実装と同じじゃないんだろうか?
カーネル呼び出しのオーバーヘッドより処理の無駄の方が。。。
つまり何が言いたいかというと、malloc()はHeapAlloc()をラップするだけで
いいのでは?

# お門違いなら無視してくださっても結構です。

538 名前:デフォルトの名無しさん :02/02/02 10:25
>>537
実際に HeapAlloc/HeapFree と malloc/free を100万回ずつ呼んで
試してみると分かると思う。全然速度が違うよ。

539 名前:デフォルトの名無しさん :02/02/02 10:42
>>537
関数呼び出しと、カーネル呼び出しを比較すると、一桁ぐらいは実行時間に差が出る
のが一般的(詳細はプロセッサアーキテクチャや OS の実装によるけど)。単にカー
ネルモードに切り替えるだけでも

 特権モードへの遷移+割り込みレベルを上げる
 割り込み/トラップフレームの作成
 ユーザモードのレジスタの退避、カーネルモードレジスタの読み込み
 割り込み内容のディスパッチ
 割り込みレベルを下げる

などなど準備がいろいろ必要になる上、セキュリティ上の要請から、カーネルモード
ではユーザの渡してきたデータを細かく検証する必要があるから、どうしても処理は
複雑になる。

想像であれこれ言う前に、少し勉強した方が効率がいいと思うぞ。Tanenbaum 先生
の OS 本とかヘネシー&パターソン本、Lion's Commentary on UNIX あたりを読ん
でみ。(質問してることを見る限り、おそらく、楽しんで読めると思うし)

540 名前:デフォルトの名無しさん :02/02/02 10:49
HeapAllocそのものもある程度の塊を取ってきて、其の中でやりくりしてるんじゃなかったっけ。
まあ実際に効率悪いのなら其の通りなんだろうけど。

541 名前:539 :02/02/02 10:52
>>540
Win32 API は、UNIX でいうところのシステムコール(カーネルモードへのエントリ
ポイント)では *ない* んだよね。実際のシステムコール相当のコードは、Win NT
系列なら大半は ntdll.dll に入ってる。

kernel32.dll は ntdll.dll を使う、高次のライブラリって感じ。

542 名前:511 :02/02/02 10:55
実際やってみました。いろいろ適当なプログラムですが

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

const int COUNT = 1000;
int main()
{
  HANDLE hHeap = GetProcessHeap();
  char* buff;
  unsigned int start, heap1 = 0, heap2 = 0, crt = 0;
  int i, j;
  
  for (j = 0; j < 100000; j++) {
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = HeapAlloc(hHeap, 0, 100);
      HeapFree(hHeap, 0, buff);
    }
    heap1 += timeGetTime() - start;
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 100);
      HeapFree(hHeap, HEAP_NO_SERIALIZE, buff);
    }
    heap2 += timeGetTime() - start;
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = malloc(100);
      free(buff);
    }
    crt += timeGetTime() - start;
  }
  printf(" heap1: %d\n heap2: %d\n crt: %d\n", heap1, heap2, crt);
  return 0;
}

結果:
heap1: 27816
heap2: 29181
crt: 14736

結局malloc()よりHeapAlloc()の方が約1.9倍遅かったです。
謎なのはHEAP_NO_SERIALIZEをつけた方が遅いって事なんですが。。。ううむ

543 名前:デフォルトの名無しさん :02/02/02 10:56
>539
分かりやすい!サンクス

544 名前:511 :02/02/02 10:58
環境: Pentium3 1GHz メモリ512MB
コンパイラ: Borland C++ Compiler 5.5.1

545 名前:511 :02/02/02 11:28
>>539
http://www.yfcbookshelf.com/operatingsystem's%20books1.htm
この本よね。著者の名前だけ憶えてました。
実は専門はこっちなんで、買って読んでみます。ありがとう

# 表紙がなんだかちょっとアレだ

546 名前:デフォルトの名無しさん :02/02/02 15:38
スレッドを使って何かflagがonになっているか待たせたいのですが、
プライオリティを下げても、cpu使用率が100%になってしまいます。
どうすればcpu使用率を下げたまま、そのようなスレッドを動作させることが
できるのでしょうか。


547 名前:デフォルトの名無しさん :02/02/02 15:50
>>546
Sleep(0) 入れるか、
フラグをイベントかミューテックに変えて
WaitoForSingleObject() で待つようにしろ。

548 名前:547 :02/02/02 15:51
むーん、sageてしまった

549 名前:デフォルトの名無しさん :02/02/02 17:26
setthreadpriority()じゃないの?

550 名前:546 :02/02/02 18:29
>>547
なるほど。ありがとうございます。okでした。

>>549
それはやってみたのですが駄目だたーのです。

551 名前:デフォルトの名無しさん :02/02/02 18:33
質問があるのですが、
m_Button = ::CreateWindow("BUTTON", ...);
でボタンとかを作ったときに、そのボタンからのメッセージを受け取りたいときは
どうすればよいのでしょうか。(ちなみに、リソースファイルを使わないということで考えています。)

552 名前:デフォルトの名無しさん :02/02/02 18:39
MFC?APIならButtonからのメッセージは親のWindowProcにWM_NOTIFY
として送られるよ。

553 名前:デフォルトの名無しさん :02/02/02 19:45
1000レコードが格納されたリザルトセットが
存在するとして、そのリザルトセットの
内容をそのまま、コレクションオブジェクトに再格納します。
その場合、元となったリザルトセットと1000レコードが格納されたコレクションは
どちらが、メモリを多く消費しているのでしょうか?
リザルトセットは、内部にヴァリアントを多く抱えているので、
メモリ消費量が大きいような気がしますが。
このような、メモリ使用量を測定するようなAPIもしくは方法を探しています。
DBから取得したレコードはやはりコレクションに格納したほうがいいのでしょうか?
リザルトセットのままでもいいような気がするのですが。
1000レコード中か目標の1レコードを取得するのにかかる
時間は、やっぱりコレクションのほうが早いのでしょうか?
また、コレクションは、JAVAのようにインデックスに
ハッシュテーブルを作成しているのですか?

色々聞いてしまって申し訳ありません。

554 名前:デフォルトの名無しさん :02/02/02 20:07
>>552
ありがとうございます。やってみます。何かあったらまた質問させてください。

555 名前:511 :02/02/03 02:13
>>542
32ビットマルチスレッドターゲットのオプション忘れてた。。。鬱

●マルチスレッドのオプション(-tWM)無し
・HeapAlloc(シリアライズ版)……27661
・HeapAlloc(シリアライズ無し版)……28458
・malloc……15343
# 断然mallocが速い

●オプションあり
・HeapAlloc(シリアライズ版)……27574
・HeapAlloc(シリアライズ無し版)……27698
・malloc……26175
# mallocが少し速い

>>536氏の言うとおり、
1, mallocのヒープ管理はプロセス単位
2, マルチスレッドの場合、クリティカルセクションが必要になるので
 その分オーバーヘッド

BorlandとMicrosoftのCランタイムライブラリはやっぱ違うのかな
Visual C++だとどうなんでしょう?

他にもmemcpyとCopyMemoryも速度差がありました
# 100バイト以下ならforループでコピーした方が高速でした

CRTのソースは公開されてないんだろうか…

556 名前:デフォルトの名無しさん :02/02/03 02:59
> CRTのソースは公開されてないんだろうか…

ネタですか? だからもう消えろ。

557 名前:511 :02/02/03 03:10
>>556
ネタじゃなくて本当に教えて欲しいんだけど

558 名前:デフォルトの名無しさん :02/02/03 04:57
>>557
インストールCDでも検索しろ
とっとと回線切って首吊って氏ね

559 名前:511 :02/02/03 05:16
>>558
Visual C++ ないってば

560 名前:デフォルトの名無しさん :02/02/03 07:28
>>557
公開されてるって言ってるだろうが
お前が入手できるかどうかなど知ったことではない

561 名前:デフォルトの名無しさん :02/02/03 07:48
>560
オマエ、つまんねーヤツだな(藁

562 名前:デフォルトの名無しさん :02/02/03 09:26
APIの話に戻すことキボン

563 名前:デフォルトの名無しさん :02/02/03 09:54
NTbackupには使用中のファイルをバックアップする機能がありますが
どうやって実現してるのでしょうか?
Microsoftお得意の非公開APIですか?

564 名前:デフォルトの名無しさん :02/02/03 10:27
>>555
> # 100バイト以下ならforループでコピーした方が高速でした
キャッシュに入ってる場合は repeat prefix を使って stosd で回すのが最速だと
思うけど。

それはともかく
> CRTのソースは公開されてないんだろうか…
VC6 あたりなら、製品を買うと大半はついてくる。

565 名前:511 :02/02/03 11:37
>>564
movsdでは?
ちなみにglibcの方はアーキテクチャごとにアセンブリ言語で
実装されてました。

MSDNライブラリにも無いみたいなんで、VC++買うしか無いみたいですね。
どうもありがとうございました


566 名前:デフォルトの名無しさん :02/02/03 12:36
>>564-565
FPU 使えば 8bytes 単位だかでコピーできたはず…
速いかは知らないけど



567 名前:デフォルトの名無しさん :02/02/03 16:33
質問しようと思ったら >>511 が既に質問していて、しかも叩かれていてくれた。
漏れも Borland C++ 5 で頑張ってる。お互い頑張ろうな。

568 名前:デフォルトの名無しさん :02/02/04 11:13
>>552
>APIならButtonからのメッセージは親のWindowProcにWM_NOTIFY

WM_COMMAND

569 名前:デフォルトの名無しさん :02/02/05 03:15
グローバル変数バリバリの汚い描画ルーチン(C言語)を
DLL化して動的に呼び出すとします。

描画は、psetやline、色設定などを連続的にコマンドを与えて実行する
タイプです。
そのときに、複数のプレーン(DCなど)で同時にこの描画ルーチンを
「独立して」呼び出したいばあいどうすればよいですか?

問題はグローバル変数を用いているので、変数がごっちゃになるということです。
別にライブラリはDLLでなくてもよいのですが、なにかよい
解決方法があれば教えてください。



570 名前:デフォルトの名無しさん :02/02/05 07:57
>>569 とりあえず 
グローバル変数を全部ひとつの構造体に入れて psetとかの関数の第一引数に構造体ポインタを渡す
のが一番簡単かと


571 名前:デフォルトの名無しさん :02/02/05 07:59
まさか、使いたいDC毎に DLLの別名をコピーして使うとか考える? >>569

572 名前:電波じゃが? :02/02/05 23:32
xpはやっぱりwin64APIといっていいの?

スレ違いだと怒らんでくれ。
ネタだと罵らんでくれ。
頭は多少dどるが。


573 名前:デフォルトの名無しさん :02/02/05 23:33
ほんとにdどるな。

574 名前:569 :02/02/06 02:25
なるほど、やっぱ手を加えないと無理ですね。

必要なDC分だけDLLをコピーして使うようなソフトなんて逝ってよしですよね。





575 名前:デフォルトの名無しさん :02/02/06 13:17
MessageBox(NULL, _T("日本語"), _T("日本語"), MB_OK);
これを日本語非対応のWindows 上で実行したときの挙動について
教えてください。

576 名前:デフォルトの名無しさん :02/02/06 16:28
文字化けする。

577 名前:デフォルトの名無しさん :02/02/06 17:22
>575
UNICODEが定義してあるという罠

578 名前:デフォルトの名無しさん :02/02/06 18:29
_beginthread 使おうと思ったらヘッダで
#ifndef __MT__ で囲われてたんですけど、この __MT__ は勝手に define しちゃっていいんでしょうか?
「定義する時は **.h の前でしなければいけない」とか
「__MT__ は **.h で定義されてるので、それを include せよ」
とかいうのはあるのでしょうか?


579 名前:578 :02/02/06 18:31
誤: #ifndef __MT__
正: #ifdef __MT__

580 名前:デフォルトの名無しさん :02/02/06 18:37
VC++か?
なら、/MT /MTd /MD /MDdあたりのコンパイルオプションを
指定すれば自動的に定義されるはず。

581 名前:578 :02/02/06 18:45
>>580
Borland C++ で、コマンドラインから make 使ってるのです。
BCC でもそういうのあるのでしょうか?

582 名前:デフォルトの名無しさん :02/02/06 18:52
-WM でどーよ?

583 名前:578 :02/02/06 19:01
>>582
-WM でうまくいきました。ありがとうございます。
ところで、コマンドラインから bcc32 って打ってもそんなコンパイルオプション
出てこなかったのですが、どこかにそういう情報ってあるんでしょうか?

584 名前:デフォルトの名無しさん :02/02/06 19:37
>>583
ヘルプファイルに書いてある。

585 名前:デフォルトの名無しさん :02/02/06 21:48
>>575
Unicodeでない場合・・・文字化け
Unicodeの場合・・・日本語フォントがあれば出る、なければ出ない

586 名前:デフォルトの名無しさん :02/02/06 23:19
>>585
Unicodeの場合もシステムフォントが日本語文字を持ってないから文字化け


587 名前:585 :02/02/07 01:47
2000だと勝手にフォント選んでくれない?

588 名前:デフォルトの名無しさん :02/02/07 03:15
>587
システムに日本語がインストールされてないと表示されないはず。
地域のオプションとかで指定する奴ね。

日本語環境でも韓国語とか表示できないのと一緒かと。

589 名前:585 :02/02/07 07:18
うちはインストールしてあるからハングル出る。ハングルファイル名もおっけー。
だからきっと英語Windowsでも日本語出るに違いない。

590 名前:デフォルトの名無しさん :02/02/07 10:12
つーか文字列リテラルに日本語埋め込んだりしないでLoadStringしろよ。

591 名前:デフォルトの名無しさん :02/02/07 16:05
画像を背景と重ね合わせる時に、どうやってマスクfahおえあ;:びー

592 名前:デフォルトの名無しさん :02/02/07 16:06
リストビューの特定アイテムを選択状態にさせる術ってあるんでしょか?
他のタイプのSETCURSELの様な…
ListView_*のそれらしき物かたっぱしから試してみましたが、
全く選択状態になってくれません。

593 名前:デフォルトの名無しさん :02/02/07 16:14
>592
ListView_SetItemState で LVIS_SELECTED ビットを立てる。

594 名前:デフォルトの名無しさん :02/02/07 16:32
あのう、教えて欲しい事があります。

595 名前:デフォルトの名無しさん :02/02/07 17:07
>594
それはビルゲイツの陰謀ですね :)
マイクロソフトにジェット機で突っ込めば、解決します。

596 名前:デフォルトの名無しさん :02/02/07 18:06
고맙습니다

597 名前:592 :02/02/08 00:11
>>593
それが、いくら試しても駄目なんですよ…
ListView_SetItemState(hList, n, LVIS_SELECTED, 0);
で宜しいんですよね…

598 名前:デフォルトの名無しさん :02/02/08 00:54
>597
惜しい。LVIS_SELECTED, LVIS_SELECTED が正解。
なんでそうなるのかはサンプルとか見ながら考えてみてくれ。

599 名前:592 :02/02/08 01:01
失敬、、、最後はmaskだから、必要無い場合も
立てなければ有効にならないんですね。

600 名前:デフォルトの名無しさん :02/02/08 02:58
OwnerDrawしたCheckBoxのWindowハンドルを得るには
どうしたら良いんでしょうか?

CheckBoxに対して
SendMessage(WHND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)


uMsgにBM_SETCHECKを、wParamにBST_CHECKED/BST_UNCHECKEDで
チェック状態の変更が出来ることまではわかったのですが
肝心のWindowハンドルを得る方法がわかりません。


601 名前:デフォルトの名無しさん :02/02/08 09:26
SendDlgItemMessageとか、ハンドル欲しいならGetDlgItemとか

602 名前:デフォルトの名無しさん :02/02/10 10:55
コマンドラインで渡された文字列を解析するAPIの様な物はありますでしょうか?
ダブルクォーテーションの対処がしんど過ぎます。

603 名前:デフォルトの名無しさん :02/02/10 11:21
>>602
CommandLineToArgvW() というのはあるが、Unicode版専用。

604 名前:デフォルトの名無しさん :02/02/10 11:24
CommandLineToArgvW()ってのがあるけどなんでWしかないんだろうなぁ。
NTでしか使えないみたいだし。

605 名前:デフォルトの名無しさん :02/02/10 11:27
POSIX用じゃねーの?

606 名前:602 :02/02/10 11:35
あぁ。。まさしく求めてる物です。。。 >CommandLineToArgv
しかしワイド文字専用なんですね(;´Д`)

想定してるコマンドラインは、ファイルのD&D、手動での-n等の
オプションなのですが、一般的に、 "があったら何も考えずに
次の"迄飛ばして宜しいのでしょうか?

607 名前:デフォルトの名無しさん :02/02/10 17:38
CheckDlgButton()
CheckRadioButton()
もあるYO

608 名前:デフォルトの名無しさん :02/02/10 18:31
>602
なぜCRTのソースコードから取ってこないんだろう?

609 名前:デフォルトの名無しさん :02/02/10 22:25
CRTのコマンドライン解析だと
 「hoge.exe "c:\windows\" /a」
とかした場合、
 argv[1] → c:\windows" /a
となって鬱になったことがある。

610 名前:デフォルトの名無しさん :02/02/12 00:57
VisualBasicでMIDIを操作しようと思い、mciSendStringを使ってみました。
基本的な再生・停止はできたのですが、
MIDIの演奏位置を指定して途中から演奏したり、現在の演奏位置を取得したり、
ということはこのAPIは出来ないのでしょうか?
( Webでも調べてみたのですが、
  どこもループ処理の仕方までしか載ってませんでした。)

・・・または、そもそも使うAPIが違うのでしょうか?

611 名前:( _ 。。) _ バタ。 :02/02/12 01:19
>>610
時間単位を予め set time format <FORMAT> で設定しておき

seek コマンドを発行してやれば途中から再生できます。
現在位置は status position で取得できますよ。

詳細はやはり、MAGURO-ONLINE で(^^;
(VCですがコマンド部分は共通のハズです…たぶん)
http://www2s.biglobe.ne.jp/~maekawa/dev/vc/mci/



612 名前:610 :02/02/12 02:42
>>611さん
教えてもらった通りやってみたら、
演奏位置の取得と、途中からの再生できました!
にしても、戻り値のバッファサイズとかも気にしないと
取得もちゃんとできないんですね。き、きびしい・・・
詳しいページまで紹介して頂いて、ありがとうございます。

613 名前:デフォルトの名無しさん :02/02/12 20:20
Win32 APIを勉強中なんですが
CreateWindow()とDrawFrameControl()のどちらでも
ボタンやチェックボックスが作成できるようなんですが、
これらの違いって何なのでしょうか?


614 名前:デフォルトの名無しさん :02/02/12 20:34
>613
DrawFrameControlはチェックボックスそっくりの絵を描くだけ。

615 名前:613 :02/02/12 21:18
>>614

がーん。。。。
DrawFrameControl()で描画したチェックボックスを
操作する方法を必死に探していた自分って。。。。。

CreateWindow()で頑張ります。
情報どもでした


616 名前:デフォルトの名無しさん :02/02/12 23:32
質問です。
IME の編集バッファっていじれるんでしょうか?
ImmSetCompositionString() に SCS_SETSTR で書き込めば
一応バッファに文字を追加できました。
しかし、バッファ内の特定の文字を削除したり
カーソルの位置を移動したりする方法が見つかりません。

とりあえず、
ImmGetCompositionString() に GCS_CURSORPOS を渡せば
編集バッファ内のカーソルの位置は分かります。
ImmNotifyIME() に NI_COMPOSITIONSTR と CPS_CANCEL を渡せば
編集中のバッファを空に出来ます。
これらとあわせて keybd_event() で VK_〜 を送れば
それらしいことは出来るのですが
非常に泥臭いコーディングになってしまいます。

SetWindowsHookEx() で WH_KEYBOAR フックして
キーの入れ換えをするプログラムで使うため
なるべく上記の方法は避けたいのです。
IME の編集バッファを直接操作する
またはシステムの keyproc を通さずに
IME に直接 VK_〜 を食わせることは出来ないものでしょうか?


617 名前:デフォルトの名無しさん :02/02/13 11:18
GUIでCMD.exeにコマンドラインを渡し(CMD.exeは非表示)、
そのログをViewに表示させたいのですが、
この場合CreateProcess()とsystem()、(または別の関数?)
のどちらを使うと良いでしょうか?
ちなみにFTPとかTelnetなどを呼び出したいのです。

618 名前:日下部圭子 ◆Z/ID97yU :02/02/13 11:32
>>617
ログ?
標準出力のことでしょうか?

619 名前:デフォルトの名無しさん :02/02/13 11:41
Win32API的には、CreateProcessしかない。
でもsystemがつかえるというなら、ふつーpipe。

620 名前:617 :02/02/13 13:20
そです。標準出力です。
CMD.exeなどの標準出力をViewに表示したいんです。
CreateProcess()で呼び出したCMD.exeにパイプを介して、
出力をViewに表示するということは可能ですか?

標準入力はスクリプトファイルからの読み込みを想定しているのですが、
いまはサンプルとして、
CreateProcess()/CMD.exe生成→コマンド読み込み→
WriteFile()/パイプに書き込み→ReadFile()/パイプから読み込み→
Viewに書き込み
という具合で書いているのですが、パイプからReadFile()で
読み込もうとするとデッドロックしてしまうんです。

621 名前:デフォルトの名無しさん :02/02/13 13:39
>>620
スレッド使え。

622 名前:デフォルトの名無しさん :02/02/13 13:54
>>616
IMEの編集バッファって
コンポジションウインドウのことかな?
IMEってコンポジションウインドウ展開時は
WM_KEYDOWMイベントを自分で受けて
コンポジションウインドウにイベント内容展開
しているんじゃなかったけ?
コンポジションウインドウ展開時なら
左右キーでカーソル動かせるし、
DELやバックスペースで任意の文字もけせるよ。
それじゃあかんの?

623 名前:デフォルトの名無しさん :02/02/13 13:58
パイプからのreadfileの読み込みでは
確か、peeknamedpipe使って確認してから
やらないとデッドロックが起きる問題があたーよ

624 名前:617 :02/02/13 13:59
>>621
スレッド使えとは??

625 名前:デフォルトの名無しさん :02/02/13 14:10
>>621
別プロセスやっちゅーに。

626 名前:デフォルトの名無しさん :02/02/13 14:41
>>625
読み込む部分を表示と別スレッドにしてしろ、って話じゃないのか?

627 名前:617 :02/02/13 15:26
>>623
デッドロックが起きる問題はpeeknamedpipeを使ってみたところ、
読み込む内容がカラッポだったからみたいでした。
どもです。

だけど、なんで返ってこないかは??なので考え直してみます。
ちなみにパイプに書き込むのと、パイプから読み込む部分は
WriteToPipe()
{
ReadFile(); // ファイルから読み込み
WriteFile(); // パイプに書き込み
}

ReadFromPipe()
{
ReadFile(); // パイプから読み込み
WriteFile(); // Viewに出力したいがとりあえず、ファイルに書き込み
}
としていました。

628 名前:デフォルトの名無しさん :02/02/13 17:00
バッファされてるのかな?

629 名前:616 :02/02/13 21:40
>>622
そうですコンポジションウィンドウに表示されてる文字です。
おっしゃる通り、コンポジションウィンドウは
カーソルや BS、DEL を勝手に受け取ってくれます。
しかし今回はそうではなくその操作をソフト側から制御してやりたいのです。
実を言いますと現在キーのマッピングを変更するソフトを書いておりまして
携帯みたいにキーを連打すると文字が a=>b=>A=>B=>a のように
変わって行くキーを作らなければならなくなってしまいました。

hook した KeybordProc() 内で
keybd_event() に VK_BACK を与えて
ImmSetCompositionString() で SCS_SETSTR 渡せば
上記の動作が出来そうなものなのですが、
keybd_event() で送ったキーイベントの処理が
KeybordProc() から抜けた後になってしまうので
SCS_SETSTR を VK_BACK で消してしまうと言うなんとも間抜けな結果に。

グローバルにフラグ持っておいて一旦 KeybordProc() を終了した後
自分で送った VK_BACK を拾った時点で
SCS_SETSTR するとか泥臭くやってしまえば出来そうなので
既に半分くらいは解決してるのですが。
もっとスマートに(keybd_event()なんぞを通さずに)
コンポジションウィンドウの内容を直接操作する方法はないものでしょうか?

630 名前:デフォルトの名無しさん :02/02/13 22:45
ん?でうまくいったの?
あれだよあれ、こーやんの。
PeekNamedPipe ( hStdOutRd, NULL, 0, NULL,
&dwBytesRead, NULL );
if(dwBytesRead)ReadFile......;

631 名前:616 :02/02/13 22:59
半分自己完結しました

泥臭くなりつつも
VK_LEFT VK_BACK VK_RIGHT SCS_SETSTR
の順番で文字叩き込んだ後
イベント3回捨てることで結果だけはゲットしました。
はふ。

632 名前:デフォルトの名無しさん :02/02/14 01:20
Windows95 APIバイブルにバグ!?

第1巻のp.549で、DIBのピクセルデータのサイズを計算している部分で
nBytes = ALIGNLONG((WIDTH * COLORBITS)/8) * HEIGHT;
つー、個所があるが、これってWIDTH=1だったら、0バイトにならない?
サンプルではWIDTH=50のCOLORBITS=4だから問題はないのだが・・・。

これを信じて組み込んでたら、たまーにエラーで落ちるので変だと
思って調べたら・・・くそ。まぁ、それだけです。
#define ALIGNLONG(i) ((i+3)/4*4)

633 名前:デフォルトの名無しさん :02/02/14 06:35
キャレットを所有するウインドウを取得するにはどうしたら良いですか?
 ・GetForegroundWindow()
 ・GetFocus()
 ・入力状態を ForegroundWindowにアタッチしてから GetFocus()
いづれも駄目でした(´Д`;

634 名前:617 :02/02/14 10:54
パイプに関する処理の手順がいまいち理解不足もあり、
GetStdHandle,CreatePipe,SetStdHandleに使われるハンドルが
多すぎて頭がごちゃごちゃになってしまっています。
どこか詳しく解説してあるサイトはないでしょうか?
ちなみに、猫は難しすぎてサッパリでした。

635 名前:デフォルトの名無しさん :02/02/14 11:09
習うより慣れろ

636 名前:デフォルトの名無しさん :02/02/14 11:28
>>633
GetForegroundWindow -> GetWindowThreadProcessId ->
GetGUIThreadInfo
でできるかな? (未確認)


637 名前:デフォルトの名無しさん :02/02/14 14:44
>634
確かにねぇ。
どーすんだろね。パイプの実態がつかみにくいよね。
えーっと、パイプは、2つのパイプがついたファイル(入れ物)
だって思っていいはずなんだけど、その線で分かりやすい
説明さがしてみれば?ちなみに普通のファイルは2つのパイプ
なんていう丁寧なものはついてない、という感じで・・・・




638 名前:デフォルトの名無しさん :02/02/14 14:48
≠633
ウィンドウハンドルに関わらず
キャレットのところに直接文字を書き込んだりすることは
できるかな?

639 名前:617 :02/02/14 18:02
パイプについてはいろんなサイトを見てなんとなくわかったんですが、
今だにパイプからReadFileで読み取れていないので、お聞きします。

やりたいことは、子プロセスにコマンドを渡し、処理結果を受け取る。
ということを、CreateProcessで呼び出した子プロセスに、
パイプを介して書き込み→読み込み→表示を繰り返し行うことです。

現在はプロセス間通信用クラスを作り、
そのコンストラクタでパイプの作成や子プロセスの生成を行う。
次にWriteToPipe(CString strBuf)という関数内でstrBufをパイプに書き込み(WriteFile)、
ReadFromPipe(CString& strBuf)でパイプから読み込んだ文字列をstrBufに書き込む。
ということを、ボタンハンドラで呼ばれるView内の関数から、
WriteToPipe()、ReadFromPipe()にアクセスして、Viewに表示する。
というふうにしています。
このプロセス間通信用のクラスのオブジェクトをCUIから生成した場合は、
問題なく表示可能なのですが、GUIからだとReadFileで読み込む文字列が空になる
原因がさっぱりわかりません。
問題点、またはもっとうまいやり方はないでしょうか?

640 名前:617 :02/02/14 18:03
パイプについてはいろんなサイトを見てなんとなくわかったんですが、
今だにパイプからReadFileで読み取れていないので、お聞きします。

やりたいことは、子プロセスにコマンドを渡し、処理結果を受け取る。
ということを、CreateProcessで呼び出した子プロセスに、
パイプを介して書き込み→読み込み→表示を繰り返し行うことです。

現在はプロセス間通信用クラスを作り、
そのコンストラクタでパイプの作成や子プロセスの生成を行う。
次にWriteToPipe(CString strBuf)という関数内でstrBufをパイプに書き込み(WriteFile)、
ReadFromPipe(CString& strBuf)でパイプから読み込んだ文字列をstrBufに書き込む。
ということを、ボタンハンドラで呼ばれるView内の関数から、
WriteToPipe()、ReadFromPipe()にアクセスして、Viewに表示する。
というふうにしています。
このプロセス間通信用のクラスのオブジェクトをCUIから生成した場合は、
問題なく表示可能なのですが、GUIからだとReadFileで読み込む文字列が空になる
原因がさっぱりわかりません。
問題点、またはもっとうまいやり方はないでしょうか?

641 名前:デフォルトの名無しさん :02/02/14 18:30
まず日本語をしゃべれ。

642 名前:617 :02/02/14 19:12
あら?やっぱり伝わらないか・・・
けど、なんとか自己解決しました。
原因は、SetStdHandleで標準入出力を設定してたからで、
STARTUPINFO構造体中の対応する場所に,ハンドルを設定してやったらできました。
おさわがせしました。

643 名前:デフォルトの名無しさん :02/02/15 09:02
レジストリについて教えてください。

レジストリのアクセス権をプログラムの中で変更したいのですが、方法がよくわかりません。
ACL関係のAPIを使うのだと思うのですが、どうやってレジストリのアクセス権を変更したらよいのでしょうか?
よろしくお願いします。

644 名前:デフォルトの名無しさん :02/02/15 14:10
RegSetKeySecurity

645 名前:デフォルトの名無しさん :02/02/15 14:14
どうすればダイアログバーから読み込んだ変数(CMainFrameのメンバ変数)を、
CMyDocに格納できますか?

646 名前:デフォルトの名無しさん :02/02/15 14:27
>>645
せっかくだから俺はCMyDocにメンバ変数を用意してそこにぶちこむぜ。

647 名前:645 :02/02/15 15:45
いや、だからそれができないんですけど・・・
CMainFrameでGetDocument用意して、
pDoc->m_strDoc = m_strMainFrame;
ってのができないんですよ。

648 名前:デフォルトの名無しさん :02/02/15 15:48
GetActiveView->GetDocumentか?

649 名前:デフォルトの名無しさん :02/02/15 16:32
GetActiveDocumentではないのかと。

650 名前:645 :02/02/15 18:34
>>648,649
ありがとございます。
GetActiveDocumentででけましたです。

651 名前:デフォルトの名無しさん :02/02/15 18:56
COLOR_SCROLLBARで得られる色って、スクロールバーの
どの部分の色なんですか。

652 名前:デフォルトの名無しさん :02/02/15 19:09
スクロールバーの軸の色。

653 名前:デフォルトの名無しさん :02/02/15 19:09
>651
スクロールバーのシャフトの部分だね。

654 名前:651 :02/02/15 19:27
SetSysColors()でCOLOR_SCROLLBARのRGB値を変えてみても
何も変化しません。win2000での話ですが。

655 名前:デフォルトの名無しさん :02/02/15 22:44
日付の引き算をしてくれるAPI関数ってないですかね?

SYSTEMTIME st1; // 2002/02/15とか
SYSTEMTIME st2; // 2200/10/07とか

// st1からst2までの期間を計算する。
GetRemainTime(st2, st1);

みたいな。
200年後とかなので、自作すると閏年の計算間違えそうで不安です。
安直なものがあれば流用しようかと。


656 名前:デフォルトの名無しさん :02/02/15 23:49
>>655
FILETIMEに変換してから引き算する
とか考えたけど、FILETIMEって200年先まで表せたかなあ。

657 名前:デフォルトの名無しさん :02/02/16 00:42
>>655
MFCの CTimeか CTimeSpanのソースでも参照してみたらどうよ?

658 名前:655 :02/02/16 02:17
>>656 ども。
ためしてみたけど、やっぱりコンパイルエラーです。
bool GetRemainTime()
{
SYSTEMTIME si1;
SYSTEMTIME si2;

si1.wYear = 2200;
si1.wMonth = 10;
si1.wDay = 7;

GetLocalTime(&si2);

SYSTEMTIME si3 = si1 - si2;

cout << si3.wYear << si3.wMonth << si3.wDay << std::endl;
}

>>657 そうすね。そーすみてみます。

#MFCをそのままつかうのは避けたい。

659 名前:655 :02/02/16 02:24
difftimeか・・・

660 名前:655 :02/02/16 02:34
秒でしかでないのか。残念。

661 名前:デフォルトの名無しさん :02/02/16 11:50
>>660
それは、3月1日から1月1日を引いても、9月1日から7月1日を引いても「2ヶ月」になって欲しい、ってこと?


662 名前:デフォルトの名無しさん :02/02/16 12:05
>660
秒で出たら60*60*24で割れば日単位になるが。
ひょっとして日単位の結果が欲しいんじゃないのか?

663 名前:デフォルトの名無しさん :02/02/16 13:08
教えてくださいな
Win2000/XPで、起動したプロセス(例:cmd /c dir)の標準出力を
リアルタイムに取得したいのだけど、方法ありますか?
Unixのteeみたいなのつくりたいんですが・・・
(Win9x向けには ttp://www.vector.co.jp/soft/dos/util/se037517.html
見つけましたがw2kでは動きませんでした.)
WindowsのPipeは最初のコマンドが終了してから次のコマンドを実行するようで、
CreatePipeとReadFileを使うと、↑のために最初のコマンド終了後にしか出力を
取り出せませんでした.


664 名前:デフォルトの名無しさん :02/02/16 13:22
>>663
どうせ、起動されたプログラムがバッファリングしてるんだろうよ。


665 名前:デフォルトの名無しさん :02/02/16 13:34
>664
DOS用16bitアプリという罠

666 名前:デフォルトの名無しさん :02/02/16 13:41
ありがとうございます.
ほんとですねぇ。起動される側を↓にしたら期待した通りになりました。
for(i = 0; i < length; i++){
 printf("line %d\n", i);
 fflush(stdout);
 Sleep(interval);
}
---
なんとかうまく騙す方法ってないんでしょうか?


667 名前:デフォルトの名無しさん :02/02/16 17:17
ちょっと質問させてください。
今やりたい事は、ダイアログベースのアプリケーションで二重起動を防止して、
2つ以上起動しようとしたら既に起動しているやつをフォアグラウンドに移動
させたいんです。
二重起動を防止するだけならMutexを使って簡単にできますけど、フォアグラ
ウンドに移動する部分で困ってしまいました。
FindWindowでウィンドウハンドルを取得しようと思っても、ダイアログのキャ
プションは実行時に変化するので、特定の名前で検索することができません。
クラス名もダイアログなのでユニークな名前に出来ません。

Win98とXPで共通に使えて、異なるインスタンス間でウィンドウハンドルをやり
取りする方法、またはウィンドウを特定する良い方法はないでしょうか?

668 名前:デフォルトの名無しさん :02/02/16 17:25
>>667
非表示の親ウィンドウを一つ作っておいて、

1. 親ウィンドウを FindWindow() で特定
2. GetLastActivePopup() でダイアログを特定
3. アイコン化されてたら ShowWindow(SW_RESTORE) で戻す
4. SetForeground() で前面に

で OK。

669 名前:667 :02/02/16 17:55
>>668
なるほど、非表示の親ウィンドウっていうのは良い手ですね。
ウィンドウハンドルの受け渡しに、メモリマップドファイルやレジストリを
使おうかと難しく考えていました。

2番目以降の処理は親ウィンドウに任せる事もできますね。
どうもありがとうございました。

670 名前:655 :02/02/17 00:03
>>661 
>>662

ご指摘のように、実は秒も日も同じものです。

知りたいのは、2200年10月7日24:00から現在時刻までいったいどれだけあるのかということです。

具体的には、
「2200年10月7日まで 後72685日」
とかやりたいのです。

difftimeはどうやら秒単位の引き算しかできないようなので、
(残り秒) = (2200年10月7日の絶対秒) - (現在の絶対秒)
というように、絶対秒なる概念を導入しないと計算できないです。

ということでdifftimeでは何の解決にもならないことがわかりました・・・

671 名前:デフォルトの名無しさん :02/02/17 00:29
>>670
「ユリウス日」で検索したら出てきただけなんだが、参考になるかい?
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/u/ut2jd.html

672 名前:デフォルトの名無しさん :02/02/17 00:32
Windows98でbatファイルを作って実行するとウィンドウが開いたままのこってしまう。
ファイルのプロパティを開いて「プログラム終了時にウィンドウを閉じる」に
チェックを入れれば、閉じるようになるんだけども。
このチェックを入れるという行為をGUIを使わずに Win32APIを用いて
VBやWSHから行うことはできますか?

673 名前:デフォルトの名無しさん :02/02/17 00:38
>>672
背伸びせずに、batファイルの最後にexit書いとけ!


674 名前:655 :02/02/17 00:41
>>671
こ、これです。こんなのがほしかったんです。
ありがとうございます。早速試してみます。

675 名前:655 :02/02/17 01:02
報告です。ユリウス日を使って無事計算できました。
こんな便利な日付があるとは知りませんでした。ありがとうございました。

double d1;
long ud_xday;
ud_xday = ut2jd(&d1, 2200, 10, 7, 23, 59, 59);
cout<< "x-day: " << ud_xday << std::endl;

time_t ltime;
struct tm *today;
double d2;
long ud_today;

time(<ime);
today = localtime(<ime);

cout << today->tm_year+1900 << today->tm_mon+1 << today->tm_mday << std::endl;
ud_today = ut2jd(&d2, today->tm_year+1900, today->tm_mon+1 , today->tm_mday,
today->tm_hour, today->tm_min, today->tm_sec);

cout<< "today: " << ud_today << std::endl;

cout << "Remain Day: " << ud_xday - ud_today << std::endl;


「・・・まであと72551日」

676 名前:デフォルトの名無しさん :02/02/17 01:14
ところで、2200年10月7日って・・・
なんのひ?

677 名前:デフォルトの名無しさん :02/02/17 01:23
>>670
解決したみたいだからいいけど、difftimeで「何の解決にもならない」ってことは
ないんじゃないの? 何でそこまで変換するのをいやがるのかわからん。
time_tだと2038年の壁があるから、とかいう理由だったらわかるけどさ。

678 名前:デフォルトの名無しさん :02/02/17 01:23
FtpFindFisrtFileでファイルの更新日付を取得した時に、当日のファイルだと
1年前になっちゃうんだけどなんでなんでしょう?Win2000,VB6.0使用なのですが。

679 名前:デフォルトの名無しさん :02/02/17 01:27
>>678
その組み合わせだと、
ドラえもんの四次元ポケットに繋がってます。

680 名前:655 :02/02/17 02:24
>>676
この日までにもどってこないと・・・

>>677
秒をきらってたわけじゃなくて、struct tmで設定したx-dayをtime_tにする方法が
わからんかったんです。

difftimeの引数はtime_t型なもんで。

time_t ltime;
struct tm *today;

// 今日
time(<ime);

// その日
struct tm xday = { 59, 59, 23, 7, 10, 300 };


// はて?
difftime( ? , ltime);

681 名前:デフォルトの名無しさん :02/02/17 03:10
>680

MSDN
> Microsoft C/C++ 7.0 以外のすべての Microsoft C/C++ バージョンおよび Microsoft Visual C++ のすべてのバージョンでは、time 関数が返す現在時刻は、1970 年 1 月 1 日の午前 0 時 0 分 0 秒から経過した秒数です。

ヘルプくらい読もうぜ・・・。

682 名前:655 :02/02/17 03:33
>>681
そのヘルプは読んだんですが、問題は現在時刻ではなくて
「2200年10月7日」は、1970 年 1 月 1 日の午前 0 時 0 分 0 秒から何秒後か?
ってことなんです。


683 名前:デフォルトの名無しさん :02/02/17 03:41
つーか、mktime?

684 名前:デフォルトの名無しさん :02/02/17 07:55
ごみ箱を空にするAPIを教えてください。
過去ログになかったみたいです。

685 名前:デフォルトの名無しさん :02/02/17 09:01
SHEmptyRecycleBin

686 名前:デフォルトの名無しさん :02/02/17 12:03
>>680-682
なんでそこで「任意の日付をtime_tにする方法」を調べるなり聞くなりするという
発想にならないんだろう……
いずれにせよ、time_t使ってるかぎり2038年以降は動作しない可能性があるけど、
その辺はいいの?

687 名前:デフォルトの名無しさん :02/02/17 12:22
>>673
batの記述には、ちゃんと最後にexitと記述しているけど、
ウィンドウが閉じないんだよ〜。なんで?
逆に、Windows2000でbatを起動するとexit記述があってもなくても
終了後に自動でウィンドウが閉じる。これまたなんで?

688 名前:デフォルトの名無しさん :02/02/17 16:14
IOleWindow::GetWindow
やろうぜ

689 名前:デフォルトの名無しさん :02/02/17 16:16
ClassNameからCLSIDを取得する方法はありますか?

690 名前:デフォルトの名無しさん :02/02/17 16:23
javaアプレットのコントロールのハンドルが取りたいです。
IOleInPlaceActiveObject
どーやって使うの?

691 名前:デフォルトの名無しさん :02/02/17 16:25
>>689
レジストリ見ないでってこと?

692 名前:デフォルトの名無しさん :02/02/17 16:29
そうです。(だと思います)
WindowFromPoint見たいなのを使ってウィンドウから直接的に得る方法はないかなと思って。
どの道レジストリ調べてもprogIDとかが分からなければ使いようがないので。

693 名前:デフォルトの名無しさん :02/02/17 16:39
GetClassNameかもしれないけど。

694 名前:デフォルトの名無しさん :02/02/17 16:56
>692
>WindowFromPoint見たいなのを使ってウィンドウから直接的に得る方法
WindowsのhWnd又はWndClassから、COMのCLSIDが欲しい、って事か?

695 名前:デフォルトの名無しさん :02/02/17 17:00
そゆことっすね。>694

696 名前:デフォルトの名無しさん :02/02/17 17:01
プロセスIDとかからでもいいけど。

697 名前:デフォルトの名無しさん :02/02/17 21:39
RDKだっけ?なんか忘れたけどMS配布のキット入れれば出来たかな。

698 名前:デフォルトの名無しさん :02/02/18 10:20
CreateProcess使ってCMD.exe(またはFTP.exe)を呼び出してFTP接続した場合、
ユーザー認証はどうやるのでしょうか?
普通にユーザー名とパス渡しても、ログインできないんです。


699 名前:デフォルトの名無しさん :02/02/18 13:39
>698
まーたそれだ(笑)
まだできてないんだ。
もしかすると、例の、あの、
ユーザ名入力の部分だけ標準出力とは
違う出力つかってるのかもね。
でも、わかんないけどね。
いっそのことFTPシステム作ったら?
案外簡単かもよ?わかんないけど。






700 名前:デフォルトの名無しさん :02/02/18 17:03
>>698
応答ファイルを使えばよいかと。

701 名前:デフォルトの名無しさん :02/02/18 19:36
質問です。bcc を使っています。
Win32API は付属のヘッダで宣言されていたので不自由なく使えているのですが、
他人様が作った DLL 内の関数を使いたいと思ったら、宣言の仕方が解りませんでした。
関数のシグネチャはわかっている(本当はこれから調べるんですけど)として、
DLL のファイル名等はどうやって指定すればいいのでしょう?そもそもソース内に書くものなのか、コンパイラ or リンカのオプションに指定する物なのかも解っていません。
どなたか教えて下さい。よろしくお願いします。

702 名前:デフォルトの名無しさん :02/02/18 19:49
bccなら、コマンドラインから
  implib xxxx.lib [DLL名]
とかやればインポートライブラリが作れるから、
その lib をリンカでリンクすればよいのでは。

703 名前:デフォルトの名無しさん :02/02/18 20:57
loadlibraryじゃなくて?
それからgetprocadressだろ

704 名前:701 :02/02/19 00:58
レスありがとうございます。

>>702
やってみたのですが、xxxx.lib は作れたのですが、それをリンクしても
関数が見つからないみたいです。 xxxx.lib をテキストファイルとして開いてみると、どうやらそれらしい名前が書いてあるのですが…。

>>703
試してみます。

705 名前:デフォルトの名無しさん :02/02/19 01:39
>>704
名前修飾で引っかかってるんじゃないの? ヘッダファイルで関数名を宣言
している部分を extern "C" { } で括ってみるとか。

706 名前:デフォルトの名無しさん :02/02/19 03:01
Win98, VC6でシェルエクステンション(コンテキストメニューハンドラ)
を作ってるんですが、デバッグができないZ。

エクスプローラを終了させて、デバッガで動かした後、
ブレークポイントを設定し、ブレークしたところで、VCが
操作できねーz。

707 名前:デフォルトの名無しさん :02/02/19 18:17
>704
オレッチもそれ試したんだけどねぇ、できないよな?
なんでだろね?でもloadlibraryとgetprocadressだったら
絶対できるよ。だからそっちつかう。

でも、
なんでだろ・・・・


708 名前:デフォルトの名無しさん :02/02/19 19:23
デスクトップアクセサリーで、他のウィンドウを無視して
デスクトップ上を、キャラが練り歩くようなアプリがありますが、
あれはどうやって実現すれば良いのでしょうか?

709 名前:デフォルトの名無しさん :02/02/19 19:46
>>708
便乗。
昔から色々調べてたんですが708のような物ってやっぱりリージョンウインドウで
やるんですかね?

魚泳ぐような奴でいっぱいリージョンウインドウがあると凄く重くなるような気がした
んで,他になんかあるのかなぁと思ったんですが…。


710 名前:デフォルトの名無しさん :02/02/19 19:51
>>709
Windows 2000/XPならレイヤードウィンドウもある。
リージョンウィンドウでも腕次第でだいぶ
パフォーマンスが変わったりするみたいね。

711 名前:デフォルトの名無しさん :02/02/19 20:41
>>710
ふむふむ。半透明できる奴でしたっけ…>レイヤード

デスクトップアクセサリ系のはWin3.1の頃からあった気がしたんで,どうやってんだろうなて
のが疑問だったんですよね。チャダンスとかはソースもあったらしいんですが見つからず…。


712 名前:デフォルトの名無しさん :02/02/19 21:07
普通のtranparentなウィンドウでいいんじゃない?
リージョンに対してのデメリットはマウスメッセージが透過できない事
ぐらいかと。

713 名前:708 :02/02/19 22:00
一生懸命、監視してたスレが、別のスレな罠(;´Д`)

>>709-712
レスサンクスです!!Win98環境の友人へ、誕生日プレゼントとして
送る予定なのでリージョンかトランスパーレントで行こうと思います。

やっぱ聞いて良かった。危なくディスプレイ全部のHDC取得して…
とか行儀の悪いことやるところでした。感謝!

714 名前:デフォルトの名無しさん :02/02/20 00:04
CreateProcess で起動したアプリケーションのウインドウが開くまで
待ちたいんですけどどうすればいいですか?
MsgWaitForMultipleObjects は NTだからか
access denied になってしまうみたい。
あとはフックで監視しておいて WM_PAINT 投げられるまで
待つしかないの?
ほかに隠れウインドウ作っておいて WM_ACTIVATEAPP 待つのも
やってみたけど ALT+Tab でウインドウ切り替えられると氏ぬる。


715 名前:デフォルトの名無しさん :02/02/20 00:52
あとはwaitforinputidleしかしりません

716 名前:714 :02/02/20 01:16
説明不足すまん。
フックしてやってみたがだめだったので、
SetWindowsHookEx の使い方がまずいのか、
それともそもそもフックがだめなのか
知りたかったんだけど…。


717 名前:デフォルトの名無しさん :02/02/20 01:18
>716
他のプロセスへ引っ付くには、フックプロシージャをDLLにせんと、動かないぞよ

718 名前:まんさく :02/02/20 01:22
うんうんそりゃそーだ<DLL

719 名前:まんさく :02/02/20 01:32
し、しまった。まんさくが登場しちゃたアルョ爆

720 名前:714 :02/02/20 01:34
もちろんDLLにしましたよ。95だとなぜかDLLにしなくても大丈夫だったような気がする。
書き忘れましたが今は2000上でデバッグ&プログラミング中。

struct dhookinfo {
HHOOK hHook;
DWORD dwTargetThreadId;
DWORD dwCallingThreadId;
};

__declspec(dllexport) BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
if( fdwReason == DLL_PROCESS_ATTACH ) {
tlsidx[0] = TlsAlloc();
hInst = hinstDLL;
} else if( fdwReason == DLL_PROCESS_DETACH ) {
TlsFree( tlsidx[0] );
} else if( fdwReason == DLL_THREAD_ATTACH ) {
TlsSetValue( tlsidx[0], NULL );
} else if( fdwReason == DLL_THREAD_DETACH ) {
LPVOID pm;
pm = TlsGetValue( tlsidx[0] );
if( pm ) {
if( ((struct dhookinfo *)pm)->hHook ) UnhookWindowsHookEx( ((struct dhookinfo *)pm)->hHook );
HeapFree( GetProcessHeap(), 0, pm );
}
}
return TRUE;
}

こんなかんじでDLLを初期化して


721 名前:714 :02/02/20 01:37
(上のコードは[ここ]を押さなくてもぜんぶ見えてます)
static LRESULT CALLBACK hookwndproc( int nCode, WPARAM wParam, LPARAM lParam )
{
if( nCode < 0 ) {
return CallNextHookEx( ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->hHook, nCode, wParam, lParam );
}
if( wParam ) {
PostThreadMessage( ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->dwCallingThreadId, WM_USER, 0, 0 );
}
return CallNextHookEx( ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->hHook, nCode, wParam, lParam );
}


722 名前:714 :02/02/20 01:40
× if( wParam ) {
○ if( !wParam && ((CWPSTRUCT *)lParam)->msg == WM_PAINT && GetWindowThreadProcessId( ((CWPSTRUCT *)lParam)->hwnd, NULL ) == ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->dwTargetThreadId ) {

ってなかんじになっています。

723 名前:デフォルトの名無しさん :02/02/20 01:44
ちゃんと、他のプロセスに引っ付いてる?
_asm int 3;
で無理矢理止めてみたら?

724 名前:714 :02/02/20 01:50
>>715 >>717 >>718 >>723
ちょっとやってみます。
ちなみにこれ、指定されたアプリケーションの
スクリーンショットを自動的に撮るプログラムになる予定なんだけど…。



725 名前:デフォルトの名無しさん :02/02/20 01:53
WM_PAINTのタイミングでしか描かないソフトは、少ないような...

726 名前:デフォルトの名無しさん :02/02/20 08:37
>>725
そうか?ゲームでもない限り、描画はWM_PAINTに集中させとくのがセオリーだと思ってたのだが…。
っていうか、「WM_PAINTのタイミングなら確実に描いている」のは確かかと。

727 名前:デフォルトの名無しさん :02/02/20 10:30
Windows 98, Windows 2000で有効になっているタイトルバーのグラデーション
みたいな塗りつぶし描画はどうやってるのでしょう?
長方形を描いて右から左にグラディエーションをつけたいだけです

システムがやってるんだからAPIがあると思うのですが 見つからない

728 名前:デフォルトの名無しさん :02/02/20 10:54
>>727
多分、DrawMenuBar だと思うんだけど、違うかな?

729 名前:728 :02/02/20 10:55
いや、明らかにちがうだろ>漏れ
DrawCaption だ、 DrawCaption
うまくいったかどうか報告キボンヌ >>727

730 名前:728 :02/02/20 11:21
>>727
とりあえずちょっと試してみた。ソースが VB なのは勘弁してくれ(これくらいならわかるっしょ?)
DC_TEXT をつけないと、何故かうまくいかないんだよなぁ…。
ここら辺わかったら情報をフィードバックしてくれ。

Private Declare Function DrawCaption Lib "User32" (ByVal hWnd As Long, ByVal hdc As Long, lprc As RECT, ByVal uFlags As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const DC_ACTIVE As Long = &H1
Private Const DC_ICON As Long = &H4
Private Const DC_INBUTTON As Long = &H10
Private Const DC_SMALLCAP As Long = &H2
Private Const DC_TEXT As Long = &H8
Private Const DC_GRADIENT As Long = &H20

Private Sub Command1_Click()
Dim r As RECT
r.Left = 10
r.Top = 20
r.Right = 200
r.Bottom = 40
Call DrawCaption(Me.hWnd, Picture1.hdc, r, DC_ACTIVE Or DC_GRADIENT Or DC_TEXT)
End Sub


731 名前:デフォルトの名無しさん :02/02/20 14:49
 ログオンダイアログを表示する API ってありませんでしたっけ?

732 名前:デフォルトの名無しさん :02/02/20 21:42
>>714
WaitForMultipleObjectsの使い方を間違えてる可能性が大だと思われ
つーかWaitForInputIdleじゃだめなのか

733 名前:デフォルトの名無しさん :02/02/20 21:43
>>731
ExitWindowsEx(EWX_LOGOFF, 0);

734 名前:デフォルトの名無しさん :02/02/20 22:55
プログラマにピッタリのファイル(ソースコード)差分ツールのお勧め教えてください
差分みやすく、その場の編集できるもので使い勝手のよいもの。

VCのソース管理->相違点 と連動してくれればベストなのですが・・・


735 名前:デフォルトの名無しさん :02/02/21 00:21
>>734
VSS

736 名前: :02/02/21 03:38
>734
735に同意。VSSのヴィジュアルマージは多分、Winで1,2を争う見やすさだと思うぞ。

マーソコカラサキハコノミノエディタツカエバヨロシ

737 名前:727 :02/02/21 10:56
728さんレスありがとうございます。 DrawCaption は試してみたのですがダメでした
>>730 のコードをDelphiで実行したのですが何もおこりませんでしたし

結局APIを使う方法が判らず、ビットマップを自分で作成してしまう事にしました

function CreateGradationRectBitmap(const width,height:Integer;const LeftColor,RightColor:TColor):TBitmap;
var L,R:array [0..2] of integer;
procedure decompose(var w:array of integer;const col:TColor);
begin
w[0]:= col and $FF;
w[1]:=(col shr 8) and $FF;
w[2]:=(col shr 8) and $FF;
end;
var i,j,w:integer;
var p:pByte;
begin
decompose(L,LeftColor);
decompose(R,RightColor);
Result:=TBitmap.Create;
Result.Monochrome :=False;
Result.PixelFormat:=pf24bit;
Result.Width :=width;
Result.Height:=height;
p:= pByte(Result.ScanLine[0]);
w:=width-1;
for i:=0 to w do begin
{色の按分 } for j:=0 to High(L) do begin p^:= (R[j]*i +L[j]*(w-i))div w; inc(p);end;
end;
w:=width*3;
With Result do for i:=1 to Height-1 do Move(ScanLine[0]^ , ScanLine[i]^ ,w);
end;


738 名前:デフォルトの名無しさん :02/02/21 11:38
DrawIconEx でアイコンを表示するプログラムは、
OS が XP でアルファブレンディングなアイコンなら
きちんと透過表示できるのでしょうか?


739 名前:デフォルトの名無しさん :02/02/21 13:29
縦書きフォントを取得するAPIはありませんか?
フォント名の前に@をつける方法でできるのは分かりますが、
イマイチスマートじゃないのでしっくりきません。

740 名前:デフォルトの名無しさん :02/02/21 16:03
EnumFontFamiliesExで縦書き(@の付いたもの)も
他のフォントと同様に列挙されると思うが

741 名前:デフォルトの名無しさん :02/02/21 16:03
>>737
GradientFill

742 名前:727 :02/02/21 16:16
>>741 ありがとうございます。

名前が判らないと検索も出来ない。なんか魔法使いの世界みたいなもんですね。


http://www.microsoft.com/japan/developer/library/jpgdipf/_win32_gradientfill.htm
Windows: サポートされていません。 <---アリャリャ


743 名前:730 :02/02/21 16:57
>>742
ありゃ、DrawCaption 駄目だった? Canvas と API のカラミとかではなくて?
(Del知らないからなんとも言えないけど)

でもね、>>741さんの見て思い出したけど、
GradientFill さ、VB 用の Win98 の API 本で(Win98から実装の関数として)紹介されてるよ!?
MS のサイトの情報の方が間違ってるんではなかろうか?

744 名前:デフォルトの名無しさん :02/02/21 23:30
>>742
日本語版は情報が古い。ちゃんと使える。
http://msdn.microsoft.com/library/en-us/gdi/bitmaps_8oa4.asp
> Windows NT/2000/XP: Included in Windows 2000 and later.
> Windows 95/98/Me: Included in Windows 98 and later.
つーかWindows 98/2000がキャプション描画するときこれ使ってるんだから
使えないわけがない。

745 名前:デフォルトの名無しさん :02/02/22 12:06
>>740
書き方が悪かったですね、列挙ではなく、
フォント名 -> 縦書きフォント名 変換がやりたいのですが、
すべてのフォントで名前の最初に@をつけるだけで良いのかわからないし、
保証されていると書いてある文書も見つからないので、気になってます

746 名前:デフォルトの名無しさん :02/02/22 12:12
@を外したヤツが横書きフォントじゃないの?

747 名前:デフォルトの名無しさん :02/02/23 10:38
GetTextMetrics(&tm)で取得した
tm.tmOverhangが常に0なんですが、どういう事なんでしょうか?

748 名前:デフォルトの名無しさん :02/02/23 10:38
age

749 名前:デフォルトの名無しさん :02/02/23 11:14
>>747
Overhangが無いってコトでしょう
Overhangの(プログラム上での)和訳がわからないけど、辞書だと「張り出し」って意味だよ。


750 名前:デフォルトの名無しさん :02/02/23 11:28
>>749
ItalicやBold指定しても設定されてないんですよね。
修飾書体と無修飾書体を混在で綺麗に扱う方法って無いんですかねぇ


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