Win32API質問箱 Build16

このエントリーをはてなブックマークに追加
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
最低限、最新スレくらいは質問する前に検索ぐらいしてください。
過去スレ・参考は>>2-5くらいを参照してください。
3デフォルトの名無しさん:04/01/11 23:12
このスレは24:00をもって削除されます。
4デフォルトの名無しさん:04/01/11 23:40
一行で休止状態にできるAPIは?
>>1
乙!!
>>4
何を休止するのでしょう?
人生?
>>4
SetSuspendState(TRUE,TRUE,TRUE);
すんません。以前質問させてもらった者なんですが、
また質問が・・・
VFWのAVISaveVで、ファイルを保存しようとするのですが、
どうも「デスクトップ」等の全角文字が入るとファイルオープン
エラーで保存してくれないみたいなのですが、
同様の症状になったかおられますか?

もしおられたら、ご返事よろしくお願いしまつ。
9Win32SDK勉強中 ◆Win32BkCJ. :04/01/12 19:12
>>前スレ187
>MSのplatformsdkアップデートからドキュメントだけ落とせたかも
探しても出てきません(焦)
どこにあるのかご存知の方がいらっしゃいましたらご教授ください。
お願いいたします。
>>9
>>2
お前は本当に探してるのかと、子一時間問い詰めたい。
グーグル先生に聞いてもトップにくるんだが…
>>9
SDKのドキュメントは英語しかなかった気がする。
>>10,11
2のサイトを探して、googleでも調べた後の質問でした。
内容は英語でも一向に構いません。他のオフラインのPCに
内容を移動しなければいけないので素直に全部ダウンロードすることに
しました(ISDNで)。ただ、UpdateSDKActiveXをインストールしておらず、
見ることができていませんでした。お叱りごもっともです。
スレ汚しスミマセンm(_ _)m
SelectObjectの戻り値は以前使ってたSelectした物と同種のGDIObjectですが、
CreateCompatibleDCで作ったばかりのデバイスコンテキストに初めて(例えば)
BitmapとかをSelectObjectした時は戻り値は何を吐くんでしょうか?

あと古い文献のサンプルコードで、プログラム終了時にCreateCompatibleDCで
作ったメモリDCをビットマップをSelectしたままDeleteDCしてましたがこれは
問題ないんでしょうか?
>CreateCompatibleDCで作ったばかりのデバイスコンテキストに初めて(例えば)
>BitmapとかをSelectObjectした時は戻り値は何を吐くんでしょうか?

たしか1x1の白黒ビットマップと思う。

>ビットマップをSelectしたままDeleteDCしてましたがこれは問題ないんでしょうか?

問題無いだろ。 そのあとでDeleteObjectで自分で作ったBMPの処理も忘れるなよ。
>>14
マリガトウ
2年来の疑問が氷解しますた
>>14
> ビットマップをSelectしたままDeleteDCしてましたがこれは問題ないんでしょうか?
マズイんでね?
洗濯を解除してからでねえと正しく解放できなかったような。
今までそのまま解放してたけど
選択解除ってどうやんの?
>>17
SelectObjectの返り値を退避させといて戻す
もしくは SaveDC と RestoreDC を使う
20デフォルトの名無しさん:04/01/13 12:07
デスクトップ上に絵を描画して、その絵を消したり動かしたりしたいのですがどのようにしたらいいでしょうか?

取り合えず自分でやってみた方法は、絵と同じ形でリージョンを作成しウィンドウをその形に切り取りウィンドウごと動かして
絵が動いているように見えるということをやってみたのですが、もっといい方法はないでしょうか?
21高校生:04/01/13 13:12
ひたすら質問しまくっていた、教えて君です。
非常に低レベルだと思われるかもしれませんが、
教えていただいた結果を報告いたします。

まず、何らかの理由でWS_THICKFRAMEが付加されたにもかかわらず、
ウインドウサイズを変更できないようにする方法について、

case WM_GETMINMAXINFO:
  MINMAXINFO *info;

  info =(MINMAXINFO *) lParam;
  info->ptMinTrackSize.x = info->ptMaxTrackSize.x = 640;
  info->ptMinTrackSize.y = info->ptMaxTrackSize.y = 480;

  return 0;

とする事で、WS_THICKFRAMEが付加されようと、MoveWindow()を使われようと、リサイズできないウインドウを作る事ができました。
ご親切に何度も教えていただき、ありがとうございました。
22高校生:04/01/13 13:12
任意のウインドウにWS_EX_TOPMOSTを付加したい場合、
何故、SetWindowLong()ではなく、SetWindowPos()を使わなければならないのかという質問に対して、
>試せば分かる。
と言われました。そこで、実際に試してみることにしました。
まず、SetWindowLongを使用する方法から――。

//hTargetは最上位表示にしたいウインドウのハンドル。
  LONG style;
  style = GetWindowLong(hTarget, GWL_EXSTYLE);
  style = style | WS_EX_TOPMOST;
  SetWindowLong(hTarget, GWL_EXSTYLE, style);

hTargetの値が正しいかどうかは、FlashWindowEx()を使って確認済みです。
SetWindowLong()戻り値は非ゼロでした。しかし、ウインドウの挙動は変わりません。
spy++を使って調べても、 WS_EX_TOPMOSTを確認できませんでした。

SetWindowPosではどうかというと――。

  SetWindowPos(hTarget, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);

ウインドウは最上位に表示されました。
拡張スタイルにも WS_EX_TOPMOSTが付加された事を確認しました。
プログラムは完成しました。友達がこのプログラムを欲しがった理由は、フルスクリーンで起動するゲームでも、常にプレイヤーが見えるようにしておきたかったのだそうです。こういうツール、どこにでも転がっていそうな気がしますがw
以前使っていたツールは、クソ重たい上に、複数のウインドウに対して設定できなかったそうです。
また、別のウインドウを変更すると、前の変更が問答無用で元に戻ってしまうとか
(しかもシェアウエア。まあ関係ないけどw)
23高校生:04/01/13 13:14
>>20
9x系をサポートしないのであれば、レイヤードウインドウが簡便ですと言ってみるテスト
MDIの子ウインドウにIEコンポーネントを使用して
タブ切り替え型ブラウザを作ろうと思ったのですがうまくいきません。
ちなみにクラス名を自分で作成したクラスに変えると
MDIの子ウインドウがちゃんと表示されます。

<現在のソース:エラーが出る箇所>
hDoc = CreateWindowEx(
  WS_EX_MDICHILD,
  "AtlAxWin",
  "Shell.Explorer.2",
  WS_CAPTION | WS_VISIBLE,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  hClient,
  NULL,
  hInst,
  0);

ご存知の方いましたらご教授願います。
2524:04/01/13 14:25
とりあえず子ウインドウ毎にWM_CREATEで"AtlAxWin"クラスの
コントロールとして作ることにしました。
26高校生:04/01/13 16:29
ダイアログベースのプログラムを作りました。
開発環境はVC++.NET WinXPです。
NT系での正常動作を確認しました。
しかし、9x系ではうまく動きません。
具体的に言うと、
 ダイアログの文字列が文字化けしてしまう。
 GetKeyState() GetAsyncKeyStateが動かない。
という問題があります。
何故でしょうか?
9x系の動作確認はビルド後のexeを互換モード設定してやると
とりあえず擬似的にできるのでデバッグしてみると文字化けくらいは
解決するとおもわれ
28高校生:04/01/13 17:31
ExitWindowEx()
をつかってウインドウズを終了させようとしました。
開発環境は>>26で言っている通りです。
で、終了されません。
GetLastError()は、「権限がない」とか言っているんですが……。
アドミニストレータ―権限でログインしているんだけどなあ。
MSDNよんだら、AdjustTokenPrivileges()を使えとか書いてあるんですけど、
これの使い方が分かりません。
だれかサンプルを書いてもらえないでしょうか?
それと、9x系だったら、こういうことは考えなくても良いのでしょうか?
こんな感じか?
権限の種類がアドミニとかって話じゃないんだと思うが

BOOL ExecuteShutDown()
{
HANDLE hToken = 0;
TOKEN_PRIVILEGES tkp;

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)0, 0);
if(GetLastError() != ERROR_SUCCESS)
{
// 権限なし
return FALSE;
}
ExitWindowsEx( EWX_SHUTDOWN , 0 ) ;
return TRUE;
}
31高校生:04/01/13 17:48
>>29 >>30
うわっ!
レス早い!
どうもありがとうございます。
言えかえって試してみよう。
(これ、学校から)
32デフォルトの名無しさん:04/01/13 20:50
SHFileOperation(FOF_ALLOWUNDO) で行ったUNDO可能なファイル操作を、
実際にUNDOするには何を使えばよいでしょうか?
また、このときのUNDOで何が起こるか
(エクスプローラのメニューで「元に戻す」を選択したときに、ステータスバーに表示される文字列)
を取得するにはどうしたらよいでしょうか?
VC++でダイアログにスタティックコントロールでラベル貼って
それがフォーカス取得できるようにするにはどうすればいいですか?
>>33
VC++でダイアログにスタティックコントロールでラベル貼って
それがフォーカス取得できるようにする。
自分のプログラムのみ、レジストリへの書き込みを禁止させる方法ってないでしょうか?
VC上のリソースエディタから作った、
ラジオボタンにBS_3STATE又はBS_AUTO3STATEのスタイルを付けるには
どうすればいいのでしょうか?
グレイ表示したいのですが、上手くスタイルを設定出来なくて困ってます。
>>36 オーナードr(ry
>>24
まずどんなエラーが出るか書け。
話はそれからだ。

>>26
Unicodeビルドになっていないか?
39デフォルトの名無しさん:04/01/14 15:35
C++ Builderで発生している事なのですが
どうもWin32絡みのことのようなので質問させて頂きます

fopen、fread、処理、fclose
という処理があるのですが
freadの途中で、対象ファイルが無くなってしまった場合
(CD-ROM等に入っていて、それが取り出された場合など)

ドライブからメディアが取り出された、どうしますか
みたいなメッセージが出てきてしまうのです
このメッセージは止める事ができるのでしょうか?
できるのならば、方法を教えてください、お願いします
40デフォルトの名無しさん:04/01/14 15:38
ちょっと質問したいんですが、IPアドレスって犯罪とかでプロバイダー
に警察とかが照会求める以外で、特定されることってあるんですか?
個人のレベルでIPアドレスから住所とか個人情報を抜き出すことって
可能なんでしょうか?
それと、メッセンジャーって今はじめてダウンロードしたんですけど
ファイル共有できるんですよね。まだ使ったことないんですが、
友達とかと音楽とか交換した場合、やばいことになりますか?
もちろん違法ってことはわかってるんですが、一般的にそういうことは
行われてるんですか?誰かに音楽を送った場合相手が受け取って
それが知り合いだった場合、そのプロセスの間に誰か介入してきて
逮捕されたりってあるんでしょうか?
初心者なので教えてください。友達がファイル交換しようって言って
くるんですが、心配なので。
>>40
http://pc2.2ch.net/pcqa/ にでも行け。
4239:04/01/14 15:44
自己解決の模様
まだ検証してないが

SetErrorMode(SEM_NOOPENFILEERRORBOX);

のようだ
43高校生:04/01/14 15:56
>>27
試してみました。しかし、問題が再現しない。
まさかUnicode?
そんなわけないでしょうし……。

これは別の話ですが、互換モードを95/98/MEにしてやると、
ExitWindowsEx一発でシャットダウンできました。
互換モードにするとAPIの挙動も変わるんですね。

>>30
コピペしました。
いったい何をやっているのかを理解していないのですが……。
どこかに分かりやすく説明しているサイトがないかなあ。ググってみます。
MSDNって分かりにくい。
44あおりイカ:04/01/14 16:15
高校生だからなんなんだ
免罪符にでもなるとおもっているのか
> どこかに分かりやすく説明しているサイトがないかなあ。

>>29
女子高生なら優しく教えてあげるけどな
じゃあいまから女子高生ということにしてください
48高校生:04/01/14 17:10
免罪符ってインチキカトリック教会に、法外なお布施をしないともらえなかったのでは?
それと、残念ながら、漏れは男です。(女ってここにいるの?)
ところで、フォントの設定について教えてくれませんか?
実は、AAを表示するプログラムを書いているのですが、どうもうまくいかないのです。
MSDNのCreateFont()に書いてある通り、ポイントから高さへ変換する方法を使ったのですが、
微妙にIEと異なります。
レイヤードウインドウにして重ねてみると良く分かるのですが、
IEの方が、縦に長い&横に短い
となってしまいます。

>>48
nWidthは0にしたか?
つーか、どうやって指定したのか書かんと原因がわからないだろうが
50高校生:04/01/14 17:18
#include <windows.h>
#include <stdio.h>

void main(void){
for(;;){
if(GetKeyState(VK_RETURN) & 0x8000)
Printf("Enter key is pressed.\n");

Sleep(1000);
}
}

だれか、これを9x系で試してくれませんか?
NTだとエンターキーが押されたときにコンソールにその旨が出力されるんだけど。
98だとうまくいかない。
51高校生:04/01/14 17:21
家ではネットにつなげないから、ソース晒せない。
>>49
もちろんゼロにしています。
>nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
 ↑MSDNに載っていた方法
エディットボックスに出したときと
DrawTextで書いたときとではもしかして高さと幅バラバラになるのか?
女子高生ですがJAVAを教えてください
女子高生ですがHSPを教えてください
>>51
では家に>>30のソースはどうやって持ち帰ったのか
逆のことをすればよい
56デフォルトの名無しさん:04/01/14 18:13
>>50
GetAsyncKeyState と間違って使ってない?

GetKeyState は、APによってメッセージキューから取り出されたキーボードイベントが
発生したときのキーボードの状態だよ( WM_KEYDOWN / WM_KEYUP とかを受けて、
Alt キー押されてたかな、とかいうときに使う)。
んなこたぁない
>>40
マルチポスト
8ビットのBMPをCreateDibSectionで作りました。
その後SetDIBColorTableでビットマップのパレットを変更して再描画したのですが、画面に反映されません。
しかしアプリケーションを切り替えて再びアクティブにすると、画面の色が正しく更新されています。
アプリケーションが切り替わるときに何かパレットがアップデートされるようなメッセージが飛んでいると予測し、切り替えて戻る時のメッセージをデバッグしましたがわかりません。
それらしいと思ったのはWM_QUERYNEWPALETTEですが、自分で送信しても何も起こりませんでした。
何が悪いのでしょうか。教えてください。
OSはPocketPC2003です。
RealizePaletteとか
マウスのボタンが押されているかどうか調べる関数ってないですか?

マウスのボタンがダウンしていたら、スライダーを移動をスルーするという事をしたいのですが・・
>>61
GetKeyStateとか
>>62

レスありがとうございます、なんとかなりました
64デフォルトの名無しさん:04/01/15 13:33
>>56
キーボードイベントには限らないと思うけど。
イベント処理と関わり無く監視したいなら Async の方じゃなきゃダメですね。
逆に Alt + Click みたいのを判断するときには Async じゃダメ。
65高校生:04/01/15 15:50
GetKeyState()でも、
GetAsyncKeyState()でも、
9x系では動かないのです。
>>50のコードは、
自分の持っている、WinXPでは動き、友達の2KやXPでも動くんですが……。
女子高生ですがSEXを教えてください
VK_RETURN以外のコードは試しましたか?
68高校生:04/01/15 16:25
>>67
はい。
0x41(A key)
とか試したんですが……。
いずれも、
NT系では動作する。
9x系では動かない。
コンパイラはVS.NET アカデミック
ボーランドのフリーなやつ使ってみようかなあ。
ずっと押しっぱなしでもダメなの?
>>68
Windows98で試してみた。駄目だった。
9x系のコンソールはDosエミュレートだから
NT系のコマンドラインウインドウとは違う動きをするのかもしれない
Cランタイムとかでしかうまくいかないかも
>>68
for(;;){
 printf("%04X", GetKeyState(VK_RETURN));
}

なんてするとどう表示される?
ReadConsoleInput
PeekConsoleInput
WriteConsoleInput

この辺か?
>スレッドがメッセージキューからキーメッセージを読み出すたびに、この関数が返すキーの
>状態は変化します。キーの状態は、ハードウェアによる割り込みレベルの状態を反映しません。
>割り込みレベルの情報を取得するには、GetAsyncKeyState 関数を使ってください。

GetKeyStateの説明。
GetMessageしないと話にならない
75高校生:04/01/15 16:53
>>72
とりあえずやってみます。

ところで話は変わるんですが、
現在のウインドウの内容を、ビットマップファイルで記録したいのですが、
どうすればいいのでしょうか?
やはりビットマップファイルの構造を知っていないといけないのでしょうか。
なんか簡単なAPIはありませんか?
じゃー、なぜNT系では動くんだ?
>>74
それはGetKeyboardStateの説明だろ
GetKeyState
78高校生:04/01/15 16:59
>>74
こう言う事ですか?
でも、NT系では普通に動作するなあ。
それに、実際のプログラムでは、ウインドウプロシージャ―の中に書いているんですが……。

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

void main(void){
MSG msg;

for(;;){
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if(GetKeyState(VK_RETURN) & 0x8000)
Printf("Enter key is pressed.\n");

Sleep(1000);
}
}
>>75
1_も調べた形跡のない質問するなよ
コンソールにウインドウプロシージャってあるの?
>>77
GetKeyStateって言ってるだろうが。

>>78
動いたとしても想定外というか保証外といったことだろ?
ウインドウプロシージャの中に書いて動かないんだとしたら
多くのテキストエディタとか動かなくなる可能性があるけど。
>>75
プログラム内だけで使うならDDBでいいと思うよ。
メモリDCとディスプレイDCの両方に出力するか、メモリDCに書き終わった後WM_PAINTでBitBltするとか。
83高校生:04/01/15 17:11
まず、BITMAPINFOHEADER構造体があって
次に、BITMAPINFO構造体があって
そして、画像データ。(GetDIBits()を使う?)

ということでよろしいのでしょうか?
84高校生:04/01/15 17:14
>>80
コンソールではありません。

>>82
普通にビューワーを使って開けるビットマップを作りたいんです。
>>50でコンソールと言ってたんで
読み間違えですか...
8682:04/01/15 17:18
>>83
ちがう。
BITMAPINFOはBITMAPINDOHEADERとカラーテーブルをまとめた構造体のこと。
DIBに関しては、中身はこうなってる。

1.情報ヘッダ
2.カラーテーブル
3.ピクセルビット

詳しく言うと1はBITMAPCOREHEADER, BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADERがある。
2は1, 4, 8bppのビットマップはかならずカラーテーブルがある、16以上のbppも一応もてるけど持たなくてもいい。

詳しく説明するとキリがないかもしれん。
8782:04/01/15 17:23
プログラム内だけで使うのならDDBでいいんだけど、DIB使うならもうちっと勉強しないとだめだね。

Displayのピクセルを記録しておきたいだけなら、

hdcMem = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc, width, height);
SelectObject(hdcMem, hBitmap);

これでビットマップをメモリDCにセットして、あとはHDC使ってカキカキすればいい。
88高校生:04/01/15 17:36
>>87
ググったけど難しい。
FDに落として家でじっくり読むことにします。
8982:04/01/15 17:37
余談だが高校生よ。
なんでも聞いてばかりでは上達しないぞ。
たしかにピンポイントで答えは得られるかもしれんが、自分で解析するってことはそれだけその問題に
たいして時間を費やして考えることであり、忘れない知識として持つことができる。
さらには今現在の知識を振り絞って考えることからある種の関連を導き出せたりね。
もちろんデバッグにも役に立つ。

あとは、UIとGDIは一応網羅的に把握していないとやりたいこと実行できるLvではないかもしれん。
このへんは書籍やWebから学べることだからキッチリ押さえておくといいよ。

#偉そうなこと言ってる俺もプログラミング歴8ヵ月のアマチャソなんだけどね、お互い頑張ろう
9082:04/01/15 17:42
家かえってみるなら、wisdomのビットマップのところ見て基本を押さえてMSDNをよく読むこと。
そしたらググって使い方書いてるサンプル探して要点をまとめること。
ただし、DIBに関しては詳細に書いてあるWebは少ない。
そこは俺も参考にした。
とくにピクセルデータ操作関数は参考になるけど、画像処理部門になりそうだ。

ビットマップについて把握したらwin32API関数とどっか参考になるクラスライブラリでも見ながら
自分で基本的な操作関数つくって、その後にピクセルデータ操作のアルゴリズムとか考えるべきかな。
やってみればわかるけど圧倒的にDIBSectionのほうが扱いやすいし、APIとの連動もとりやすい。
>>82
鼻息荒いようだが

>16以上のbppも一応もてるけど持たなくてもいい。

この書き方ってどうよ?
殆どダウトだぞ?
普通のDIB使うなら、>>91のように構造体定義して操作関数つくっておくと細かいこと考えなくていい。
欲を言えば、win32関数の引数になる値は保持しておいて迅速に使えたほうがいい。
>>93
詳しく説明しろと?
ウィンドウスタイルを変更した時の更新のタイミングを教えて下さい。
例えばスクロールバーを付けたり外したりする時に
1、GetWindowLongでスタイル取得
2、DWORD値をいじる
3、SetWindowLongで値を設定
とやった時に画面上ではすぐ更新されず、一旦「アイコン化->元に戻す」とやらないと
変更が反映されません。(InvalidateRectでも不可)

取り敢えずCloseWindow/OpenIconとすれば反映されますがなんかダセーです。
この変更を実際に画面に反映させるスマートな方法ってなんかありますかね?
>>95
説明以前にあの言い方じゃ間違い
>>95
説明があいまい、まあ高校生にパレット説明してもわからんだろうからいいんじゃない
>96
ShowWindowだとおもわれ
>96
PostMessage(hWnd, WM_SIZE, 0, 0);
ってやってごらん。

ところで、MSDNには、
「SetWindowLong 関数を使って何らかのウィンドウデータを変更した場合、SetWindowPos 関数を呼び出してその変更を有効にしなければなりません。この場合、uFlags パラメータには、SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED を指定してください。」
と書いてあるけどなんかやってみた?
10196:04/01/15 18:42
>>99
さいしょそれでやろうとして更新できないのでアレ?と…

>>100
PostMessageは効きませんでしたが、SetWindowPosでSWP_FRAMECHANGEDを
指定してうまくいきますた
でもこれVC++4のヘルプには書いてなかったよ…これからはMSDNも確認しまつ
皆さんマリガトウ
>>101
いくらなんでもVC++4のヘルプは古すぎると思われ。
>>60
やっとできました。どうやら256色BMPをウインドウに転送するには、SetDIBitsToDeviceを使わないとダメだったようです。
テキストエディタ作ってます。
IMEの変換を受け取るとき、デフォルトの変換ウインドウでは
エディタ上の文字とずれが生じ見栄えが悪いので、
自力で描画を行おうとしているのですが、どうすればいいのか分かりません。

変換中の文字の描画はImmGetCandidateListで取得した結果を表示すればいいのですが、
変換ウインドウを非表示にしたまま入力を有効にする方法がわかりません。
どなたかご存知ないでしょうか?
GetCandidateじゃなくてGetComposition〜の方でしたね。
文字変換の自力描画はたしかMSWordとかがやっていたと思うので
そのとおりのやりたいのですが、何か方法は無いでしょうか
VC++4のヘルプ見たことないなぁ
>>66
InitCommonControlSex()
108デフォルトの名無しさん:04/01/16 11:23
ExitWindowSex()
SagE X
WaitForMultipleObjectSex()
それらのAPIはOS「彼女」「嫁」「ソープ嬢」でお使いください
>>111 それ買うよ!(;゚Д゚)ノ いくら!?
>>112 インストールしたいだけなんでしょ!?
>>107
肛門コントロールSEXは女子高生には早すぎたかも…
115デフォルトの名無しさん:04/01/16 15:09
ソケット使ってファイルを送るのってどうやってやるのでしょうか?
send()、recv()メソッドだと文字列を送るっぽい(?)のは分かったんですが
ファイルを送るにはどうしたらいいのでしょうか?
ファイルを送るメソッドってあるんですか?
どなたかご教授お願いします。
>>115
ファイルを読んでsend()
recv()で受け取ったのをファイルに出力
これで送れるよ
>>115
すれ違ってないか?
というより君は
単にファイルを送るアプリをつくりたいのか
Winsock直叩きでファイルを(ry
そこをはっきりしれ。
君の質問内容は後者に該当しそうだが、君が後者を選ぶ理由が思い当たらない
118全てのウィンドウを最小化:04/01/16 20:35
Winキー + M で全てのウィンドウを最小化することができますが、
これを Visual Basic からやりたいと思っています。

しかしデスクトップ以下のウィンドウ全てに対して ShowWindow で
最小化した結果と、Winキー + M で最小化した結果は違うようです。
具体的にはWinキー + M での最小化ではいくつかのウィンドウが
除外されているようです。

Winキー + M での最小化では、最小化すべきウィンドウを
どのようにして判定しているのでしょうか??
>>118
EnumWindows()して、IsWindowVisible()だったら
ShowWindow(SW_MINIMIZE)するとか?

適当スマソ
120118:04/01/16 21:07
結局仮想キーコードを送ってWin + M することにしました。
121 :04/01/16 21:08
一定期間キーボードやマウスからの入力が無かったら自動的に終了する
ようなアプリを書きたいと思っています。

最後の入力からの時間を返してくれるAPIというのは無いでしょうか?
122118:04/01/16 21:14
>>119 レスありがとうございます。
IsWindowVisible での判定はやってみました。
が、Win + M の挙動はちょっと違うようです。

実は http://tachyorg.at.infoseek.co.jp/bluetick/の時計アプリケーション
を使っているのです。このアプリケーションは非矩形のウィンドウを持っています。
また、僕は Doblog ツールバー http://www.doblog.com/ を常駐させて
いて、これが画面下にティッカーを表示しています。
これらのウィンドウ群は Win + M でも最小化されないんです。

#余談ですけど、上に書いた時計アプリケーション、
#カコイイので気に入ってます。
#使い始めて10時間くらいしかたってないけど。
WS_OVERLAPPEDを持っているかどうかじゃないか?
124118:04/01/16 21:18
>>123 なるほど、タイトルバーの有無で判定するということですね。
よさそうな気がしてきました、まだ未確認ですけど。
ペイントソフトの選択範囲を表す鎖線を、ちょっとずつ動かすにはどうすればよいのでしょうか。
PS_DASHまではわかりましたが、動かす方法がわかりません。
>>125
5角形ABCDEを作り、BCDEが矩形の頂点にくるように配置する。
Aが辺EB上を動くように動かしながらPolyLineで描画。
うまくいくかどうかはシラネ
127デフォルトの名無しさん:04/01/16 23:05
TAPIを使用して電話の発信/着信を行っているのですが
着信時の相手先情報(電話番号とか)はどのようにして取得するのでしょうか?

ナンバーディスプレイ対応の電話機で相手番号の確認は出来たのですが
プログラム中での取得が出来ません。
『このAPIで出来る』とかご存知でしたら教えて頂きたく...
"Win32"APIにあるのか…?
>>127
前に聞いたときには「できない」という結論だった
昔、ナンバーディスプレイの番号を
シリアルポートかなんかで
通知してくれる製品があったな。
あれ買っとけば良かったかなぁ。
ISDN回線用なら昨日もヨドバシで普通に売ってたがアナログ回線用は…
133デフォルトの名無しさん:04/01/16 23:51
>>121 「一定時間」のタイマーを張って、入力があったらリセットという実装ではダメ?
134デフォルトの名無しさん:04/01/17 11:15
どうも。

文字列で FindResource と SizeofResource を使う必要が出てきて、
ちょっと試しに使ってみたのですが上手くいきません。

void CTesMFCDlg::OnButton1()
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC h = ::FindResource(hInst, MAKEINTRESOURCE(IDS_STR1) , RT_STRING);
TRACE1("h = %d\n", h);
DWORD size = ::SizeofResource(hInst,h);
TRACE1("size = %d\n", size);
}

で h=0 size=0 と返ります。
なにゆえにこうなるのか理解不能です。どなたか助けてぇ
MFC上でのテストですが、IDS_STR1はStringTableにちゃんと入れてます。
>>121
> 最後の入力からの時間を返してくれるAPIというのは無いでしょうか?
2000以降で GetLastInputInfo。
9x系まで考えれば無い。
とりあえずGetLastErrorはやってみたのか?
137134:04/01/17 11:36
GetLastErrorすると
1814
The specified resource name cannot be found in the image file.
ERROR_RESOURCE_NAME_NOT_FOUND
らしいです。でも、rcファイルでは
・・・
STRINGTABLE DISCARDABLE
BEGIN
IDS_STR1 "テスト用文字列"
END
・・・
なんですけどね
>>137
#include "Resource.h"
>>137
HINSTANCE hInst = AfxGetInstanceHandle();
だとどーなる?
140デフォルトの名無しさん:04/01/17 14:32
>>135
> 2000以降で GetLastInputInfo。
> 9x系まで考えれば無い。

ありがとうございました。
たぶん自分では探し出すことができなかったと思います。
コモンコントロールで教えて下さい。
ステータスバーやツールバーをつけたWindow内に子Windowを作るとツールバーやステータスバーの
上に子Windowが描画されてしまうんですが、これはどうやって回避するんでしょうか?
142デフォルトの名無しさん:04/01/17 19:38
: error C2440: '=' : 'long (__stdcall CDebugPrint::*)(struct HWND__ *,unsigned int,unsigned int,long)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換すること
はできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。

というエラーがでます。
ウィンドウクラスを定義する関数を作って、その中でクラスの定義を行っているのですが、それがいけないのでしょうか?
また、その関数はクラス内のメンバ関数です。
答えにもっと情報が必要ならば返信します。よろしくお願いいたします。
143142:04/01/17 19:56
自己解決。乱文すいませんでした。
144142:04/01/18 01:04
すいません。やっぱわかってないみたいです。
ご教授のほうよろしくお願いしますm(__)m
クラスのメンバ関数を普通の関数として使うことはできない。
普通の関数かstaticメンバ関数にする。

なんどめだナウシカ
146142:04/01/18 03:30
>>145
ありがとうございます。
147デフォルトの名無しさん:04/01/18 04:38
RegisterClassEx()がNULLを返す場合とは、どのような事情があるんでしょうか?
>>147

関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。
149高校生:04/01/18 11:11
spy++を使っていて気になったんですが、
あのウインドウの枠を強調表示するにはどのようなAPIを使えばいいのでしょうか?
それとも、あれはspy++が自前で描画しているのでしょうか?
自前で描画してる
151デフォルトの名無しさん:04/01/18 11:51
MCIに関して質問です。

フォーマットをMILLISECONDSにした状態で
CDのトラック毎の始めと終わりの正確な位置を知りたいのですが、どうしたらいいでしょうか?
>>127
ATコマンド直打ちでやったような気がする
>>149
Draw〜であったと思うけど忘れた
154147:04/01/18 16:53
>>148
ありがとうございます。
エラー情報の獲得等扱って、エラーコードを見たんですが、
エラーコードは「0」でした。。。
CreateWindowから帰ってきた値が「0」だったので、えらーが起きてると思い、
エラーコードを獲得したら、それも「0」でした。
エラーコードの獲得は、えらーが起きたと思われる関数の直後に呼び出す。で
いいんですよね?
155141:04/01/18 17:05
コモンコントロールって誰も理解できない程のハイテクなんすか?
>>155
バーの分だけ子ウィンドウを小さくしろ
157 :04/01/18 17:12
void Test(int n = 2, int m = 2 ){
return;
}

引数が2つあって、1、2番目ともデフォルト値がきまっているとします
このとき、
2番目だけ値を設定したい場合

Test(○ ,1); ○の1番目はどうしたらいいですか?
どこがWin32APIの質問なんだ
>>154
CreateWindow?
RegisterClassExの直後じゃないの
>>157
自分で値を入れるしかない。
プロトタイプで n=2 はわかっているわけだから
不可能ではないでそ。
WinAPIについて分かってないのが結構入ってくるな…
もしかしてWinでつくるAPplIについての総合質問だと思われてないか?
たしか非MFCのウインドウズプログラミングスレと統合したんじゃなかったか?
API質問(だけの)スレなんていまさらほとんど需要ないだろうし
大抵の質問者はウインドウズプログラム一般として扱ってると思うぞ
163151:04/01/18 20:42
スレ違いでしたか・・?
164デフォルトの名無しさん:04/01/18 21:07
>>162
>API質問(だけの)スレなんていまさらほとんど需要ないだろうし
私物化すんな

# デフォルトCなのは賛成しながらも疑問だが
>>163
指摘されているのは、あんたじゃない。

>>157 とかだよ。
166デフォルトの名無しさん:04/01/18 22:09
複数のウィンドウプロシージャ間で変数の値を渡す(共有する)にはどうしたらいいですか?
167 :04/01/18 22:19
ばかやろう!
他のスレでスレ違いとかいわれりゃ
じゃこっちのスレで質問すればええかと思って貼ってんじゃネーかよ
なにがマルチじゃ ボケ、そんなことでわざわざ書くなよ 暇人が
アホどもが バーカ
168デフォルトの名無しさん:04/01/18 22:24
DDBで1ピクセル単位の操作をしたいのですが、可能でしょうか?
DIBに変更すれば出来るのはわかっているのですが、できればDDBのままでやりたいです
とりあえず、DDB画像中の指定した位置の1ピクセル分の値を得るということをしたいのですが・・・
>>167
しね
SetPixel/GetPixelで良いじゃん
別にこれはイメージをDIBに変更しているわけじゃないし。
>>167
> じゃこっちのスレで質問すればええかと思って貼ってんじゃネーかよ

>>> あらゆる質問はまず すれ立てるまでもない質問はここで スレにしてください。 <<<

板のルールも守れないくせに暴れるな。

ちなみに、答えは向こうのスレの 160 で出てる。

せっかく答えを書いても、マルチする奴はこいつみたいに元の方を見なかったりするから嫌われる。
懺悔します。
私、コモンコントロールをサブクラス化したくって
 original = (WNDPROC)SetWinidowLong(hwnd, GWL_WNDPROC, (LONG)myWndProc);
ってやって、その myWndProc の中の最後で CallWindowProc 使わずに
 return (original)(hwnd, msg, wparam, lparam);
とかやってました (;´Д`)
だって Win2k で問題なく動くんだもん (;´Д`)
WinMe(たぶん9x系全部) だと挙動不審 (;´Д`) ていうか発狂
>>151
MCI つってもいろいろあると思うんだが、
mciSendString を使ってるんなら、status コマンドか何かでいけた気がする。
とりあえず、ぐぐれ。
>>172
それでコンパイル通るのか...
試したくなってきた!!!
>>172
それのどこがダメなのかがわからない・・・
>>172
ウィンドウの文字コード(A or W)が一致していれば、一応動くんじゃない?
UNICODEでビルドしてたのか?
>176
172ではありませんが
w95 EDITで死にました(当然 A)。
WinNTで、QT_Thunkのようなレイヤってないですかね?
>>178
「実は16ビットで実装してますた」というものはNTには
一切ないからできても無意味だと思うが。
何がやりたいのかもっと具体的に書くべし
9x系とNT系を判別して、A系とW系を使い分けているのですが、
これを9x系のOSで実行しようとすると、使っていないW系のコードが入っているだけで、
プログラム開始エラーになります。
コメントアウトすると動くことを確認していますし、W系の場所が呼ばれていないことも確認しました。
一体何が原因でしょうか。こういう場合、どうしたらいいのか、教えてください。
dllで呼び分けるとかだめ?
>>180
・GetProcAddressを使って動的にAPIをロードする。
・DLLの遅延ロードを使用する。
・TCHARマクロ等で9x/NTでバイナリを分ける。
・9xでサポートされていないAPIは使用しない。
9xでもW系のAPIはスタブが入ってるから
存在するだけでエラーが出るのは
単にAPIのサポートの問題だと思うが
>>179
WinNT上のWin32アプリからでWin16DLLを呼び出したいということです。

DLLのソースを失い32bit化することが出来ないので
そのまま再利用したいのです。
mciSendCommandです

少し前はTMSFフォーマットで操作させていたため、トラックの始めの箇所を指定するのは容易でしたが
今回スライダーを導入するため、フォーマットをミリセコンドにしました。

とりあえずぐぐってもMSDNとにらめっこしてもわからなかったので、質問したわけです(^-^;)
186高校生:04/01/19 16:50
この前、アクロバットリーダー6.0をインストールしたら、
英文の読み上げ機能がついていました。
これをやりたいのですが、どうも情報がありません、
MSAAというものだとは思うのですが。
じゃぁMSAAについて調べたらできるよ
188高校生:04/01/19 17:14
ググっても、MSAAとは何ぞや的なサイトしかヒットしません。
MSDNでも、障害者にも使いやすいデザインなんかがあります。
具体的にどうすれば使えるのか、説明しているところはありませんか?
189デフォルトの名無しさん:04/01/19 17:32
スレッドを作成するとそのハンドルが作成されますが、このハンドル
以外にも生成したスレッドに渡るハンドルというものがあるのでしょうか?

作成するスレッドの処理の先頭にブレークポイントを設定し、
スレッド作成元にてCreateThredやbeginethreadexをコール
すると当然ハンドルがひとつ増加しますが、
その後スレッド処理の先頭にブレークがかかった際に再度ハンドル数を
確認すると何故か更にひとつ増加しており、このハンドルがクローズ
できずに困っております。

初心者ですみませんがご存知の方よろしくお願いいたします。
生成されたスレッドは自分自身への参照を持つ。
スレッドが終了すれば消える。
CreateThreadが返したハンドルを閉じただけで参照カウントが
0になったらまだスレッドが生きてるのにスレッド情報が
開放されてまずいでしょ
191185:04/01/19 17:46
自己解決しました、申し訳ありません。

やり方としては、FORMAT_TMSFにして、トラックの先頭を指定し、その位置にシークさせ
それからFORMAT_MILLISECONDSに戻して、その位置を取得することで出来ました。
192デフォルトの名無しさん:04/01/19 18:02
>>190
すばやい回答ありがとうございます。
助かります。

スレッド側でハンドルが増えるのは当然のことだったのですね。

スレッド側でExitThreadや_endthreadexをコールし、その後スレッド
作成側でWaitForSingleObjectでスレッド終了を待った後、
スレッドハンドルをクローズしてもハンドルが一つ増えたままになって
いたので、スレッド側で増加したハンドルもクローズする必要が
あるのかと思ってしまいました。

スレッド終了でクローズされるということは、当方のスレッド終了
方法に問題があるようです・・・処理を見直してみます。
>>186
このへんは見てみた?
ttp://www.microsoft.com/speech/download/sdk51/
>>191 mciSendStringだけど、こんなのもあるよん。
ttp://twin-tail.jp/contents/pg_tips/tips001.htm
>>184
サンクという仕組みで32bit<->16bit相互に呼び出せる。
別に難しいこたぁない。
thunk とか WOWでぐぐれ。
windowsXPでnotepad.exeのロードアドレスは、0x01000000になりますが、
これのメリットって何ですか。
スナックのママに自慢できる
キャバ嬢にモテる
弱酸性で地肌にやさしい(赤ちゃんも洗えます)
200Gets!
>>197
それ、すごいな!
>>201
スナックのママはなんでも聞いてくれるけど
APIについては教えてくれないからな
盛り上がってるところすみません。
外部アプリ、例えばメモ帳が起動された事を常に検知したいのですがどのようにすれば可能でしょうか?
そこで右フックだ!
>>203
見張る
FindWindowしまくる
207高校生:04/01/20 17:34
>>193
おお、こんなところにSDKが! おーしこれを使えば……ってデカすぎ!

>サンプルコードとドキュメント、SAPIと開発用のUS版スピーチエンジンが欲しいなら、Speech SDK 5.1 fileを落とせ。

>日本語版や中国版の開発用エンジンが欲しいのなら、Speech SDK 5.1 Language Pack fileも落とせ。

>もし、製品にスピーチAPIやスピーチエンジンを組み込み、製品として配布したいなら、Speech 5.1 SDK Redistributables; All fileを落とせ。

解釈は間違っていませんよね? やれやれ、理系なのに数学が赤点ギリギリで、英語がトップな香具師(=漏れ)はそういないと思います。

それにしてもデカいなあ。
Speech SDK 5.1だけで68MB
Language Packが81.5MB
Redist : Allに至っては131.58MB

とりあえず落とすのはSDKと言語パックか、これだけで149.5MB。
ところで、最後のRedist : Allは落とす必要がありますか? 商用目的でなければいいの?
208高校生:04/01/20 17:41
組み込む(原意:統合する)ってどう言うことでしょうか?
=アプリ内で使う、と思われ。それで英語トップ?
インストールができませんとか言って来そうだよな…(w
RedistributablesはSpeech APIを使ったアプリの動作に必要なファイル一式だベ。
藻前はSDK入れとけばいいけど、エンドユーザにはRedistributablesが
必要になる。
>>203
NOTEPAD.EXEを挿げ替えるだな
ローテク侮るべからず
>>195
WinNTで32bit→16bitはないと思うが。逆はあるけど
>>203
if メモ帳が起動されている ニョホ
これをループしまくる
>>214
ツェペリは(ry
みなさんありがとうございます。

やっぱしそうそう都合のいいメッセージとかないんですね。
期待していたのは「アプリが起動された事のメッセージが
通知される」事だったんですが、そんなのいちいち全アプ
リに発行なんてしてらんないですもんね。

>204さんや>205さんのようにフックで見張って>206さんや
>214さんのようにFindWindowとかでやるしかなさそうですね。
>212さん「挿げ替える」辞書で調べました。
実際はNOTEPAD.EXEだけじゃないので今回は駄目なようです。

FindWindowとかは実際はタイマーでチェックするんでしょう
けど、そうするとタイミングによっては駄目なので、仕様から
見直してみます。

ありがとうございました。
>>216
タイマーでFindWindowって…
フックの使い方知ってる?
スレッドでfindwindow!(プ
>217-218さん
マウスとキーボードのフック位しか経験ないです。
では、今回の場合は何をフックすればいいのか…
まぁ私がバカな事を言ってるのでしょうからこれでお終いでいいです。
バカなりに調べてみます。
フックとFindWindowを同時に使おうというのが根本的に間違い
まったくの別物
↓こんなコードでアプリの置かれた環境独自の数を取得できますか?
#include <windows.h>

int get_serial()
{
    char drive[MAX_PATH];
    GetWindowsDirectory(&drive[0], MAX_PATH);
    drive[3] = '\0';
    DWORD serial;
    if(!GetVolumeInformation(&drive[0], 0, 0, &serial, 0, 0, 0, 0))
    {
        return 0;
    }
    else
    {
        return serial;
    }
}
>>221
コード読むのマンドクセ
環境独自の数ってなんだよ
223高校生:04/01/21 16:56
環境変数の数のこと?
Winがインスコされてるボリュームのシリアル番号を、MACアドレスみたいな
ものとしてみなせるかみなせるかって話しだと思う。
>>222-224
読みにくいコード、非常に申し訳ありません。
224さんの仰るとおりです。ただ、完全に唯一無二である
必要はなく、同じ物があまりでない程度でいいのですが…
メーカー製PCの同一モデルとかって、どうなってるんだろうか?<ボリュームのシリアル番号
以前、販売しているフォーマット済みFDを数枚試してみたらシリアルは全部0だった。
あと、OSのシリアルとかは割れを除いても、会社で複数台同じPC購入するとOS入れなおしのときに
別のマシンのシリアルいれたり、複数台入れなおすときなんて全部同じシリアル入れるとかへーき
>>216
メディアプレイヤが起動してるかチェックしたときに使ったコード

hWnd = ::FindWindow(NULL,_T("Windows Media Player"));
if(hWnd){
::SendMessage(hWnd,WM_CLOSE,NULL,NULL);
Sleep(1000);
}
これをループで回せばいいんじゃないのか
>>227
うちでは数枚同じものがありました。
>>228
それはWindows xpのProduct Activationにも使えますか?
フロッピーのボリュームIDに意味はないだろ。
diskcopyで同じディスク作れるし。

>>230
XPは知らんけど、2000まではサイトライセンスというものがあって、
複数マシンに同じProduct IDでインストールするようになっていた。
だから、OSのProduct IDはマシンの区別には役立たないと思った方がいい。
勉強中の分際でシェアウェアでも作るつもりか?
233デフォルトの名無しさん:04/01/22 07:26
WindowsのTCP/IPのプロパティで設定されている
DNSサーバーの設定を取得する方法をご存知の方、
教えていただけないでしょうか。
>>229
これ
起動されることを確認じゃなくて
起動していることを確認だね

起動していることが前提ならメッセージフックだって可能
>>234
ループで回して監視してりゃいいんでないの?
どっちも一緒でしょ
>233
GetPerAdapterInfo
GetAdaptersAddresses
あたりでねーか。
あ、GetNetworkParamsもあったな。
238デフォルトの名無しさん:04/01/22 15:35
CreateFontにある文字の高さとセルの高さの違いを教えてください
内部レディングを含めるかどうか。
240高校生:04/01/22 16:11
友達にSpeech SDKを落としてもらいました。
今日インストールするつもりです。
どうもマイクが必要なようですね。
241高校生:04/01/22 16:13
なるほどこのスレは名前に高校生と入れると何を書き込んでもいいんですね
242高校生:04/01/22 16:43
ここまでで、241以外の『高校生』は皆同一人物です。
243高校生:04/01/22 16:44
   (V)∧_∧(V)
    ヽ(・ω・)ノ  フォッフォッフォッ
.     /  /
    ノ ̄ゝ


.          (V)∧_∧(V)
           ヽ(   )ノ  フォッフォッフォッフォッ
.           /  /
       .......... ノ ̄ゝ
別に、音声入力しないならマイクは要らんだろ。
>>232
いやいや、まさか^^;
ちとProduct Activationに興味を持っただけです。
皆さん、ありがとうございました。
Product Activationはヴォリュームのシリアル番号も見てたよな
247デフォルトの名無しさん:04/01/23 00:55
WindowsXPでエクスプローラなどから mpeg や jpeg などの動画や画像ファイルの
プロパティを見ると、「概要」タグがありキーワードやコメントなどを編集することができますが、
このキーワードやコメントをファイルから読み書きするためのAPIといったものが用意されているのでしょうか?
MSDNで探すにもキーワードが間違っているのか見つかりませんでした。
ヒント、キーワードだけでもいいのでよろしくお願いします。
>>247
ヘッダーのコメント部分かなんかに書いてあるだけじゃねぇえの?
249247:04/01/23 01:07
>>248
そう思い、コメント、キーワードの文字列を変更してバイナリエディタで比較したのですが
Jpegに関しては Exif フォーマットでヘッダー部にコメントなどが埋め込まれ実際にファイルサイズも変わります。
しかしMpegの場合はコメントなどを変更してもファイルサイズ、中身はまったく変わらないのです。
そのためOSの機能としてAPIが提供されているのではないかと思いまして。
それって動画じゃなくて実行ファイルでも出るんじゃね?
多分NTFSのオルタナティブストリームじゃないか?
251247:04/01/23 01:14
>>250
NTFSファイルシステムの機能として用意されているかもしれないということですね。
ありがとうございました。
おまい、NTFSは何の略か言ってみろ。
253247:04/01/23 03:37
>>252
「Exifフォーマット」も同じ間違いですね。すいやせん。
254デフォルトの名無しさん:04/01/23 10:18
jpegやpngをDDBなどに読み込んでビットマップのように表示したいのですがそのためのAPIとかはあるんでしょうか?
それ用のライブラリなんかを使わないとダメでしょうか?
>>225
ユニークな識別子を作るというならCoCreateGuidがあるけど。
>>254

Win98/2000以降ならBITMAPINFOHEADERのbiCompressionにBI_JPEG/BI_PNGで
SetDIBitsToDevice()でいけそうだという話もあるが、素直にlibjpeg/libpng使った
ほうが多分楽。

後はOleLoadPictureもその辺のフォーマットサポートしてた気もするが。
jpeg/pngはディスプレイデバイスではサポートされてないそうだが
258254:04/01/23 11:31
レスありがとうございます。
取り合えずlibjpeg/libpngでやってみようと思います
GDI+が忘れられている・・・
260高校生:04/01/23 15:52
インストールできました。
今までのサム君に加えて、マイク君とマリーちゃんが使えるようになりました。
だが、肝心のC++のチュートリアルサンプルが動かない。
コーヒーっていう音声認識のサンプルです。
CreateWindow時にエラーとなってしまいました。
さらにデバッガで追っていくと、
WM_CREATE時に、
初期化をしていて、そこでエラーになっているようです。
ISpRecoGrammar::LoadCmdFromResourceの戻り値が、-2147200942となっていました。。

SPERR_LANGID_MISMATCH 0x80045052 -2147200942
An attempt to load a CFG grammar with a LANGID different than other loaded grammars.

う〜む。どこで読み込んだものが、互いに違っているのか?
すでにあったコンパイル済みのものを動かしてもエラーになるし……。
LanguagePackあてておかしくなったとか...
262高校生:04/01/23 17:04
>>261
なるほど、確かにLanguagePackをあてています。
さて、どうすればいいのでしょうか?
コントロールパネルで標準の音声認識エンジンを変えればいいのでしょうか?
それとも、パックをアンインストールする必要があるのでしょうか?
>>255
ハードウェアが変わらない条件下では何度呼び出しても
常に同じSerial Numberを生成するようにしたかったので、
CoCreateGuidは使えないんです。
せっかくレスいただいたのに、申し訳ありません。
自分がDQNだとわかっているなら自制しろ
265233:04/01/24 04:32
>>236-237
遅レスで申し訳ないです。
ありがとうございます。
GetNetworkParamsで取得できました。
探したらサンプルもありました。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/getnetworkparams.asp
266高校生:04/01/24 11:17
コントロールパネルの音声認識に、新しいタブができていました。
プログラミング以前の質問、申し訳ありません。
267デフォルトの名無しさん:04/01/24 13:21
API じゃ無いけどここで良いかな?

たまーに Segmentation Violation なんかで異常終了してしまう DLL を呼ぶ
必要があるんだけど、この手の DLL 側の致命的エラーでアプリケーション
自体を異常終了させたくない時どうすれば良いですか? 出来れば「○○が
異常終了しました」とかポップアップ出して操作を続行させたいんですけど。
Win32構造化例外を捕捉する。
>>268
__try〜__except(...) って奴ですか? 調べてみます、どうもでした。
> __try〜__except(...) って奴ですか? 調べてみます、どうもでした。
ちがぁ〜う! ちゃんと嫁。
>>268 は"Win32構造化例外"って、ちゃんと書いてんだろが。
C++例外とSEHを混同すんな。
>>270
C++の例外はtry〜catch()〜だろ。
VC++だとcatch(...)でSEHまで捕捉されるけどな。
272デフォルトの名無しさん:04/01/24 16:33
プリンタの設定を変更したいのですが、VBからDocumentProperties APIを呼び出し、以下のように実行すると、
2回目のDocumentProperties で ERROR_INSUFFICIENT_BUFFER (システムコールに渡されるデータ領域が小さすぎま)というエラーが出ます。
この原因が分かりません。バッファのサイズは十分にとってあります。(そもそも bytDevMode はポインタ(byref) で渡しているのでデータ領域が分かるかどうかが疑問です。。。)
どのような原因が考えられるでしょうか?
もしご存知の方がいらっしゃいましたらよろしくお願いいたします。

' DEVMODE構造体のバッファサイズを取得
lngBufSize = _
DocumentProperties(Me.hWnd, _
lnghPrinter, _
Printer.DeviceName, _
ByVal vbNullString, _
ByVal vbNullString, _
0)
ReDim bytDevMode(lngBufSize - 1)
' 現在の設定を取得
lngWin32apiResultCode = _
DocumentProperties(Me.hWnd, _
lnghPrinter, _
Printer.DeviceName, _
bytDevMode(0), _
ByVal vbNullString, _
DM_OUT_BUFFER)
>>272
bytDevMode (=DEVMODE 構造体) の dmSize を指定し忘れているんじゃないか ?

http://msdn.microsoft.com/library/en-us/gdi/prntspol_8nle.asp
274272:04/01/24 17:29
>>273

ご回答ありがとうございます。
bytDevMode の dmSize (bytDevMode(36),(37))に値(=156)を入力して
みましたが、やはりうまくいかないようです。
DM_OUT_BUFFER を指定しているので構造体を取得するだけなので、
bytDevMode は初期値のまま(0クリア)で渡していました。
APIでは、こちらに渡すときに、サイズのチェックとかがあって
渡す必要があるのでしょうか?






>>274
ちょっと、DocumentProperties の Declare 定義見せてくれる ?
あと、dmSize に値入れる時のエンディアンは問題ないよね ?
276272:04/01/24 18:23
>>275

>ちょっと、DocumentProperties の Declare 定義見せてくれる ?
Declare 定義です。

Declare Function DocumentProperties Lib "winspool.drv" _
Alias "DocumentPropertiesA" _
(ByVal hWnd As Long, _
ByVal hPrinter As Long, _
ByVal pDeviceName As String, _
pDevModeOutput As Any, _
pDevModeInput As Any, _
ByVal fMode As Long) As Long

>あと、dmSize に値入れる時のエンディアンは問題ないよね ?
bytDevMode(36) = 156
bytDevMode(37) = 0
としました。おそらく大丈夫だと思います。


引数の渡し方の問題でしょうか?
bytDevMode は、受け取るときはdmSizeだけに値を入れたのですが、
他にも設定が必要な項目がありますか?
277デフォルトの名無しさん:04/01/24 18:25
実行プログラム自身のファイル名を取得する方法を教えてください。
開発環境はVisualStudio C++で、非コンソールプログラムになります。

コンソールプログラムならば main関数の argv[0]がファイル名になりますが、非コンソール
プログラムの場合はどうすれば良いかと悩んでいるというわけです。
>>277
GetModuleFileName
279デフォルトの名無しさん:04/01/24 18:42
>>278
こんなAPIがあったんですね。ありがとうございました。後日、試してみます。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdllpro/html/_win32_getmodulefilename.asp
Win32APIに関係ないかもしれませんが、WindowsのProduct Idは、
全バージョンのWindowsにおいて、レジストリの
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
で取得することができますか?
できま
どっち(w
未来永劫そうなるとは誰もいえない
お聞きします。
通信系のプログラムをつくっていますが、
RS232Cを複数回線つかうと、
Win95上で動作させたときにくらべて
Win2000/XPで動作させたほうが遅くなります。
しかもWin95はPentium100Mで動作、
Win2000はPentium3で動作させているにもかかわらず、です。
何か対処策があるでしょうか。
OSによって処理を分ける
シリアルポートのコントローラ、ドライバ、BIOS設定が違うから。
287デフォルトの名無しさん:04/01/25 03:42
APIを使って、FTPからサブディレクトリを含む全てのファイル名を
取得したいんだけど、どうやったらいいですか?
FtpFindFirstFileとやらを使うってのは分かったんだけど
サブディレクトリ以下が取得できない( ´・ω・)
教えてくださいませ。
自分で再帰的にたどるしかないだろう。
下手するとものすごい時間を取るだろうが。
NetBios名をつかった通信はできるのでしょうか。
プロトコルはNetBeuiのみで、です。
>>272
http://www.galliver.co.jp/writing/nikkei_tokushu/prn908/index.html
ここのコードを見る限り、dmSizeの指定は不要では?

Me.hWnd, lnghPrinter, Printer.DeviceName,ngBufSize,はちゃんと取得できてる?
Redim()の値を巨大(数万)にして試してみては。
ちなみに、我が家のプリンタだとDEVMODE構造体のサイズは1000バイトぐらいだったよ。
bytDevMode の配列の宣言はどうなってる?
あと、Option Base 1 にはしてないよね。

>>287
APIでなくていいならNLST
>>289
名前つきパイプ。Mailslot。

つか、「できますか?」って聞いてるってことは答えはbool値でいいのか?
293289:04/01/25 12:43
292殿、ありがとうございました。
調べてみます。
質問の仕方も勉強しときます。。。
>>289
マルチしたら後始末ぐらいしろ!
使用するWin32APIについて教えていただきたく思い質問致します。
古いスタイルのオープンダイアログにおいて(OFN_ALLOWMULTISELECTをしていするオープンダイアログ)
右側にあるディレクトリを選択するツリービューを作成するにはどのようなWin32APIを使用すればいいのでしょうか。
ツリービューで自作しようと試みたのですが、あそこまで快適なものをつくるには私はあまりにもスキル不足です。
どうかご教授お願いします。
>>295
IShellViewかIShellFolderでググルと答えが見つかるかも?
297デフォルトの名無しさん:04/01/25 19:02
>>288
どうやって再帰的にたどるんですか?
最初にファイルだけ取得して、その次にディレクトリみたいに
たどるんですか?ん?なんか訳分からなくなってきた。
>>297
FtpFindFirstFile()とInternetFindNextFile()の組み合わせでディレクトリ内の
サブディレクトリを含めたファイルのリストが取得できる。
そのうち属性がディレクトリのものに対してそのディレクトリに移動して以下略。
WIN32_FIND_DATAについても調べろ。
>297
ファイル/フォルダを再帰的にたどった経験は無いのか?
300297:04/01/25 19:45
う〜む
下みたいに書いてみたけど、最初のサブディレクトリ見に行ったら終わっちゃう・・・
再帰が終わったあたりにFtpFindFirstFileをもう1回使ってみたら、今度は、
無限ループみたいになるよ。検索の開始位置って指定できるの?

Private Sub serFtpFile(strPath As String, lFtpSession As Long)
Dim lFindSession As Long
Dim lRs As Long
Dim tmpFileInfo As WIN32_FIND_DATA
Dim strTmp As String

mSerPath = strPath
lFindSession = FtpFindFirstFile(lFtpSession, mSerPath, tmpFileInfo, INTERNET_FLAG_RELOAD, 0&)

If lFindSession <> 0 Then
Do
mFtpFileNum = mFtpFileNum + 1
ReDim Preserve mFtpFileInfo(mFtpFileNum) As WIN32_FIND_DATA
mFtpFileInfo(mFtpFileNum) = tmpFileInfo

If tmpFileInfo.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then
DoEvents

301297:04/01/25 19:46
続き

strTmp = strPath & StrConv(mFtpFileInfo(mFtpFileNum).cFileName, vbUnicode)
strTmp = left(strTmp, InStr(strTmp, vbNullChar) - 1) & "/"
lRs = InternetCloseHandle(lFindSession)
Call serFtpFile(strTmp, lFtpSession)

mSerPath = left$(mSerPath, InStrRev(mSerPath, "/", Len(mSerPath) - 1))

End If

lRs = InternetFindNextFile(lFindSession, tmpFileInfo)
If lRs = 0 Then Exit Do
Loop

End If
lRs = InternetCloseHandle(lFindSession)

End Sub
302297:04/01/25 19:47
うわ、見難い・・・
>>297
ローカルファイルだとこんな感じになるみたいだね。

http://www.sm.rim.or.jp/~shishido/subdir.html
C言語からやり直しましょう
Cかよ!
>302-303

MFC でエクスプローラ風のFTPクライアントのサンプル作ったことあるけど、
再帰的処理はできずじまいだった。

ひとつのFTPセッションに対して複数の検索セッションを
作成することはできないような動作だった。

つまり Folder1/Folder2/Folder3 の階層があるとして、
Folder1 のファイル/フォルダを列挙している最中に、
再帰的に Folder2 のフォルダを列挙しようとしても
Folder1 ですでに検索セッションが使われているから
Folder2 の検索セッションの作成に失敗するみたいな。

以上、経験則です(根拠はありません)
ポップアップメニュー(TrackPopupMenu)についての質問です。

ボタンを利用したメニュー(CreateToolbarEx)を作成しているのですが、
ポップアップメニューがモーダルなのか、
表示させたまま他のメニューを検知することが出来ずに悩んでいます。
(例えば「ファイル」のポップアップメニューを表示させたまま「編集」にマウスを移動させても、
「編集」のメニューが表示されないということです。)

専用のメッセージがあるのでしょうか?
それともポップアップメニュー側で何らかの処理をしなければならないのでしょうか?

(BCC + BCC Developer で作成しています。)
308297:04/01/25 21:34
>>306
エー、そんな〜( ´・ω・)
>>308
マルチセッションじゃなくてひとつの列挙が終わるまで待って次にいけばいいだけ
310306:04/01/25 21:53
>308
まあ、そのサンプルではフォルダツリーを展開するタイミングでファイル、
ファイル/フォルダ一覧を列挙するようにしたから支障はなかったけどね。

まあ俺の経験則が事実だったとしても
フォルダ内のファイル/フォルダを列挙、検索セッションをクローズした後で、
サブフォルダを再起処理すれば、検索セッションは複数になることはないから
階層が深くなっても列挙できると思われ。
311306:04/01/25 21:55
う、先を越された。。。
FFFTPのソースでも見てみたら。
313デフォルトの名無しさん:04/01/25 22:19
API本に載ってた以下のコードで「未定義のシンボル item」という
コンパイルエラーが出ます。(コンパイラはBCC)

TVINSERTSTRUCT tvs;
tvs.item.mask = TVIF_TEXT;

試しに tvs.DUMMYUNIONNAME.item.mask = TVIF_TEXT;
と打ってみたらコンパイルが通ってプログラムも動いたのですが
ネットで検索してもどのサンプルコードも tvs.item.mask
という風になっているのでどこか自分が間違っていると思うのですが
どこが悪いんでしょう?
>>313
#define _WIN32_IE 0x0300
こんなの使ったら出なくなるだろうね。 なんで共用体使ってるかは知りません。
TVINSERTSTRUCT tvis;
CString str;

// ルートは1つだけの方が良いです。
tvis.hParent = TVI_ROOT;
tvis.hInsertAfter = TVI_FIRST;
tvis.itemex.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;;
tvis.itemex.pszText = "ルート";
tvis.itemex.iImage = 0;// 通常時の画像
tvis.itemex.iSelectedImage = 1;// アイテムが選択されたときの画像

俺のサンプルコードでは itemex 使ってるな。
VC++だけど。
たぶんUNION周りの言語仕様に関係あるんでは?
構造体の定義を見ると、
#define _WIN32_IE 0x0300
だとUNIONが含まれないから、逆に
item を選べると思う。
>>314-316
#define _WIN32_IE 0x0300 を試してみましたがうまくいかずです。
ちょっと簡単にわかりそうにないんでしばらく共用体名を入れて打ってみます。
キーワードをURLエンコードしたのを検索エンジンのURLにつなげてブラウザに渡すツールを
作ってるんですが、SJISとEUCにはとりあえず対応できたのですがUTF-8に対応できないでいます。
文字列を UTF-8 に変換
http://www.geocities.co.jp/SilkRoad/4511/vb/utf8.htm
このページの人と同じくwin95でも使いたいのですが(できるだけ)win32apiだけをつかって
実現するにはどうしたらいいでしょう?BCCで、なんですが。
UCS2だかUTF-16に変換した後
ルールに沿ってUTF-8にすればいい
3201/2:04/01/25 23:49
現在、Win32 API で画像ビューアを作ろうとしています。
(使用するためというよりは、勉強のためです)

現在の仕様は

1. CreateDIBSection() でオフスクリーン(クライアント領域のコピー元)を作成。
  (BMP-A)
  ※ サイズは GetClientRect() で取得したサイズ分です。
2. 表示対象画像を CreateDIBSection() で作成した領域にロードする。
  (BMP-B)
3. ロード完了時に BMP-B をオフスクリーンである BMP-A に StretchDIBits() で
  転送する。
4. WM_PAINT メッセージではオフスクリーンである BMP-A を BeginPaint() で
  取得した物理デバイスコンテキストに対して StretchDIBits() で転送する。

以上のような感じで作っています。
初めは、オフスクリーンと呼ばれる物を介さず、ロード画像である BMP-B を
直接物理デバイスコンテキストに転送していたため、チラツキがあったのですが
この問題を解消する事ができました。
3212/2:04/01/25 23:49
しかし、この状態でウィンドウのサイズを変更されると
オフスクリーンは、元の大きさのクライアント領域のサイズ分しか
持っていないためウィンドウサイズを大きくされると左上に寄って
表示されてしまいます。

色々考えて、現在のディスプレイの解像度分の大きさを確保すれば
どんなにウィンドウサイズを大きくしてもそれを超える事は無いと
思ったのですが、起動中に解像度を変更されたときの事なども
考慮しなくてはならなかったりと、苦戦中です。

そこで質問なのですが、画像ビューアなどのアプリケーションは
どんな仕組みで作っているのですか?
それとも、現在作成中の画像ビューアの仕様の考え方は
根本から間違っているのでしょうか?

いろいろ考えたのですが、なかなか良い方法が思いつきません。
よろしくおねがいします。
ウィンドウのサイズが変更されたら裏画面作り直せばいいんでないの?
323318:04/01/26 00:23
>>319
>UCS2だかUTF-16に変換した後
…それはどうやればいいのでしょう?
>>323
そんくらい[win32api UTF-16 変換]くらいでぐぐれよ。
ttp://forums.belution.com/ja/vc/000/191/89.shtml ここでも見てろ
325297:04/01/26 00:34
>>310
ヽ(´∀`)ノでけたー
ありがとー
326320:04/01/26 01:18
>>322
レスありがとうございます。
タスクマネージャを起動しながらフリーの画像ビューアを動かして
メモリの動きを観察したのですが、画像オープン時にメモリに動きはありましたが
ウィンドウサイズを変更したり拡大や縮小を行ってもメモリに変化がなかったため
何か特殊な方法があるのかなと思い質問してみました。

良いお知恵をお持ちの方がいましたらよろしくおねがいします。
>>326
普通の画像ビューワは裏画面使わず、元画像をStretchDIBitsで直接表示してると思うけど。
モノが画像ビュワーなんだから、

・画像ファイルのサイズにあわせたDIBSectionを作ってそこに画像展開。
・描画要求があった場合適宜そこからBitBlt。

だろ、普通。
ちなみに最小ウィンドウサイズ以下の画像を読んだときは最小ウィンドウサイズに
あわせたDIBSectionを背景色で塗りつぶしてから画像展開、
最大ウィンドウサイズは画像サイズまでに制限、ということをしておくと
WM_ERASEBKGNDを省けるのでウィンドウリサイズ時のちらつきがほぼなくなる。
VBプログラマ質問スレ(6.0以前) Part31から来ました

客先からメッセージボックスの変更以来がありました
"続行","再入力"と"続行","中止"です。
オリジナルでダイアログボックスを作ってはダメ
といわれました。どうすればキャプションを変更できるのでしょう?
そんな客との取引をやめる。
別スレッドからボタンのテキストを書き換える
MB_CANCELTRYCONTINUE
で作ってあとは運用回避って仕様にしてもらう
>>320
ビューポートとかそのあたりを調べてみたらいーと思う。
334デフォルトの名無しさん:04/01/26 17:43
すいません。
writefile関数を使ってファイルに出力しようとしているのですが

***********,
*******,
のように1つのデータをカンマで区切って改行させたいのですが
ご教授ください。
VC WindowsXPです。
writefile("***********, \n*******, \n");
>>334
Win32APIとは特に関係ないかと。
文字列バッファ確保して [,]を[,\n]に置き換えて保存。

あたりまえだが、WriteFileってバッファの内容をを保存する関数です。
バッファの内容を書き換えるのは自分自身。
改行させたいなら\r\nにしないと化けるぞ
質問があってここにきました。
まだまだ全然理解してないですけど、一応C2年目になる社会人プログラマーです。

http://www.ise-ics.co.jp/ics/system/virtualcomportcontents.htm

↑のモノに近いというか、まんまなんですけど
仮想的にシリアルポートを作るモノを作れと、先週から依頼されました。

自分の知識と周りの人に聞いてもお手上げ状態です。
説明しづらいですが、どこから入っていいか解からないので
何かアドバイスあればお願いします。
>>338
この辺を取っ掛かりにしてみては?
http://allabout.co.jp/career/clerk/closeup/CU20030705A/
340一星 ◆lLk3AcE9Dg :04/01/26 21:40
 ここ投稿頻度すごいな……。
>>338
第1段階:シリアルポートの通信を理解する
第2段階:ソケット通信を理解する
第3段階:両者のIFを橋渡しする

今どのへんなんだ?
>>341
今はまだ、木曜までにスケジューリングするとこです。
3月半ば目処って言われてるけど、いかんせん先がまったく見えません。

自分はCしかわからないんですけど、どうなんでしょう…
>>342
おまいのスキルおよび
どの程度のものを要求されてるかによる
338のリンク先みたいなレベルのだったら
ドライバ作らないといけないから結構きついぞ
>>342
動作させる環境は分かってるの?
DDKは持ってる?

俺も結構きついんじゃないかと思う。
>>343
ドライバ作ってくれと言われました。
ものとしては、リンク先のもので言えば
仮想シリアルポートの設定ってのだけできればいい感じなのです。

>>344
環境はWin2kですね。
DDKは確認してみないとわかりませんが、たぶんあると思います。
周りもきついって言ってますね…

会社でこのスレ見れればいいんですけど、2chはロックかかってるんですよねぇ…
★スタンダード版価格

ライセンス数 シングル 3 5 10
定価 12,800 38,000 62,000 120,000
※消費税が別途かかります
注文か
そこのを相談したんですけど、金は出せないみたいに言われました
349338:04/01/26 22:31
名前入れますね。
そこのってのは338のURLのです。
>>348
10万かそこらの金が出せない?じゃぁあんたの人件費は誰が出すんだ?
>>350
to C で売る製品に使いたいんじゃないの?
例えばFAX モデムを仮想化して、「インターネットで FAX が送れるサービス」とか。
そういう用途だと1ライセンス1万だとあれだよね。
352338:04/01/26 22:54
>>350
予算の問題なのでしょうがないんです。

>>351
市販する製品ではないんですよね。

アプリ(PC1)----シリアルケーブル----データ管理アプリ(PC2)
現状がこういうのですが

アプリ(PC1)----ドライバ----データ管理アプリ(PC1)
このようにして使いたいそうなのです。

>>352
シリアルポート複数ついてて、両端のアプリが使用ポート変えられるなら
アプリ(PC1/COM1)----シリアルケーブル----データ管理アプリ(PC1/COM2)
つー感じにできる気がするな。
354338:04/01/27 00:31
>>353
ポートは両方のアプリとも変えられます。
ただ、シリアルケーブルを必要としない環境にしたいみたいです。
つーか、アプリ書き換えるならともかく、それだけのために仮想シリアルドライバ作るって
絶対コスト計算間違ってるな。
356338:04/01/27 00:48
やっぱり結構でかいんですかねぇ…
とりあえず今日は寝ます。
助言くださった皆さんありがとうございました。
明日進歩なかったらまた来るかも…
もしくは会社でなんとか見れればなぁ…
大学のLANに穴あけるためだけに仮想Ether作った奴も
いることだし、お前もがんばれよ。
>>357
大学のLANに穴あけるためなのか・・・
359デフォルトの名無しさん:04/01/27 01:56
質問です。

NTFSでハードリンクを使いDLLを2つに見せた場合のDLLのグローバルデータに関する物です。

そのハードリンクを使ったDLL達(A.DLL, B.DLL)にプロセス(P)がアタッチしたとします。

その時、A.DLLとB.DLLのグローバルデータは全く別物となるのでしょうか、それとも同じ領域
になってしまうのでしょうか。

スレ違い且つ実験しろって感じの質問で申し訳有りませんが…。
>>359
別物
Win32プロセスについて勉強しろ
まさかグローバル変数を共有させないように DLL を2つにしているとか?
ご苦労さん。
362359:04/01/27 02:13
違うよ…。

#pragma なんちゃらってやると全てのプロセスでグローバルな変数が作れるじゃんさ…。

そっちのグローバルデータの事を言いたかった。正式な呼び方が分からなくてすまんか
った。

兎に角そっちのグローバルデータの場合に就いて聞きたい。
364359:04/01/27 02:18
そうだったんですか、どうも。
なんか危なっかしいな。
素直にメモリマップドファイルで共有して、
共有したいプロセス間でオブジェクト名を
一致させた方が安全な気がするけど…
>>359
質問するときは使用コンパイラとバージョンも書け
どのみち>>360だが
仮想COMって結構簡単にできたきがしたけどなぁ...
数年前のインターフェースって雑誌に特集あったような気がする
バックナンバーしらべたらでてくるかもしれない

質問なのですが、

かなりいろんなサイズのフォント作成して、
TextOutするアプリを作ってて、Win2kまではフツーに動く。

が、
XPで動かすとTextOut終わってフォントDeleteしても
仮想メモリが増え続けて、アプリを終わらせないと
戻らない。(リソースの明示的リークはないと思う)

こんな現象に出くわした人いますか?
AllocConsole();で開いたコンソールウィンドウを、プログラムから最大化できるのでしょうか?
>>368
原因がそれ以外にあることは考えられないですか?
別の解放忘れがないか確認はされてますよね?
>>370
100%とはいいませんが、いらない要素を削って
あれこれテストプログラムを作成しても
再現してますので、別の理由ではないと思うんですが。

MSのExcelXPをWinXP上で起動して、セルに文字つっこんで
表示倍率変えまくったりしても程度の差こそあれ、
似たような現象が出て、仮想メモリサイズが
肥大化するんですよね。

何かのキャッシュとして裏で取られているのであれば、
破棄の方法が知りたいところなんですが。
372びら:04/01/27 13:27
携帯から失礼します。
VB.netとCで作るDLL間で構造体の配列の受け渡しをしたいのですが上手くできません。
どうすれば実現出来るか知っている方いますか?


板違いでしたらスイマセン
373369:04/01/27 14:02
自己解決できました。
>>371
OSのキャッシュの持ち方が違うんでね?
実害がなければほっとけば良いと思う。

>>372
同一スレッドならばポインタを渡してやれば良いだけだと思うんだが・・・
値渡しにしてみるとか、メモリマップドファイルを使うとか。
XPは良い意味でも悪い意味でも厳格にいろんなもの取得してくるからねぇ
キャッシュもがっちりもってるかもしれない
376272:04/01/27 15:22
>>290
ご回答ありがとうございます。

>Me.hWnd, lnghPrinter, Printer.DeviceName,ngBufSize,はちゃんと取得できてる?
一応、全部それらしい値がはいっていました。

>Redim()の値を巨大(数万)にして試してみては。
>bytDevMode の配列の宣言はどうなってる?

bytDevMode(731)でした。
bytDevMode(10000)で試してみましたが、結果は同じでした。

>あと、Option Base 1 にはしてないよね。
大丈夫でした。

377368,371:04/01/27 15:32
>>374
困ってます。

アプリケーションの作りがあまりよくないのかも
しれませんが、マッピングモードを使わずに
無段階に表示倍率変更できるので、
気がつくと数100Mなんてことになってます。

表示方法を根本的に変更しないと対応不可ですかねぇ。
>>374
どうして素直にP/Invokeのことを教えてあげないの?
>>378
ピンボケって何ですか?
380374:04/01/27 19:29
>>378
.NETだったんだね。見落としてたよ。
>>356
別にデバイスドライバはでかくもないし、>>367 が書いてる通り COMM ぐらいならそんなに難しいわけじゃない。

ただ、お作法が普通のアプリケーションと違うし、何よりバグった時に OS もろとも死んじゃうことも多々あるわけだから、デバッグがちと大変。

「将来デバドラ作ることも多々あるから、今回は勉強だ〜。」とか言う目的があるならともかく、今回の目的のためだけに作るというなら >>355 が正しい。
ユーザーモードドライバなんだからOSが死ぬことはないだろ
383デフォルトの名無しさん:04/01/28 03:13
ビットマップとかの画像を回転して(表示する角度を変えて)表示させたりするには自力でやらないと無理でしょうか?
そのためのAPIとかは無いでしょうか?
384デフォルトの名無しさん:04/01/28 06:39
Win32APIで開いたファイルハンドルから、fgets()で文字列を読みたいときは
どうすればいいのでしょうか?

fgets()相当のWin32APIはあるのでしょうか?
あるいは、HANDLE->FILE*へ変換することはできるのでしょうか?

おねがいします。
>>384
最初からfopenで開けばええじゃないか
>>384
SetFilePointer
ReadFile
あたりはどうですか?
>>384
APIじゃないけど_open_osfhandleとfdopenでFILE*に変換できる
>>383
自力でやらなくてもできるよ
APIあるよ
教えてやれよケチンボゥ
GDI+?
>>383
NT/2000とかならPlgBltとか
9Xは知らない
>>383
DirectXとか
393ゆう:04/01/28 14:02
質問です。

クライアントで「通常使用するプリンタ」に設定されているプリンタをサーバ側から取得する事って可能ですか?
MCIからMPEG(動画)を再生できますか?
mpgもaviも再生できたよ、確か
396デフォルトの名無しさん:04/01/28 18:16
APIのネームの前についている「Rtl」やら「Ldr」やらZWってのはどういう意味があるんでしょうか?
名前がプレフィックスだと言うところまでは分かったんですが、それ以上は・・・。
それDDKじゃねーの?
NTDLL.DLL を覗いたんかね
399384:04/01/28 21:17
>>385,386,387
ありがとうございます。

_open_osfhandleとfdopenを調べてみます。
400デフォルトの名無しさん:04/01/29 09:58
DDEとして登録してある拡張子のファイルをダブルクリックしたとき、
エクスプローラはどういうコードを実行しているのでしょうか?

いろいろ調べてみたんですが難しいです。
ヒントだけでもお願いします。
>>400
(゚Д゚)ハァ?
何がしたいのか正直に言ってみ?
エクスプローラと何か関係あるのか?
402400:04/01/29 10:36
エクスプローラというより、ShellExecute()というべきだったかもです。
>>402
レジストリ見てDDE設定があったらDDE通信するだけじゃネーノ?
単にcommand filenameとして実行しているだけでは。実行ファイルにD&Dした時も同じ。
漏れは未だに>400が何をしたいのかわからん。
DDE送りたいだけなら送ればいいし
ShellExecute()使いたければ使えばいいだけぢゃん。
>>396
RtlはRuntimeの略(Cランタイムの代わりにカーネルモードで使う関数など)
LdrはLoaderの略(モジュールのロード関係)
Zwは謎
408400:04/01/29 13:18
DDEを送りたいです。
で、ShellExecuteと同じようにDDEを送るにはどうすればいいのかが
わからないのです。
>>408
キーワード的には

 動的データ交換管理ライブラリ

かなぁ…
>>400
適当に見当つけて "DDESPY" でググって見たらそれらしいものがヒットしたよ。
使ってみれば?
411400:04/01/29 14:00
>>409,410
ありがとうございます。DDESPYを使いながらいろいろ調べてみます。
412396:04/01/29 17:38
検索しても出てこないから困ってたんです。
407さんありがとうございましたー・・。
413デフォルトの名無しさん:04/01/29 19:19
質問です。
たとえば Filet="c:\test.txt"
として、これを
プログラムで使える形に"c:\\test.txt"にする方法を
ご教授願えませんでしょうか。
\を\\にすればいい。

てゆうか\\なんかプログラムで使わねーがな。
Windowsプログラム作っていたら、作っているフォルダに
RCa02372
RCa03936
RCb03936
Rca01756
などと言うファイルが知らない間に出来ていました。(拡張子なし)
全てのサイズが4.01KBでファイルの種類が”ファイル”と書いてあります。
これは何なのでしょうか?知らない間に出来ていたので少し気になります。
>Windowsプログラム作っていたら
おまえのプログラムが作ったのかもしれないし
IDEが作ったのかもしれないし
何らかの管理プログラムが作ったのかもしれない

情報を小出しにするなボケ
ああ、RCファイルね
少し気になるぐらいだったら大丈V
俺は全然気にしないよ
419413:04/01/29 19:43
失礼しました。
説明が足りませんでしたが
Filetの部分はシステムから得る文字列です。
OPENFILE構造体で
ofn.lpstrFile = Filet; として
このFiletの中身をc;\の部分にc:\\として
\を付加したいのですが、どなたかご教授お願いします。
>>415
この前メールで届いたexeファイルを実行すると安全に削除できるよ!
>>419
それでも全く説明が足りていない。
"C:\"がどこから来たのか。
最初から"C:\\"と書き込んでおけば良いだけでね?
それかCStringT::Replaceか?
>>419
であれば、変換する必要など無い。
\\としなきゃいけないのはどんな場合かよく考えてみな。
423デフォルトの名無しさん:04/01/29 20:44
ファイルを開くダイアログでファイルを選択し、そのパスを取得。
それがFiletに収められる。(c:\test.txt)
VCでFiletの中身のc:\だとその文字列を
パスと指定してやっても動作しないので
c:\\test.txtといった形にしたい。
>>423
それはおバカですなぁ
win32のDibセクションについて教えてください。

ウィンドウに直接描画するときはWindowsがハードに図形描画命令などを送るんだと思うんですが
Dibセクション(メモリデバイスコンテキストに選択したやつ)にLineToなどを描画するときはソフトでビット配列に書きこむわけですか?
それとも一度ハードに送ったりするんですか? あとDDBを選択したmemDCに描画するときもソフトでやっているんですか?   疑問なのでおねがいします。
煽り
427デフォルトの名無しさん:04/01/29 20:55
画像を90度回転させてBitbltみたいにコピーするAPIってありますか?
>>425
どっちもソフト。
実は無知なやつが
>>425
もまいはGDIだのドライバだのの存在理由を否定しているわけだが
431デフォルトの名無しさん:04/01/30 01:55
ExtractAssociatedIcon という関連付けされたICONのハンドルを得るというAPIがうまくつかえない・・
---------------
HINSTANCE g_hInst;
HICON hIcon;
 ・
 ・
 ・
switch(uMsg){
case WM_COMMAND:
switch(wParam){
case IDC_BUTTON1:
hIcon = ExtractAssociatedIcon(g_hInst, "c:\\test.txt", 0); ←この行で強制終了になります。
---------------
c:\test.txtに関連付けられたEXEファイル(メモ帳)のアイコンハンドルを
取得したいのですが、どうすればいいのですか?
ちなみにIDC_BUTTON1はウインドウ上に作ったボタンのIDです。

WindowsXP VisualC++6.0です。
今年度のバレンタイン大作戦

女性店員がレジにいるコンビニでチョコを買う

わざとチョコを受け取り忘れて店を出る

女性店員が走って渡しに来る「あの・・・これ・・・」

ちょっぴりバレンタイン気分
>>431
ExtractAssociatedIconの3番目の引数は WORD型の変数へのポインタ を渡さなきゃいけないので0じゃだめです。

WORD IconID=0;
ExtractAssociatedIcon(g_hInst, "c:\\test.txt", &IconID); こんなかんじで。
>>432
それいいね!
>>434
こぴぺに…
いまさら…
436431:04/01/30 02:17
>>433
すばやいレス感謝します。おかげで正常に動きました。

HELPの LPWORD lpiIcon と書かれているところに引っ掛かってはいたのですが、
WORDで宣言して、0を代入して&WORDでアドレスにすればいいわけですね。
LPWORD IconID; で宣言したらどうすりゃいいのかなーと悩んではいました。
>>431
そういう指定のAPIたくさんあるから解決できてよかたね
438425:04/01/30 08:58
ありがとうございます。
439デフォルトの名無しさん:04/01/30 14:52
質問です。
DirectXGraphicsなプログラムを作っていて、必要が出てきて「猫でもわかる〜」を見ながら、
リストビューをつけました。
リストはウィンドウにうまく張り付いて表示されるように出来たのだけど、このリストを
クリックしてしまうと以降、親ウィンドウのキー入力やらマウス入力のメッセージが
来なくなってしまうんです。一度ほかのプログラムを最前面にしたりすると直るんだけど。

どこを直したらいいですか?
それAPIの質問でなくて自分のプログラムのバグだろ
スレ違いじゃね?初心者質問スレにソース貼って聞いてみれば?
441439:04/01/30 16:04
>>440
それはもう間違いなくバグなのですけど、リストビューにキー入力を持って行かれない方法か、
あるいは親ウィンドウに速やかにキー入力を返却する方法自体が判らなくて調べもつかずに
弱っているのです・・・。
442439:04/01/30 16:10
ああでも、おもくそ初心者な質問なので、初心者スレに逝った方が良さそうですね。
SetFocus
444439:04/01/30 17:28
>>443
キー入力が戻ってきました!何とかなりそうです。
心から感謝します!
バグの隠蔽方法教えても仕方ないだろ
446427:04/01/30 18:41
やっぱりバッファに書き出して配列いじくるしかないですか?
>>445
バグの隠匿じゃないよ
エディット、リストやツリーのような標準コントロールのうちいくつかは
自分がクリックされたときにキーボードフォーカスを自身に設定するので
自作コントロールでキーボード入力を受けたければ
そのウインドウをフックしたりするか、もしくは適切なタイミングで
キーボードフォーカスを設定しなおす必要がある
448デフォルトの名無しさん:04/01/31 11:29
GetPrivateProfileStringA関数で文字列を取得した際に、
セミコロンのコメント部分まで読み込まれてしまいます。
どうすればコメント部分を省いて読み込んでくれますか?
>>448
セミコロンてどこでも書けるの?行頭だけじゃ?
450デフォルトの名無しさん:04/01/31 20:43
あるEXEファイルが、コンソールアプリなのかWIN32アプリなのかを知るにはどうすればいいのでしょうか?

お願いします。
>>450
ヘッダーを見る。
PEオプションヘッダの中にあるSubsystemの値を見ればいい
IMAGE_SUBSYSTEM_WINDOWS_GUI
IMAGE_SUBSYSTEM_WINDOWS_CUI
dosアプリケーションかということなら、
通常のexeファイルはdosアプリかつwindowsアプリなので、差は無い
453450:04/01/31 21:32
ありがとうございます。
早速チャレンジしてみます!
たまにフリーソフトで見かける解像度変更ソフトで、
ChangeDisplaySettingsを使わずにリフレッシュレートを
設定している物があるんですが、
あれってどうやって実現しているのでしょうか?
質問させていただきます。

今エディットボックスにどんどんと情報を追加表示していくプログラムを作っています。

「複数行」「垂直スクロールバー」「垂直オートスクロール」「改行を許可」でエディットボックスをつくり、
SetWindowTextで流し込んでいます。

・SetWindowTextだと全情報を転送してるのであまり効率が良くない気が。
 エディットボックスに文章を「追加する」APIはありませんでしょうか。

・改行して情報を追加しているのですが、やはり最新情報として一番下の行を眺めていたいもの。
 エディットボックスのスクロールバーを一番下まで下げる(内容も一番下までスクロールさせる)には
 どんな感じにすればいいのでしょうか。
 SetScrollPosでスクロールバーを下げるだけならできたのですが、
 内容がスクロールしてくれません。

両方今のところMFCを使わず済ませたく思っています。
よろしくお願いします。
456455:04/02/01 01:09
すいません、今ふと思いついた検索ワードからたどっていったら、
うまく2番目のほうは発見できました。
SendMessage(GetDlgItem(hWnd, IDC_EDIT1), EM_LINESCROLL, 0, 65536);
こんな感じでOKですね。

1番目の質問だけよろしくお願いします。
>>456
おれはこんな感じでやったことあるよ。
これが最適かどうかは自信ないけど。

void AddText(const char *msg)
{
 int len;

 len = GetWindowTextLength(hWNd);
 SendMessage(hWnd, EM_SETSEL, len, len);
 SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)msg);
}
CWnd::SendDlgItemMessage
459デフォルトの名無しさん:04/02/01 07:59
UNZIP32.DLLで解凍プログラムを作っています。
仕様書を見るとUnZipSetOwnerWindow関数で設定したウィンドウハンドルに、
解凍の進行状況に関するwm_arcextractメッセージを送信するとあるのですが、
「wm_arcextract」がヘッダーで定義されていません。
また、UNZIP32.DLLからのメッセージが来るはずのウィンドウを監視したのですが、
それらしいものは受信していないようです。

解凍進行中における情報が時々刻々欲しいのですが、どのようにすればいいのでしょうか。
>>455
ログの表示みたいなことがしたいんだったら
エディットボックスじゃなくてリストボックスという手も。
461455:04/02/01 10:30
皆様ありがとうございました。
最終的にこんな感じになりました。

nPos = SendMessage(GetDlgItem(hWnd, IDC_EDIT1), EM_GETSEL, 0, 0);
n = GetWindowTextLength(GetDlgItem(hWnd, IDC_EDIT1));
SendMessage(GetDlgItem(hWnd, IDC_EDIT1), EM_SETSEL, n, n);
SendMessage(GetDlgItem(hWnd, IDC_EDIT1), EM_REPLACESEL, 0, (LPARAM)(p.getComment() + n));
SendMessage(GetDlgItem(hWnd, IDC_EDIT1), EM_SETSEL, LOWORD(nPos), HIWORD(nPos));

追加型だし、自動でスクロールしてくれるしGoodです。
462デフォルトの名無しさん:04/02/01 10:49
VC6の質問です。
私はDEBUGとRELEASEの出力フォルダを同じにしてるのですが、
これだと、Releaseビルドしたあと、デバッグできなくなります。

出力ファイルを削除するなどの処理をすればいいのですが、
これを自動化する方法はないでしょうか?
↑同じにしてるのは .exe だけです。
そりゃReleaseしたら、DebugExeが上書きされてしまうのだからデバッグできなくなるさ。
何故一緒にしてるのかはわからんが、絶対に分けるべき。
Releaseはその名の通りRelease時にしか使わないし。
465462:04/02/01 11:16
はい、デバッグできなくなる理由はわかってるんです。

問題はリリースのEXEがあって、かつDEBUG構成でデバッグをはじめたときに、デバッグの
EXEを自動で作りなおすいい方法が見つからないことなのです。
>>465
DEBUG用のEXEの名前を変えたらどう?
467462:04/02/01 11:23
>466
それだと、iniファイルとかも変わってしまうので(私の場合)
ちょっとダメなのです。
要は、「Releaseフォルダの中にある各種設定ファイルをデバッグの時にも使いたい」
ということなのかな?
そのためにDebugとReleaseを同じフォルダにしたいとか?
各種設定ファイルは○○フォルダの中に置かないぞ。
デフォだと起動場所はdswファイルと同じ場所ということになっている。

debug/test.exe
release/test.exe
test.dsw
test.dsp
main.cpp
mode.ini


ちゃんとdebug/release両方同じ動作mode.iniが読める
470462:04/02/01 12:56
>469
CurrentDirectoryがdswのある場所になるということですよね。
私の場合CurrentDirに関係なくEXEのあるフォルダになってしまっています。

あと、自分自身への引数つきのショートカットとかもあちこちにあって、
起動されるEXEを統一したいです。
コマンドライン使えば?
パラメータありならデバッグモードとして判定して読み込むiniファイル名も変えればいいじゃん
472462:04/02/01 13:04
>私の場合CurrentDirに関係なくEXEのあるフォルダになってしまっています。
iniファイルがです。
473デフォルトの名無しさん:04/02/01 13:18
>>469はカレントディレクトリにiniファイルがあるという前提で
コーディングしているのか。
結構危険なやり方だな。
なんか発想が逆だな。
まず、リリースビルドとデバッグビルドでディレクトリ分けて作られるのを前提にして、
他の要因をリリースとデバッグで切り替えられるような機構を考えるべきだろう。

リリース版はともかくデバッグ版は自分の環境のみで動けばよいのなら、
デバッグ版に限れば絶対パスでiniファイルを読み込んでも良いんだよ
(チーム開発してるなら別だが)
自分も、設定ファイルをdebugとreleaseで共用できないのが気に入らなくて、
- project
 - debug
 - release
 - config
っていう構成にして、exe から相対パスで "../config/*" を見に行くようにしてる。
>>473
そ、そうなんですか?
今まで作ってきたツールもすべてカレントにiniがおかれているのを前提にしてました
(iniがなかったらデフォ設定で起動)
このスレで言うのもなんだけど、俺はC++でProfile系APIをラップしたクラスを作って、
任意のフォルダを指定できるようにしてる。
もちろんデフォルトではexeと同じフォルダにiniを置くようにしてる。
>>476
はっきり言って、カレントディレクトリは当てにならんよ。
ファイルダイアログ使ってカレント変わったらあぼーんだな
カレントじゃなくてモジュールの実行パスが欲しいんじゃないの?
作成中のプログラムのショートカット作成して、作成したショートカットのプロパティ
で作業ディレクトリ変えてみな。読めなくなるから。

GetModuleFileName で起動した exe のパスを取得して、そこから ini ファイルの
パスを作れ。
>>480
過去ログみればわかるけどそういう話じゃない。
バッチファイルでも作っておいて
ビルドのたびに相互に.iniをコピーすれば?
プロジェクトの設定の中のビルド後の処理で
呼び出すようにでもして。
483デフォルトの名無しさん:04/02/01 18:40
初心者です。
右上の最大化とか最小化とかのボタンが変な数字とかになってるんですけど、何処を書き換えたらなおりますか?
>>483
『フォントキャッシュ』でgoogle

でも、何でこのスレ?
ネタですか?
ネタじゃないなら初心者板へゴー!
486デフォルトの名無しさん:04/02/01 22:47
ダイアログボックス上のツリービューについて質問します。

ラベル編集中にENTERやESCを押すとダイアログボックス自体が終了してしまいます。
この動作は、ダイアログボックス上のエディットコントロールと同様の動作なので、
当然のことと思っていました。

しかし、MSDN Q130691では、バグ扱いです。
編集を終了するかキャンセルするのが正しいとしています。

本当にバグなんでしょうか。
そりゃ、マウスなしで編集確定する手段がないのは困るぞな、もし。
>>483
ttp://homepage2.nifty.com/winfaq/fontstrouble.html

って、このスレに来るのはまだ早いようだね。
489486Get!!:04/02/02 01:10
>>487
なるほど、「確定」ですね。
ありがとうございます。
490デフォルトの名無しさん:04/02/02 01:23
PathIsRelative()のサンプルを見て、こんなのを書いてました。
int _tmain(int argc, _TCHAR* argv[])
{
char Path[] = "任意のパス";
if(PathIsRelative(Path))
cout << Path << "相対パス";
else
cout << Path << "絶対パス";
return 0;
}
隣家がエラーを出しました。
test.obj : error LNK2019: 未解決の外部シンボル
__imp__PathIsRelativeA@4 が関数 _main で参照されました。
だそうです。
インクルードディレクトリを調べました。
ヘッダファイルは存在します。
LWSTDAPI_(BOOL) PathIsRelativeA(LPCSTR pszPath);
との記述があります。
また、
#define LWSTDAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
とあり、呼び出し規約はきちんとしているみたいです。
どうして変な風に修飾されてるんでしょうか。
何かすごく基本的なことを間違えてるんでしょうか?
491490:04/02/02 01:36
ライブラリリンクしてなかった・・・。
スレ汚してすいませんでした
492486Get!!:04/02/02 02:02
>>487
なるほどという気になったのですが、さて、
ラベル編集に入るにはマウス操作が必要ですよね。
だから確定するときもマウスを前提にして良いのではないかと考え直しました。

それとも、マウス無しで編集に入る方法があるのでしょうか。
タブオーダーとか?
F2
495486Get!!:04/02/02 04:06
>>494
ダイアログボックスでは不可、エクスプローラで動作しました。
ということは、実装すべしということですか。。。。(SDK)

#「バグ扱い」は言い過ぎでした。VC6付属のヘルプではBUGになっていますが、
# ONLINEでは変更されていました。
>>495
MSとかのキーボードになんかは右クリックの役割もってるやつあるじゃん。
Appキーっていうrの?右Ctrlの左にあるやつ。
エクスプローラなら、それからポップアップメニューから名前の変更(ラベルの編集)するってのもできるよ。
だから、特別実装するって必要もないのかな??とか。よくラベル編集するものならショートカットとしてF2で実装するとか。

#たまにエクスプローラのくせでF2押すことあるけど編集できないソフトだとちょっと萎え。
497デフォルトの名無しさん:04/02/02 09:16
replace関数を使おうとしているのですが
定義されていない識別氏と出てきます。
algorithmをインクルードしています。
また、void replace(_FI _F, _FI _L, const _Ty& _Vo, const _Ty& _Vn)
の引数をご教授願えませんでしょうか
VC6.0 XP環境です。
498デフォルトの名無しさん:04/02/02 09:20
選択されて(反転している状態)いるファイルの絶対パスを取得したいのですが、
どのような方法でやればよいでしょうか?
例えば、Cドライブのtmpフォルダ内のa.txtファイルが選択されていたら、
[c:\tmp\a.txt]を取得という感じです。
>>424
理由いえない馬鹿。
>>432=>>434うざい
>>443
何が言いたい
500デフォルトの名無しさん:04/02/02 09:38
早く答えろよーーーーーーーーーーーーーー
寝てるんじゃねえよーーーーーーーーーーーーーqqw
>>499
Win32APIに関することで来いよ
わざわざスレ違いネタを引っ張り出すな
>>501
お前も無視しろ
いちいち反応すんな
>>497
それのどこがWin32APIなんだと小一(ry

>>498
BHOの事か?
>>497
using namespace std;とかstd::replaceとか?

templateスレもあるよ。
 【C++】template 統合スレ -- Part3
 http://pc2.2ch.net/test/read.cgi/tech/1066493064/

それより、こっちのほうがいいか。
 C++相談室 part27
 http://pc2.2ch.net/test/read.cgi/tech/1074454641/
 【初心者歓迎】C/C++室 Ver.4【環境依存OK】
 http://pc2.2ch.net/test/read.cgi/tech/1073473867/
505486Get!!:04/02/02 14:25
>>495 HOOKで行きます。 仕様を追加してくれたご親切な皆さん、感謝(涙)。
506デフォルトの名無しさん:04/02/02 14:27
PathRemoveBackslash
の使い肩を教えてください。
何かをinkcludeしてやるのが必要なのでしょうか
自分で調べることが必要。
なんでMSDN見ないんだよ。怒るよ!
URLを分解してくれるAPIってなかったっけ?
CreateFileでファイルを作成して

そのファイル名が格納されるときに、c:\test\test.txtとして保存した場合

格納される配列をFileNameとすると、中身は"c:\\test\\test.txt"となっているのでしょうか

そのFileNameを使用してiniファイルとして出力を

WritePrivateProfileString関数で行い、最後の引数をFileNameにしているのですが

うまく保存されません。どうしてなのでしょうか。よろしくお願いします。
・一行空け見にくい
・何を質問しているのかさっぱりわからない
>>510
どこで失敗しているのか、戻り値もチェックしないとわからん

デバッガ使えないのかな?
ステップで実行しながら戻り値や変数の中身をみるだけで勉強になるぞ
>>513
見つかった。ありがと!

>>510
ソースファイル中のエスケープとごっちゃにしてる悪寒
>>510
>CreateFileでファイルを作成して
>そのファイル名が格納されるときに、c:\test\test.txtとして保存した場合
この段階で意味不明っぽ。
hFile = CreateFile(FileName, GENERIC_WRITE,0,
           NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,
           NULL);
でファイル保存作業を行わせてから
WritePrivateProfileString("SECTION", "THEME",rData,
FileName);
としてiniファイルを作り、そこにデータを保存したいのですが
うまく保存されないんです。
>>516
CreateFileって必要?
518516:04/02/02 15:15
>>517
保存する場所を選択できるような形にしたいので
CreateFileを使うと思ったので。
>>516
CreateFileしなくてもWritePrivateProfileStringは自動的にファイルを作成する
たぶんCreateFileでハンドル握ってるから保存されん
520516:04/02/02 15:32
>>519
ハンドルを閉じたらできました。
ありがとうございます。
皆さん、ありがとうございました。
いやいや閉じるんじゃなくて作らなければいいのでは
これじゃ毎回初期化されるが・・・
>>521
もう、見ちゃいないって
523519:04/02/02 15:45
>>520だれも閉じろなんて言ってないよ...
WritePrivateProfileStringってのは独自のファイルI/Oをもってるからさ
クリされてイジイジされるとこまるんだ
524516:04/02/02 16:01
ファイル選択→WritePrivateProfileStringでデータ読込
ではますいんですか?
GetOpenFileNameでファイル選択すればいいんじゃないの?
CreateFileはファイル選択するAPIではないとおもうが
>>524
ファイルがないときは自動的に作成されるはずだし、
あるときはそのファイルに書き込みされるはず。
だから、CreateFileするこたない。

ファイル選択とCreateFileは関係ないでしょ。
根本的に勘違いしてる悪寒
528516:04/02/02 16:19
CreateFile自体必要じゃなかったんですね。
そもそもなんのためにCreateFileしようと思ったんだい?

まさかおまじない程度?('A`)
最初はテキスト形式でキー値を出力させようとしていたので。
とてもしょぼい質問で申し訳ないのですが
最小化または最大化されているウィンドウを
元の状態に戻すAPIかメッセージは
ありませんでしょうか?
よろしくお願いします。
ShowWindow
>>532
アリガトン
534脳豚:04/02/02 22:15
アンチウィルスソフトとかって
あるプロセスがファイルを開こうとしたら
その前にファイルを開いてチェック !
みたいなことをやっているように思えるのですが。

こういうのってどうやってやるのですか?
標準のフックではAPIまでフック出来ないし・・。
Unicodeベースでソースを書こうと思い立ったので
MessageBox(NULL, TEXT("ユニコードのメッセージ"), TEXT("ユニコードのタイトル"), MB_OK);
といったコードを書き、UTF-8Nで保存してコンパイルしてみたのですが正常に表示されません。
使ったコマンドラインはこのようなものです(MinGW3.3.1):
 gcc -s -mwindows -O2 -o uni sample.c

どのようにすれば正常に表示されるのでしょうか?ご教示お願い致します。

なお、UnicodeやUTF-8ではコンパイルエラーが出ました。
OSはWindows2000を使っています。
>>534
標準じゃないフック使ってるから。
ってAPIフックなんて半分標準みたいなもんだが。
>>535
それのどこがWin32APIなんだと小一(ry
534じゃありませんが、

>>536
なんとおもしろそうな。
もし良かったらその手の解説がのっているサイトを教えていただけませんでしょうか。
>>536
んなAPIあんの?
プロセス止めてテーブル書き換えてリスタートさせるしか方法ないんじゃないの?
APIというか、カーネルドライバを挟んでるんじゃねーの?
541535:04/02/02 23:45
>>537
MessageBoxは立派なWin32APIだと思ってるんですが、違うんですか?
>TEXT("ユニコードのメッセージ")
これはちゃんとUTF-2文字列になるのかが問題だな。
あと、UNICODEを定義しないとMessageBoxAが呼ばれるはずだが。
543535:04/02/02 23:56
>>542
ありがとうございます。直接MessageBoxWを使ってみました(-DUNICODEをつけてコンパイル)。
コンパイルエラーの類は出ないのですが、やはりおかしな文字列が表示されます。

TeraPadを使ってソースを書いているので、UTF-2(現UTF-8N?UTF-8ではgccが文句を言います)保存のほうは大丈夫だと思います。
>>542
UTF-2などというものは存在しない。
UCS-2でしょ。
でも最近のWindowsはUCS-2ではなくUTF-16だったりするが。
つーか、MingwがUTF-8で書かれたL""をUCS-2/UTF-16に変換してくれるかどうかの
問題じゃないのか?
546デフォルトの名無しさん:04/02/03 00:00
>>534,536
http://www.nai.com/japan/security/virB2003.asp?v=Backdoor-AOK
レジストリフックなるものがあるらしい。
>>544
UCSは文字セットの名前
UTFは文字エンコードの名前
UCS-2の文字セットを16bit固定でエンコードするとUTF-16、8bit単位の可変長とするとUTF-8です。

で、質問なんですけど、不透明度アルファチャンネルを持つビットマップを描画するAPIってありますか?
548534:04/02/03 00:03
>>536
> ってAPIフックなんて半分標準みたいなもんだが。

ってあるのですが。
そんなにメジャーな方法なのですか?
色々探し回ってみたけど、見つからなかったです(´・ω・`)

>>539氏の方法がソレなのでしょうか?
再び検索の旅に逝ってきます・・。
UTF-16ってUCS4じゃなかった?サロゲートペアを考えると。
550535:04/02/03 00:06
>>545
なるほど、そうですね。板内を検索してみると同様のことを試している人が居ましたので参考にして見ます。
http://pc2.2ch.net/test/read.cgi/tech/1052186697/308
(どうやら、MinGWは変換してくれないようです)
>>547
UTF-16はUCS-4をサロゲートで表記したものを言うのが普通。
サロゲートが存在しなかった頃の16bit Unicode時代のものをわざとUCS-2と呼んで区別する。

アルファチャンネル関連はDirectDrawかGDI+を使うしかない。
>>551
AlphaBlend忘れるなよ。
つか、DIBSectionあたりが相手なら自前でもそうたいしたコストじゃないか。
>>552
忘れてないけど?
>551
DirectDrawつーか、Direct3Dの2D利用では。もう統合されたんだっけか。
>>546
フックの意味合いが違うと突っ込んでみる。
>>554
msimg32.dllってDirectXだっけか。
APIフックに興味がおありなら
「Advanced Windows」をご購入下さい
>>548
NT系なら、フィルタドライバかな。要DDK。
95系はしらん。
>>544
UTF-2はUTF-8の旧称
542は間違えただけだと思うが
TDI(Tramsport Driver Interface)周りの質問ってここでOK?
WDMのほう逝け?
一応聞くだけ聞いてみれば?
無理ならWDM逝けばいいかと

(マルチ氏ねっていわれるかもしれないけどな)
562560:04/02/03 14:37
netstat -o(xp以降)のようなnetstat + プロセスIDをwin2000で実現しようとしています。
xp以降は散々既出な非公開関数で実現できるのですが、win2000ではググってみたところ

NtQuerySystemInformationでハンドル-プロセスID情報を取得。
上記に対しgetsockname / getpeernameが有効であればこれを利用。
無効なら取得ハンドルからDeviceIoControlの制御コード0x210012 + 適当に情報を入れた
TDI_CONNECTION_INFORMATIONからTDI_CONNECTION_INFOを取得。

のような流れが主流のようで、これで一応ローカルIP、ポート、プロセスID
のデータを取得できています。が、TCPにおけるリモートIP、ポートや
connection statusがうまく取得できていません。

TDI_CONNECTION_INFORMATIONを取得するような方法、または他の実現方法、
TDIに関する情報等ありませんでしょうか?
DDKのサンプルには目を通していますが、今一バッチリとは来ませんでした。
↑snmp 系の API で取得できたような気がする。
564デフォルトの名無しさん:04/02/03 16:42
例えばデスクトップ上のあるファイルをクリックしたら、
そのファイルのファイル名及びパスを取得できるようにするにはどうしたらいいでしょうか?
分かる方、お願いします><。
>>564
パス:SHGetSpecialFolderLocation
566デフォルトの名無しさん:04/02/03 22:49
フルスクリーンで使うソフトを作っています。
起動中は使用者がほかのソフトに切り替えるのを防ぎたいのです。
何かいい方法はありますか?WINキーやALT+TABキーを殺したいのですが。
PreTranslateMessageでブロックすりゃええがな
でもな、ALT+TABとかALT+F4は残しとけ。教えといてなんだけどな
デバッガ使われたらまずいソフトでも作ってんのか?
570デフォルトの名無しさん:04/02/03 23:17
566です
567さまありがとうございました。
568、569さま、子供用ソフトです。いじられないように。
571デフォルトの名無しさん:04/02/04 15:54
>>566 別デスクトップ生成→そこで実行、もアリかな?面倒かもしれないし9X系だと使えないが。
572デフォルトの名無しさん:04/02/04 17:51
Win32APIを使わず、windowを作るなんてこと出来るんすか?
というかOSなしで稼動できるように・・・。
もう一回何言ってるのかわかるように説明してください
>>572
いくらでも出来ますが、このスレと関係ありません。
IEに貼り付けるムービープレイヤのActiveX作ってるのですが、
IE側でスクロールするとちらついてしまうので
その間は描画を止めたいと思っています。
IEのスクロールを検知するにはどうしたらよいのでしょうか。
システムフックするしかないのでしょうか?
Win2000で、Win32_NTEventLogを参照して、イベントビューワ上で
表示されるのと同様のテキストを得ようとしています。

イベントビューワ上の"説明"欄に表示されるテキストが
"Win32_NTEventLog.Message"の値とのことなのですが、一部の
イベントでは .Message に"%n" (n:整数)という文字列が挿入され
ており、これがイベントビューワ上では他の文字列に置き換えて
表示されます。

見つけた例:
 ソース:DCOM,イベントID:10005のイベントでは、.Message中
 に"%109"と記述されていたが、イベントビューワで見るとこの部分
 が"ファイルが見つかりません"と置換される

置換される文字列がどこにあるのか、WMIのリファレンスやObject-
Browser等で探したのですが、見つけることができませんでした。

Windowsの標準的なエラーメッセージを保持しているクラスでもある
のか思うのですが、どなたか、思い当たる事でもありましたらお教え
頂けないでしょうか。
よろしくお願いします。
FormatMessageでねーの?
エラーコードからFormatMessageでエラー文字列に変換する場合
エラー文字列の中には%1や%2というようにパラメータが必要なものがありますよね(例えばERROR_WRONG_DISK)
こういうのっていちいちエラーコードを調べてパラメータを指定するもんなんですか?
APIでいいのかな
質問しちゃいます。

メモリにあるHTMLソース
char html[]="<HTML><h1>test</h1></HTML>";
みたいな
物を、表示したいんですが
何を使えばよろしいのでしょうか?

ActiveXのwebBrowser使ってみたけど
ファイルに保存した状態じゃないと駄目みたいなのです。
http://pc2.2ch.net/test/read.cgi/tech/1075319943/
向けだな。↑の前スレ探せば出てきそうな気がするけど。
582デフォルトの名無しさん:04/02/05 02:10
質問です。
Google Deskbar みたいなアプリってどうやったら作れるのでしょうか?
IDeskBandを実装する。
WinXP用ネットワーク切り替えツールが作りたいのですが
その辺のAPIってどれでしょう?
ネットワーク切り替えってなに?
ネットワークっていったらインターネットのことだろ
インターネットっていったら2ちゃんねるとかあれのことだろ
そーいうことだから
マジレスするとこーゆー奴じゃねーの?

http://arena.nikkeibp.co.jp/qa/internet/gaz/int_m31/
588デフォルトの名無しさん:04/02/05 15:51
CRowset::SetDataについて質問があります。
現在、WinXP Pro + VS2003Pro + MSDE の環境と
MFC + ATLサポートの形式でOLE DB接続コンシューマの
データベースアプリを作っています。

そこで、レコードの更新・挿入時にSetDataを使用しているのですが
主キーを設定しているテーブルを更新しようとすると
DB_E_ERRORSOCCURREDを返して更新ができません。
MSDN(日本語・英語両方)では、

書き込み禁止列がある場合、操作は失敗し、
これを回避するにはカーソル マップを変更します。

といった意味の記述がありますが具体的にどのような
コーディングをすればいいのでしょうか?
589デフォルトの名無しさん:04/02/05 16:30
すれ違い
590デフォルトの名無しさん:04/02/05 18:11
APIでcryptと同じ関数あったら教えてください
ソース探してきて自分で組み込む
592576:04/02/05 21:48
>> 577-578
ありがとうございました。
FormatMessageをVC++でから試したところ、イベントビューワと同じ
メッセージが得られました。

ところで、今更申し上げるのは恐縮なのですが、実環境は以下のような
事情があります。

1.開発環境が買えないので、スクリプトで作成する
 (すくなくともVBSに、エラーコードからメッセージを引く関数は無い様子
 → FormatMessageが使えない? JScriptの"Format"が使えるか試す予定)

2.ネットワーク経由で他のPCからイベントを収集し、且つターゲットのOSが
 日本語版/英語版混在
 (日本語版Winは日本語のメッセージしか保持していないらしく、LANGID
 を切り替えても英語のとメッセージは得られない模様。
 → 接続先のOSから、メッセージの一覧を取得する必要あり?)

というわけで、できればシステムメッセージを保持しているオブジェクト(?)を
特定し、接続先OSのそれを参照できないかなと考えています。
度々もうしわけないのですが、心当たりありましたらお教え頂けませんでしょう
か...
>>592
うーん、、、KERNEL32.DLLにMessageTableリソースでエラーメッセージの一覧があるので、
あらかじめ取得しておくとか解析するとか。
bccなりで引数にエラーID取って標準出力なりにFormatMessageの結果を返す
コマンドでも作ったほうが早そうだが。
この辺を参照して自分で作成するとかw
http://msdn.microsoft.com/library/en-us/debug/base/system_error_codes.asp
596高校生:04/02/06 12:52
ひょっとしたらガイシュツかもしれませんが、
絶対パス、相対パスからファイル名だけを抜き出すAPIはありますか?

C:\\Program files\\test\\a.exe
test\\a.exe
.\a.exe
a.exe

のようなパスで、どれでもa.exeが返ってくるようなAPIが理想なのですが。
それぐらい自力で抜き出せと言われそうですが。
その場合、文字列末尾から\\までを抜き出せばいいのかな?
見つからなかったらそのまま返すという風に。
PathFindFileNameあたりか?
>>596
GetFullPathNameのlpFilePartでどうだろ
>>596
_splitpathってどう?
でも、APIとは言わないか。
APIだけどWin32APIではないね
現在マウスをフックしようと思ってプログラムを作っているのですが、
SetWindowsHookExに渡すWH_MOUSE_LLというフラグが使えなくて困ってます。
HDの中を検索した所winuser.hに書いてあるようなのですが、
インクルードしても「定義されていない識別子です。」とコンパイラに怒られます。
一応以下のようにしてインクルードしています。
#define _WIN32_WINNT 0x0400
#include<winuser.h>

開発環境はVC6 OS:Win2000です。
#define _WIN32_WINNT 0x0500
Win9x系でのキーフックについて質問なのですが、
システム全体でAlt+TabやCtrl+Escなどを禁止して、Ctrl+Alt+Delだけ
有効にする方法はないでしょうか?

SystemParametersInfo(SPI_SCREENSAVERRUNNING, ...)を使えば
Ctrl+Alt+Delまで使えなくなるし、かといってWH_KEYBOARD_LLは使えない。
WH_KEYBOARDでは、フックしても効果がないですし…。

やっぱり、無理なんでしょうか?
>>602
嘘はいかんよ、嘘は。

手元のwinuser.h見たら
#if (_WIN32_WINNT >= 0x0400)
で囲まれてるから、_WIN32_WINNTの定義はそれであってると思うよ。

気になるのは、>>601で示された定義の前にwindows.hとか、
中でwinuser.hをincludeしてるファイルをincludeしてない?

ってか、winuser.hを直接includeするよりはwindows.h一つで
済ませた方が良くないか?
605デフォルトの名無しさん:04/02/06 16:49
C/C++スレから移動してきました。

開発環境Win2K,VB6.0&VC++6.0で、
内容としてはVBの要素も強いのですが教えてください。

VB6.0でPrinterオブジェクトを利用した出力処理があるのですが、
プリンタの設定でファイルに出力する場合にファイル名を入力するダイアログがでてきます。
このダイアログを出さないようにしたいのですがなにかよい方法はないでしょうか?

(最初考えたのは、WinSpool の StartDocPrinter をフックして、
DOCINFOにファイル名を加えてやればできるかなと思ったのですが
それより先に StartDocDlg というよくわからないAPIを呼んでいて
ダイアログもそこででているようで行き詰ってしまいました・・・)
w2k+IME2kなのですが、
ワードパッドで日本語入力しているときに
入力文字の下の線が波線になっているのはどうやっているのでしょうか?
通常は点線なのですが・・・
UNIXでのシステムコールがWindowsでのW32APIに相当する物と考えていいんですか?
システムコール+Xのライブラリ、かな〜
609デフォルトの名無しさん:04/02/06 17:51
SysListView32をCreateWindowExで作ってごにょごにょやってるんですが
リスト内でマウスクリックが起きたときにどのアイテムがクリックされたかを
知るにはどうしたらいいでしょうか?
LBItemFromPtかと思ったんですが動いてくれませんでした…
WM_NOFITYでNM_CLICKあたりが飛んでこない?
>>604
ありがとうございました。
指摘されたようにwinuser.hをインクルードする前に、
windows.hをインクルードしていました。
612デフォルトの名無しさん:04/02/06 18:31
>>596 どうでもいいがデリミタは/も有効。自作する場合気をつけて
それはNTだけじゃないか?
というか、一度フルパス>UNCに正規化した後に扱うのが
Win32パスを扱う場合の定石っぽい
特定のファイルタイプに関連付けされたアイコンの取得方法って無いでしょうか?
ファイルの実体が無くても、フォルダや各種タイプに応じたアイコンがほしいんですが・・・
レジストリをたどるしか無いかな
>>607
単に「UNIX」では範囲が広すぎて何とも言えない。
Windowsのシステムコールというとネイティブということになる。
通常はエグゼクティブに直接発行するのではなく、
Win32, POSIX, OS2 などのラッパーを通して使っている。
とてもあいまいな質問なのですが、何か思いついたことがあれば一言でもお願いいたします。
APIとはちょっと違うかもしれませんが、VC質問スレとか見当たらないもので…。



以前DLLを作成するときに、自作classは使わないほうが良いと知った覚えがあります。
本で読んだのか、人から聞いたのかはよく覚えていませんが、当時の私はDLLのソースの中で
自作classを宣言&使用するのをやめてDLLを作成しました。

最近またDLLを作ろうとしたところこれを思い出し、
「はて、DLLでは自作classが使えないのかな…」と試してみたら普通にコンパイル通りました。

DLL内で自作classを宣言&使用することに、何か不都合などありますでしょうか?
どんなに細かいことでも良いのでよろしくお願いいたします。

ぐぐって調べようとしても、classもdllも一般的用語すぎてうまく絞れないもので煮詰まっております。
>>616
"DLL C++ クラス エクスポート"あたりをキーにすると少しは絞れるかも。
>>616
DLLの中だけで完全に閉じた世界でなら、無問題。

しかしDLLからクラスをエクスポートさせたいなら、
newとdeleteがアセンブラレベルで(C++の言語仕様レベルじゃないよ)
いったい何を引きおきしているのか、完璧に理解していなければならない。
620609:04/02/07 00:06
>>610
NM_CLICKの代わりに-530が飛んできました(なんじゃこりゃ…)。
うまく行かないようなので別の方法で切り抜けようと思います。
ありがとうございました。即レス戴いたのに遅くなってすみませんm(_ _)m
ExtractAssociatedIcon APIがうまく動きません。
というか戻り値のアイコンハンドルが0になってしまいます。。。
ExtractIcon APIだとちゃんとアイコンハンドルを取得できるのですが。
下記にソースをうpしてみました。だれかおしえてー(>_<

ウインドウ上に2つのボタンが配置されてます。
ExtractIcon ボタンを押すと、explorerのアイコンを表示します。
(↑これは正常に動作します)
ExtractAssociatedIcon ボタンは、win.iniに関連付けされたEXEファイルのアイコンを表示します。
(↑こちらがダメです。。。)

http://www.pandora.nu/tv/src/img20040207004452.zip
SHGetFileInfoにしてみてはどうか
>以前DLLを作成するときに、自作classは使わないほうが良いと知った覚えがあります。

MFCの共有DLLを思いっきり否定してる人がいたわけか
つーかMFCの共有DLLは、VC++しか使わないし。
コンパイラ限定のDLLで好いなら、別にclassをdllから
exportするのは自由だとおもうけど、MS自体COM作ってるわけでねぇ。
>ExtractAssociatedIcon 
第2引数にリテラルを渡したらダメじゃないの?
httpのファイルを拾いたいんですが
簡単に出来ますか?

GetHttpFile("http://〜");

見たいな感じで。

もうちょっとめんどくさくてもいいや。
>>626
URLDownloadToCacheFileとか?
628607:04/02/07 02:07
>>608,615
ありがとうございます。そういえばw2kまではos2/posixサブシステムがありましたね。
ExtractAssociatedIconの引数って、なんかアレだよなw
630デフォルトの名無しさん:04/02/07 04:24
こんにちは。

ファイル関連の扱いとして、
あるフォルダ内に、どのようなファイルがあるかを調べたいのですが、
適切なAPIがよくわかりません。

どのAPIを使うのか、軽く教えていただけるとありがたいのですが。
申し訳ありませんが、よろしくお願いいたします。
>>630
> あるフォルダ内に、どのようなファイルがあるかを調べたいのですが、

「どのような」の内容を具体的に書けよ。
ファイル名、サイズ、作成日付なんかだと API でそれなりにさくっと得られるけど、エッチな絵が含まれるファイルがあるか調べたいとか言われても困るしな。
>>617-619
ありがとうございました。昨日はあのまま寝てしまったので、これから色々調べてみます^^
>>624
お主、COMを持ち出した意図はどっちだ?
>>630
UNIXのfileみたいなやつ?
>633
どっちとは?すくなくとも、MSは、DLLでclassをexportするより、
新しくCOMを作ったという面があるわけで、つまり、DLLのexportは、
MSからしてもあまり推奨されていない、限定的な解でしかない、ってことでしょ。
COMみたいに抽象クラスを定義しておいて
インスタンス生成関数をエクスポートした方が楽だよなぁ。
>>635
推奨とかそういうんじゃなくて、
C++は名前修飾に標準規格のようなものがないから、
他社製のさまざまなC++処理系でも平等に使えるようなAPIが
作れないからだと思うぞ。
>>626
MFC使え。
639621:04/02/07 17:09
>>622
SHGetFileInfoですか。そちらでも試してみます。

>>625
>>ExtractAssociatedIcon 
>第2引数にリテラルを渡したらダメじゃないの?

むぅーよくわかりません。何を渡せばいいのでしょうか・・。

HICON ExtractAssociatedIcon(
HINSTANCE hInst, // アプリケーションインスタンスのハンドル
LPTSTR lpIconPath, // ファイル名
LPWORD lpiIcon // アイコンのインデックス番号
);

lpIconPath
1 つの文字列へのポインタを指定します。この文字列で、アイコンを
保持しているファイルのフルパスとファイル名を指定します。

と、MSDNには載っています。
でかい配列を作ってpathをコピー。そして、その配列を2番目の引数に入れる
641621:04/02/07 18:50
>>640
ありがとうございます。動きました。

うわぁワケワカラン・・・。

char* lpExeFileFullPath = "C:\\WINDOWS\\win.ini";
↑これでは動かずに、
char lpExeFileFullPath[] = "C:\\WINDOWS\\win.ini";
↑これで動く。

この2つの違いって何なんですか???わからない〜〜

>>622
SHGetFileInfoも正常に動きました。
memory allocation
>>630
ワイルドカード使ってFindFirstFile、FindNextFile
>>641
俺もそう思う。ホントに変な動きだね。
char *lpExeFileFullPath = strdup("C:\\WINDOWS\\win.ini");
とすると動くし。ワケワカラン
strdupは領域確保するから。lpExeFileFullPathに確保した領域への参照をさせる
647デフォルトの名無しさん:04/02/07 19:53
多分APIだと思うんですが。。。

エクスプローラのツール→フォルダオプションで表示される
ダイアログをプログラムから表示する方法ってあるでしょうか。
648645:04/02/07 20:05
>>646
要は、ExtractAssociatedIcon()は第2引数を書き換えるから
定数領域のメモリを渡しちゃダメって言うことでしょうかね?
(スレ違いすまん)
>>648
そのとおり。ヘルプ見ると第二引数は書き換えられることがあると
書いてあるね。バッファの大きさに気をつけないとバグるかも
嫌な仕様だなぁ。
本当なら文字リテラルを渡してもOKなはずですが、その領域は
リンカによって書き込み不可になっているのです。

多分ExtractAssociatedIcon()を実行中、保護例外が発生してると思いますよ。
>>647
control.exe folder
(Windows 2000 or lator)
652デフォルトの名無しさん:04/02/08 00:42
VB6なんですが
DrawFrameControlやDrawEdgeでユーザーコントロールの外観を描いてますが
WinXPの視覚スタイルが適用されないので困ってます。
Manifestファイルを使っても効果がありません。
"DrawFrameControl 視覚スタイル"とかで検索しても情報出てきません。
視覚スタイルを使って描画するにはどうしたらいいのでしょうか。
DrawThema〜
あたりを使うらしい。
Win32APIから外れるかもしれませんが、アプリのボトルネックを調べる為にターゲットアプリを
内部で実行し、Win32API呼び出しをフックして取得、それぞれのAPIが呼ばれた回数とそれらに
かかった時間を調べるにはどのような方法を使えば良いのでしょうか?
ターゲットアプリのソースコードは無い(つまり、gprofやVC++のプロファイラは使えない)状況でも
使えるようにしたいのですが・・・
レバーコントロールを作ろうとしているのですが、
生成されずに困っています。

生成部分は下記のとおりです(BCC5.5.1 + BCC Developer)。
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(&icc);
icc.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES;
InitCommonControlsEx(&icc);

hRebar = CreateWindowEx(
WS_EX_TOOLWINDOW,
REBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_BANDBORDERS | RBS_VARHEIGHT | CCS_NOPARENTALIGN,
0,0,100,100,
hWnd,
(HMENU)ID_REBAR,
hInstance,
NULL);

ツールバー、ステータスバーは問題なく生成できています。

ご存知の方いらっしゃいましたら、ご教授お願いします。

(Delphiでは生成できたのですが、BCC側の問題なのでしょうか?)
656デフォルトの名無しさん:04/02/08 14:20
こんにちは。

猫さんのHPに、こういう記載がされています。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_189.htm

switch (lpnmTB->iItem) {
case IDM_MARU:
lstrcpy(szMenuName, "MARUMENU");
break;
case IDM_SHIKAKU:
lstrcpy(szMenuName, "SHIKAKUMENU");
break;
}
hMenu = LoadMenu(hInst, szMenuName);
hPopup = GetSubMenu(hMenu, 0);


rebarのドロップダウンメニューを持つツールバーなんですけども、
なぜか、リソースからメニューがロードされないです。
で、上記の部分を、hMenu = LoadMenu(hInst,MAKEINRESOURCE(MARUMENU));
に変えると、きちんと読み込まれます。

何が問題で、読み込まれないんでしょうかね。?
できれば、char型のストリングで指定したいんですけども。

お手数ですが、ご返答願いますでしょうか。
657656:04/02/08 14:21
すいません、修正します。
MAKEINTRESOURCEでした。
>>655
icc.dwSize = sizeof(&icc);
これが悪いようだ。
>>656
LoadMenu(hInst,"MARUMENU");
と直接指定した場合は?
660655:04/02/08 15:16
>>658
ありがとうございます。

初歩的なミスですが、ぜんぜん見えてませんでした。
すごく恥ずかしいです。
>>654
VCならプロファイルでいけたはず。
662661:04/02/08 16:52
ごめん。本文よく呼んでなかった。
忘れてくれ。
663652:04/02/08 21:55
>>652
DrawThem"e"ですよね?検索したらかろうじて3件引っかかりました。
members.jcom.home.ne.jp/1213687801/cs/windowsforms/theme.html
「WM_THEMECHANGEDメッセージを監視する必要があり」とか書いてあるので
VB6だと結構苦手っぽいですね。書けないことはないと思うのでやってみます。
>>654
APIMONとか。
WinsockAPIをフックしたいのですがどうすればいいでしょうか?
メッセージフックでは出来なさそうですし、DLLを置き換えるくらいしかありませんか?
API関数の呼び出しをフックするにはどうすればいいでしょうか?
668デフォルトの名無しさん:04/02/09 12:57
関数Aの引数として、関数Bの関数ポインタを渡す際、関数Bはグローバルでないと
いけないのでしょうか。
関数Bがグローバルのときは通ってたコンパイルが、クラスのメンバ関数にすると
とたんにエラーをはくようになります。
>>668
これはC++の質問ですな。staticでないメンバ関数へのポインタは普通にはとれない。
>>669
いや普通に取れるだろ。
実体のないものはコンパイルとおらん
なのでstaticで宣言するのが定石
但しstaticメンバ内にはスコープが通らないため
工夫が必要

続きはC++な質問の方へ
あんまり普通とは言えない気がするなあ
>>672
>>672
このスレで質問してるって事は、APIで使うんだろ?
>>674
いや取れるから
そのポインタをAPIに渡しても無駄
中途半端な知識のやつがスレ違いなC++の事語るスレはここです。
>>671
実体が無いって
メンバ関数も new の時に実体が作られるとか
思っちゃってるのだろうか。
メンバ関数のアドレスなんていつでも取れるでしょ。

エラーが出るのは static じゃないメンバ関数は
呼び出し規約が thiscall になってるからでしょ。
>>678
virtualの扱いはどうなる。
メンバー関数のポインタはclassを指定しないと使えないから
virtualは関係ないわけだが
単に、関数ポインタの型が違っているから怒られると思うのだが......

class A
{
 static int FuncStatic(); // int (A::*)();
 int Func(); // int (*)();
};
682681:04/02/09 15:59
逆やん…
class A
{
 static int FuncStatic(); // int (*)();
 int Func(); // int (A::*)();
};
>>681-682
いやだからそれが thiscall と __cdecl や __stdcall の
呼び出し規約の違いだろ。
この話題ってFAQ&スレ違いだな。
なんか定期的にどっかで見かける。
透過色を使ったスプライト表示はどうやるんでしょうか? BitBltにはその機能はないですよね?


ウィンドウ内の話ならAlphaBlend/TransparentBlt(2000/XP)、
もしくは自力で抜き色からリージョン生成してデバイスコンテクストに選択してBitBlt。
or
DIBSectionに自力で合成。
or
DirectX。

ウィンドウそのものの形を変化させたいならSetWindowRgn/UpdateLayeredWindow(2000/XP)
ImageListもアリ
688654:04/02/09 21:12
>>664
気付きませんでした。こんな便利なものがあるんですね
ありがとうございます
JavascriptのsetTimeoutのような関数はWIN32APIにはありますか?
引数に関数と時間をセットすると、その時間経ってから関数を実行してくれるやつです。
setTimeoutがどういう動きをするのか知らんが、

処理がそこで停止して、
指定時間後に関数を実行するのなら
Sleepの後に関数呼べば済むだろ

処理がそのまま継続されるのなら、
スレッドつくることになるかな
SetTimer() はだめなんでつか。そうでつか。
timeSetEventもあるでよ。
>>690-692
ありがとうございました。
スレッドとSetTimerでやってみます。
694デフォルトの名無しさん:04/02/10 14:25
プログラム上でWindows2000のシステムロケールの既定値を変更する方法を
ご存知の方はいらっしゃいませんか?

SetLocaleInfo Win32APIが変更できるのはユーザー上書き部分だけで、シス
テムロケールの既定値は変更出来ないとの事なのですが、

[コントロールパネル]-[地域のオプション]-[既定値に設定]-[システムロケールの
選択]で変更が出来ると言うことは、なにか他の手がありそうなんですが、MSDN
ライブラリを漁ってもそれらしき方法が見つかってない状況でして...
695デフォルトの名無しさん:04/02/10 15:18
ファイルをクリックしたらそのファイルのファイル名を取得する方法はないのでしょうか?
D&Dとか使えば簡単にファイル名を取得できるのですが、
ファイルをクリックしただけでファイル名を取得したいのです。
以前にも似たような質問させてもらって恐れ入りますが、
分かる方いらっしゃいましたらよろしくお願い致します。
>>695
どこのファイルだよ?エクスプローラーか?
>>695
Browser Helper Objectsで出来るかもしれん。
出来ないかもしれん。
>>695
www.microsoft.com/globaldev/handson/dev/muiapp.mspx
によれば "Changing the system locale requires a reboot"だそうだけど。
      | Hit!!
      |
      |
   ぱくっ|
     /V\
    /◎;;;,;,,,,ヽそんなエサで
 _ ム::::(,,゚Д゚)::| 俺様が釣られると思ってんのか!!
ヽツ.(ノ:::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
700699:04/02/10 15:59
ごめん、、、誤爆した。
>>698
>www.microsoft.com/globaldev/handson/dev/muiapp.mspx
>によれば "Changing the system locale requires a reboot"だそうだけど

うん。[コントロールパネル]-(中略)-[システムロケールの選択]を行った場合も
再起動を要求されるので、その点は問題ないのだけど、自分の知りたいのは、
ユーザーさんにコントロールパネルを操作させずに、例えば、

[日本][中国][韓国]と言ったオプションボタンなりメニューなりを用意して、
ユーザーの選択に従ってWindows2000のシステムロケールを変更したいと思っ
てるんですわ。
うーん、レジストリかな。CPL内でゴニョゴニョ設定してそうに見えるけど。
>>702
>うーん、レジストリかな。CPL内でゴニョゴニョ設定してそうに見えるけど。

なるほど、起動時にレジストリを読んで設定してるかも知れないですね。
ちと調べてみます。
704695:04/02/10 17:02
相手にしてくださった方どうもありがとうございました。
早速色々とやってみます。
MoveWindowAPIを使ってウィンドウのクライアント領域をドラッグしても
ウィンドウを動かせるようにしているのですが
通常のウィンドウはタイトルバーを使ってドラッグすると
枠のみ表示された状態で移動するので
同じようにしたいのですがどうすればいいでしょうか?
MoveWindow やめて、WM_NCHITTEST で HTCAPTION 返す式にしてみては
意味わかんね
クライアントをクリックしても、タイトルバーをクリックしたってことにすんだろ。
例えがいいかどうかは別として、RealPlayerみたいに
ドラッグ中にウィンドウそのものも移動させるってことでしょ?多分。
話が耕作している
711705:04/02/10 19:47
>>706
サンプル見つけました。
まさにこれです。
わざわざマウスの座標とか計算してたのが
馬鹿みたいですね。
CreateFile使わないでLoadImageでビットマップ読み込んで
それをGetDIBitsか何か使って色数変更してHBITMAP作りたいんだけど
何かいい方法ない?
ttp://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200206_02060010.html
こんな例見付けたけど、delphi私読めないから分からないから。
ア キ ラ メ ロ
つーか、16bpp/24bpp/32bppの相互変換ならともかく、256色以下への減色だと
どう減色するかの問題だろ。
お尋ねします。
フォントをインストールせずに表示するのってどうやるんでしょうか?
APIだけでできるのでしょうか?
フォントがらみのAPIであった気がする。
一覧に表示させないでインストールしたりとか。忘れた。
>>714
あーごめん、言葉足らなかった。
全部32bitに色数変更したいんよ。
さっきLPBITMAPINFOHEADER作って、biBitCountを32にして
GetDIBitsにLoadImageから返ってきたHBITMAPを突っ込んで
やってみただんけど失敗。GetLastErrorやったら何故か0が返ってきて
意味分からなくなったから止めた…。
質問です。
モニタの省電力設定時間で省電力モードに入ったあと(画面ブラックアウト後)
何かのイベントが発生した時に、省電力モードを解除して(画面表示復帰して)
ユーザーに知らせたいのですが、うまく行きません。
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1)で
一瞬モニタの電源が復帰するのですが、またすぐに電源が切れてしまいます。

自分自身のコードで
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2)を
実行してブラックアウトした後に
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1)を
実行するとうまく行くのですが
システム側から省電力モードにされた後だとうまく行きません。
(常に省電力モードのメッセージが発行されている?)
WM_MOUSEMOVEとか投げても復帰しません。

よろしくお願いします。
>>717
DIBSectionで32bppなDIB作ってそこにLoadImageで作成したHBITMAPを
BitBltすれば?
>>718
キーボードイベントやらマウスイベント送ってやったら?
721718:04/02/10 23:51
>>720
上にも書いたのですが、WM_MOUSEMOVEではダメでした。
今度キーボードイベントで試してみます。
けどHWND_BROADCASTでキーボードイベントPostしたら
別に開いているアプリにキー入力されそう・・・
省電力を監視しているプロセスが見つかれば、そこにだけ送ればいいんでしょうけど・・・
(スクリーンセーバーを解除するのにはその手が使えますけどね。WM_CLOSE送って。)
マウスイベント→mouse_event
723718:04/02/11 00:00
>>722
ぐはぁ、mouse_eventなんてAPIがあったのですね。
知らなかった〜。試してみます。
>>722
キーボードイベント→keybd_event
725715:04/02/11 00:23
>>716
自己解決したような気がします。
AddFontResource ってやつでいいみたいです。
分かりにくい質問かと思いますが・・・タスクバーやWin9xのDOS窓のように、リサイズの際
一定量以上マウスを動かさないとリサイズ出来ないようにするにはどうすればよいのでしょうか。
APIで制限出来るのですか?
WM_WINDOWPOSCHANGINGで出来ると思うよ。
素早いレスありがとうございます。色々サンプルを探してやってみます。
729デフォルトの名無しさん:04/02/11 16:31
システムに登録されているアイコン(フォルダや関連付けされたファイルなど)を
取得するためにはどうしたらよいでしょうか。キーワードとなる関数名だけでも
教えてもらえれば自分で調べますので、よろしくおねがいします。
ExtractAssociatedIconとかSHGetInfoとか
>>730
それって実体がないと失敗するから・・・
レジストリさらえ
システムイメージリスト。…自信ないな。

もうね、CodeGuru見てくればいいじゃない。
734729:04/02/11 21:37
>>730->>733
みなさんどうもありがとうございました。
ひとつずつ調べてみます。
735デフォルトの名無しさん:04/02/11 22:52
こんにちは。

FindFirstFileで、検索ハンドルを得たあと、
その後、次のファイルを調べますよね、FindNextFileで。

その際、なぜか初めに必ず「.」(ピリオド)がファイル名として出てくるんですが、
これって、仕様なんですかね?
それとも、私のプログラム記述に何か問題でもあるのでしょうかね。

その点について、ご返答いただけたらうれしいです。
宜しくお願いします。


WIN32_FIND_DATA FindFileData;
HANDLE hFind;

hFind = FindFirstFile("D:\\*", &FindFileData);

if(hFind == INVALID_HANDLE_VALUE)
{
MessageBox(hWnd,"ERROR","FINDFIRSTFILE",0);
}

for(sfi_index=0;sfi_index<256;sfi_index++)
{
FindNextFile(hFind,&FindFileData);
if(ERROR_NO_MORE_FILES==GetLastError())break;

strcpy(sfi[sfi_index],FindFileData.cFileName);
}

FindClose(hFind);
>>735
ピリオドは、そのディレクトリ自身をあらわすディレクトリ
ピリオド2つは親ディレクトリをあらわす

サブディレクトリには必ずこの2つがあるよ
737735:04/02/11 23:15
>>736
あぁ、どうもです!
わかりました。

ご返答ありがとうです。
必ずではないよ
NTFSでフォルダにドライブをマウントすると
ピリオドひとつのエントリは存在しない
それはサブディレクトリではないね
でもルートディレクトリはドライブの直下にしかないと
思い込んでるとハマる
741723:04/02/12 12:20
>>722
mouse_event(MOUSEEVENTF_MOVE, 0, 0, 0, 0);
で無事解決しました。
どうもありがとうございます。
742デフォルトの名無しさん :04/02/12 22:56
スクリーンショットをとることのできる
APIってありますか?

>>742
BitBlt()
自分でデスクトップのDC拾ってきてBitBltすりゃいいじゃん
745742:04/02/12 23:06
ごめん説明不足でした。
ウインドウの中じゃなくてデスクトップすべてなんだけど
どうかな?
>>745
だから〜、GetDC(GetDesktopWindow()) で返ってきたhDCをBitBlt()してごらん
CreateDC("DISPLAY", 0, 0, 0)という手もアリかな。
748742:04/02/13 00:05
できました〜。
どうも有り難うございました。
>>747
それを言うなら GetDC(NULL)
746と749では微妙に違いがあったような
マルチのときとかな
752高校生:04/02/13 16:40
以前このスレで、
GetKeyState()が9x系で動かないと言いましたが、
また9x系でうまくいかない事がありました。

それは、Ellipse()です。
この関数を使って、ウインドウに楕円を描いています。
NT系でプログラムを実行すると、普通に楕円が描かれています。

ところが、9x系の場合、どうも描画が奇妙なのです。
どう奇妙かと言うと、
描画した円をまわりの部分が、
つまり円の左、右、上、下を囲む長方形部分が、
まるでファミコンがバグったように、砂嵐のように、塗りつぶされてしまうのです。

なにがいけないのでしょうか?
プログラムが悪い
754高校生:04/02/13 17:13
NT系では普通に動くんですが……。

Win98の友達に指摘されたんです。MEでも同じ症状が出ました。
NT系では今のところ、どれでも普通に動いています。

で、不思議な事に、不具合がでるPCとそうでないPCがあるのです。
学校にもWin98とWin95があったので試してみたのですが、
まったく問題なく動きました。

XPしか持ってないから、問題を三軒できないんです
>>752
ドライバ
>>752
> で、不思議な事に、不具合がでるPCとそうでないPCがあるのです。
> 学校にもWin98とWin95があったので試してみたのですが、
> まったく問題なく動きました。
のに、たまたまNT系である自分の環境で動くと
> 9x系でうまくいかない
> 9x系の場合、
とか勝手に決め付ける頭の悪さ
互換モードでデバッグしたか?
758デフォルトの名無しさん:04/02/13 21:32
Windows 2000/NT のソースコードがネット上に流出
http://www.faireal.net/
API関連だと思うので質問させていただきます。

cgiにフォームに記入してボタンを押した時のように、データを渡したいんです。
GETのようにアドレス(/hoge.cgi?data=onigiri)でわたすのでなく、
POST形式でデータで渡したいのです。

MFCを使うと簡単らしいので使ってみました。
CInternetSession
CHttpConnection
CHttpFile
使うことがわかりました。

openRequest(CHttpConnection::HTTP_VERB_POST,
SendRequest or Ex
使うこともわかりました。
(HTTP_VERB_GET形式でファイル取得も成功しました。)

でも、POST時のその前後の
WriteString等で渡すデータの渡し方の形式がわかりません。
どのような形式で渡せばいいのでしょうか?

ご教授ください。
>>758
ぅぁぁ
純粋Cだ

ソースほしい。
めっさほしい。


どこにありますか?
もうないですか?

    §,; ________§; ,
  || §; /    § ヽ  ||
  |~~~§~     §'~~~~~~~|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ____§/"""ヽ,§_____  | < Winnyで流してください。
  |__|///(§  §)ノ////|__|///\________
 ⊆___)///ゝ___§ノ/////(____⊇////
 ///////////////ジュ〜////////////
 /////////////////////////////
winsockのソースチェックしたいな。
>>758
なんか、すごくまともなソースだな。
コーディング規約とかもきっちりしてそうだし。
>>763
でも何故pureCなんだ?
普通C++だろうに。
流石M$だな。
>pureC
違うだろ
もともと一部の大学や政府機関には開示してたんでしょ?
そういうとこに所属してて、「見まくってますが何か?」って香具師はおらんの?
おりますが何か?
マイクロソフトのソースを見たけりゃ
MFCのソースを見るがいいさ
cppも混ざってますね。
>>768
いやレベルが全然違う
>>758
ウィンドウの矩形が画面の外だったら、ってのを
 MonitorFromRect(&m_rcWindow, MONITOR_DEFAULTTONULL) == NULL
とスマートに書いてるね。参考になる。
いろいろ面倒なんでできるだけ流出コード貼らんでほしいんだが。
>>772
ケチケチするなよMS
専用スレ立てようぜ。
テンプレ↓
Windows 2000/NT のソースコードがネット上に流出
http://www.faireal.net/

Neowinがつかんだのはショッキングで、ことによると破滅的なニュースだ。
ネット上にWin2000とWinNTのコードが流通しているというのだ。
現時点ではコード全体がリークしたのかどうか不明だが、コンパイルしてみれば分かるというものだ。
Microsoft からのコメントはまだない。公式には未確認である。

ソースは200MB少々のアーカイブで解凍したら600MBくらい。
全体がリークしたのではない可能性が高い。
ソース全体は約40GBだろうとCNET。つまり本当だとしても、ごく断片がリークしただけらしい。
ただし1GBの書庫も出回っており、本当にどのくらいリークしたのかは未詳。
これからどれくらい増えるか楽しみだな
全言語のページからWindows ソースコード 流出を検索しました。 約1,920件中1 - 100件目 ・検索にかかった時間0.33秒
ソースって、M$社員になったらみんな見れるのかね。
>>777
MSじゃなくても見れるよ。
779デフォルトの名無しさん:04/02/14 00:03
Win2000やXPでLANケーブルを外したり接続するとタスクトレイに
吹き出しが出るようになってるんだけど、その時のイベントって
何のイベントが発生してるか教えてくり。
監視してるだけじゃないの?
WM_USER+3147 ってのが通知メッセージかね?
Spy++でモサモサと飛んでるの見えるけど。
782781:04/02/14 00:46
ゴメン。勘違いだった。寝ようかな…。
WM_DEVICECHANGEは使えんかな?
LANケーブルはずすと、イベントビューワに表示されるから
その辺のAPIで何とかなるのでは?
しょうもない質問かもしれませんが聞いてください。
ウィンドウプロシージャをクラスに内包しようとしてたとえば下記のようなものを作りました。
class Window {
Create();
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
}
CreateのときにWNDCLASSEX構造体のcbWndExtraにsizeof(Window*)、CreateWindow
の最終パラメータにthisを渡し、WndProc関数内で
Window* pWindow = (Window*)GetWindowLong(hWnd, 0);
if (pWindow == NULL) {
if (msg == WM_CREATE) {
pWindow = (Window*)((LPCREATESTRUCT)lParam->lpCreateParams);
SetWindowLong(hWnd, 0, (LONG)pWindow);
} else {
return DefWindowProc(省略);
}
pWindow->WindowProc(省略);
}
WM_CREATE直後にプログラムが応答しなくなります。
SetWindowLongの失敗を疑ってSetLastError(0)してからGetLastErrorでチェックしてみたの
ですが一応正常に処理できているようです。
どこか直すべき点がありますでしょうか?
RegisterClassで拡張ウインドウメモリは確保してるのか?

これでもいけると思う。
Window* pWindow = (Window*)GetWindowLong(hWnd, GWL_USERDATA);
if( !pWindow ) {
pWindow = (Window*)lpcs->lpCreateParams;
::SetWindowLong( hWnd, GWL_USERDATA, (LONG)pWindow );
}
787785:04/02/14 06:03
>>786
WNDCLASSEX wcex;
wcex.cbWndExtra = sizeof(Window*);
の指定をしてRegisterClassEx(&wcex)してあります。
GWL_USERDATAを指定してみてもだめでした…。
if (msg == WM_CREATE) をはずすとAccessViolationが発生してしまいます。
(これは当然のような気がします)

うーん、クラス化はあきらめてゴリゴリ書くしかない…か。
WndProc全体が書いてないからもう何とも言えん。
ブレークポイント仕掛けて追うのがいいと思うよ。
>>787
なあ、デバッガー持ってないわけ?
>>785
if文がどういう繋がりか見づらいね...
自分は下記のようにしているよ。

if (WM_NCCREATE==uMsg) {
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lp;
CWnd* Wnd = (CWnd*)pcs->lpCreateParams;
::SetWindowLong(hWnd,GWL_USERDATA,(LONG)Wnd);
Wnd->hWnd = hWnd;
}

CWnd* Wnd = (CWnd*)::GetWindowLong(hWnd,GWL_USERDATA);
if (NULL==Wnd) {
return ::DefWindowProc(hWnd,uMsg,wp,lp);
} else {
return Wnd->DispatchEvent(hWnd,uMsg,wp,lp);//WindowProc(関数名が違うだけ)
}
791790:04/02/14 09:12
うわぁ。
半角スペースが意味ないようなので全角スペースで字下げ。

if (WM_NCCREATE==uMsg) {
  LPCREATESTRUCT pcs = (LPCREATESTRUCT)lp;
  CWnd* Wnd = (CWnd*)pcs->lpCreateParams;
  ::SetWindowLong(hWnd,GWL_USERDATA,(LONG)Wnd);
  Wnd->hWnd = hWnd;
}

CWnd* Wnd = (CWnd*)::GetWindowLong(hWnd,GWL_USERDATA);
if (NULL==Wnd) {
  return ::DefWindowProc(hWnd,uMsg,wp,lp);
} else {
  return Wnd->DispatchEvent(hWnd,uMsg,wp,lp);//WindowProc(関数名が違うだけ)
}
>>785
こらこら、気は確かか?(w
もまいはmsg==WM_CREATEのときにpWindow->WindowProc(省略)を実行しているわけだが
俺はこんな感じにしてるけど、問題なくいけてる。
LRESULT CALLBACK base_Window::initWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if (uMsg == WM_CREATE)
{
base_Window *this_ = (base_Window *)((LPCREATESTRUCT)lParam)->lpCreateParams;
::SetWindowLong(hwnd,0,(long)this_);
::SetWindowLong(hwnd,GWL_WNDPROC,(long)staticWindowProc);
return this_->WindowProc(hwnd,uMsg,wParam,lParam);
}
return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
}

ところで>785
>WM_CREATE直後
って具体的にどこやねん。
そこを教えて貰わんと判らんのとちゃうんか?
>>785

>>788も言ってるけど、WndProc全体を書いたほうがいいと思うよ。

あれだけから判断すると、pWindow==NULLの時しか処理してない気がするんだけど。
795785:04/02/14 17:29
沢山のレスありがとうございます。
WndProc全体はこんな感じになります。
LRESULT CALLBACK Window::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 Window *pWindow = (Window*)GetWindowLong(hWnd, GWL_USERDATA);
 if (pWindow == NULL) {
  if (uMsg == WM_CREATE) {
   pWindow = (Window*)(((LPCREATESTRUCT)lParam)->lpCreateParams);
   SetLastError(0);
   if (SetWindowLong(hWnd, GWL_USERDATA, (LONG)pWindow) == 0) {
    ReportError(hWnd, GetLastError());
   }
  } else {
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
 }
 return pWindow->WindowProc(hWnd, uMsg, wParam, lParam);
}
796785:04/02/14 17:32
WM_CREATE直後というのは、GetWindowLongの手前に簡単なメッセージボックス
を出させるようにしていたのですがpWindow->WindowProcでWM_CREATEを実行
した後応答なしになってしまいます。

うーん、デバッガいりますね…探してきます。
>>796
VC++とか使ってないの?
798785:04/02/14 20:36
>>797
いや、使ってないんですよ。
Digital Mars C++にPlatformSDKつっこんで使ってるんで…。
>796
だから
>pWindow->WindowProcでWM_CREATEを実行
の部分をを晒せと。
【アップローダー==ラウンジ】
(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
>>799
Window::WindowProc()側に問題があるのでは?ということですか。

たしかにuMsg==WM_CREATEが成立した場合、呼び出しますね。
802785:04/02/14 21:48
>>799
ごめんなさい、そっちを疑っていませんでした…。
WM_CREATEでTimerIDを作る部分で無限ループに陥っているんだと思います。
大変申し訳ありませんでした。
case WM_CREATE:
 SetWindowRgn(hWnd, NULL, TRUE);
 AnimateWindow(hWnd, 1000, AW_SLIDE | AW_VER_NEGATIVE);
 while (SetTimer(hWnd, m_nTimerID, 15000, NULL)) { //ここから3行が問題
  m_nTimerID++;
 }
break;
ということでこの3行を削ることで解決しました。
問題が変わってしまいましたが、正しくはm_nTimerIDが初期化されているとして
while (!SetTimer(hWnd, m_nTimerID, 15000, NULL)) {
 m_nTimerID++;
}
こうですよね?(SetTimerは失敗すると0を返す)

くだらない質問に長々とつきあって頂いてありがとうございました。
もっと精進してきます。
803779:04/02/15 01:07
>783

ん〜WM_DEVICECHANGEやったけど、呼んでくれんかった。。はふー。
804779:04/02/15 02:19
IP HELPER APIでLANが外されてるか接続されてるかは取得できる事は
わかったのだが、出来ればイベントで拾いたいな。
監視するのはアホらしいし。
ファイルのハードリンクを作りたいんですけど、どうすればいいのですか?
('A`)ノ 今日知った事〜

アップダウンコントロールに WS_CLIPSIBLINGS をつけて
任意のエディットコントロールを buddy としてセットすると
エディットコントロールの右辺のラインがうまく隠れなくて
ちょっと不恰好に表示される。

ワタスの貴重な2時間が消えて行った…… ('A`;)ノ
>>805
NTFSならくりえーとはーどりんく
FATならセクタを直接書き換えてクロスリンクさせる → chkdskでギルティ
808高校生:04/02/15 12:34
>>752
NT系では普通に動く。
9x系だと動作が変。(周りが砂嵐)

互換モードで試したが、問題が再現しない。
>>752
ビットマップは作成してから初期化するまで各ピクセルは不定値という仕様になっている。
9x系の挙動が典型的、NT系の挙動は不定値がある事情により0=黒なだけ。
じゃあやっぱりなんでもかんでも9xのせいと決め付けるアホのせいで
>>753が正しいということね
>>809
「ある事情」ってのがすごく気になる。
セキュリティとか?(他プロセスが使ってたデータが残ってたりとか)
812779:04/02/16 03:39
あーーー駄目だ。マジでもうわかんねー。誰かおせーてくれや。
監視すれ

CD-ROMドライブのトレイの開け閉めは、ドライブ側から通知してくれているものだと
思ったけど、調べたらOS側からSCSIコマンドを一定期間で送ってドライブの状態を
得ているだけだった。
>>811
ぴんぽん
815デフォルトの名無しさん:04/02/17 11:32
IEに貼り付けるムービープレイヤのActiveX作ってるのですが、
IE側でスクロールするとちらついてしまうので
その間は描画を止めたいと思っています。
IEのスクロールを検知するにはどうしたらよいのでしょうか。
システムフックするしかないのでしょうか?
WinMainのlpCmdLineのコマンドライン引数をCommandLineToArgvWで
argv形式に変換した場合

lpCmdLine (NULL)c:\document and settings\(いろいろ...)
argv[0] c:\document(NULL)
argv[1] and(NULL)
argv[2] settings\(いろいろ...)
みたいな感じで分けられてしまいます
lpCmdLine++;
wcscpy(my_path,lpCmdLine);ってやると大体出せます
だけどなぜかコマンドプロンプトで引数付きで呼び出すと自分のパスが取り出せません
WinMainとは違ってなんかややこしいです
どうしたら正確な自分のパス名を引き出せますか?
GetModuleFileNameは?
819デフォルトの名無しさん:04/02/17 13:35
>>817
マルチポストしたわけは?
820デフォルトの名無しさん:04/02/17 16:40
他のアプリケーションのボタンのキャプション変えたり、フォント変えたりするのは
SendMessageでいける?
>>820
それぐらい自分で試せ
822デフォルトの名無しさん:04/02/17 17:06
ボタンのキャプションは変えられるが、フォントの変え方が分からん。
俺様のアプリのフォントを勝手に変えるなヴォケ
824デフォルトの名無しさん:04/02/17 17:37
てめえの糞ソフトのフォントなんか変えるに値しないな
テメェの糞キャプションを補正してやってんだ。有難いと思え>823
>>823
変更されないように細工しとけ。
827デフォルトの名無しさん:04/02/17 17:46
変更されないように細工?バカじゃねーか?
まずは、外部からフォントを変更することにより発生する問題などを把握しような。
MS Sans Serifきめうちな海外ソフトでバイナリhack無しに日本語を表示させる手段としては
外部からの書き換えもいいと思うよ
830デフォルトの名無しさん:04/02/17 18:19
で、どうすればいいのですか?
メッセージでフォントを切り替えるプログラムもそうそう無いだろう
で、どんなメッセージ送ったんだ?
832829:04/02/17 18:32
実は>>829で書いたような小細工ツールが欲しいなと思っただけだったり
833デフォルトの名無しさん:04/02/17 18:36
一応WM_SETFONTを送ってみました
SendFontでも使えよ。
>>833
DialogでかつStockObjectならいけるかもな
836デフォルトの名無しさん:04/02/17 18:55
>>834>>835 
ありがとうございました。SendFontの作者の方にメールを送って
変え方を聞きました。
作者タン、ご苦労様…
教えてもらえたんだろうか・・・







詳細キボン
>>816
いやレスポイントされても。
誰も答えないってことは
結局そんなことできねーっていうことですかね。
日本語WIndowsには欧文フォントが指定されていても、
日本語を正しく表示する機能があるんだが、
あまり知られていないようだな。
質問です。

AVISaveOptionsの圧縮ダイアログでコーデックをWMV9VCMにして、
色々圧縮設定いじったあとにAVISaveVで圧縮保存したとき、
全フレームがキーフレームになったファイルができてしまいます。

WMV9VCM以外のコーデックを選んだときはちゃんと設定した値で
圧縮してくれます。

WMV9VCMってAVISaveOptionsで設定できないのでしょうか?
どなたかご教授ください。

環境:Win2k Pro, VB6sp5

842841:04/02/17 22:44
あ、VBはこっちじゃ聞いちゃダメみたいですね。
板汚しすいませんでしたl。
>>832
Emigrant32
>>839
いやコピペされても。
誰も答えないってことは
コピペに異議ありっていうことですかね。
844デフォルトの名無しさん:04/02/18 02:00
市松模様を表示するプログラムを教えてください。
8×8マスのものです。
Win32APIで市松模様?
#define CR _T("\r\n")
#define T _T("■□■□■□■□") CR _T("□■□■□■□■")
DrawText(dc, T CR T CR T CR T, -1, &rect, DT_LEFT);
質問です。こういう方法じゃ無理なのでしょうか・・・
[目的]F1でヘルプが表示される動作を殺したい(他プロセスのウィンドウ)
[やったこと]SetWindowsHookExでWH_KEYBOARDのグローバルフックをかけ、
そのプロシージャでF1のキーコードのメッセージを破棄するDLLを作成した。
[結果]世界はなにもかわらなかった。
>>847
F1キーのメッセージ自体は取れてるの?
WM_HELPを破棄した方がいいんじゃない?
>>847
もしかしたら、WH_KEYBOARD_LLの方じゃないとダメとか。
そうなると、Win9x系では使えませんが…。
>>843
でも結局誰も答えられねーんでしょ
答えられないと思ってるんならここで聞くなよw
遅レスすみません
>>848-850
F1キーのメッセージ自体はとれてました。
WH_KWYBOARD_LLではできるようです。
ただ、できればWin9xでも動くようにしておきたいんですよね・・・
WM_HELPとは、ウィンドウに送られてくるメッセージでしょうか。
WH_CALLWNDPROCではメッセージの破棄ができないようなのですが、
もしかして私は馬鹿なこと言ってます?
クラス化したダイアログボックス上のコンボボックスについての質問です(SDKのみ)。

ボタンおよびエディット部分をクリックしても、
コンボボックスのすぐ下に黒い横線が表示されるだけで、
リスト一覧が表示されずに悩んでいます。
(フォーカスがあたっている状態で、マウスホイールを上下に動かすと、
 エディット部分の表示は設定してあるリスト通りに変わります)

こういう場合、各CBN_xxxxメッセージを拾って処理しないといけないのでしょうか?
(CBN_DROPDOWNを拾ってCB_SHOWDROPDOWNを送るとcpu100%になりましたが...)

>>854
クラス化ってサブクラス化のことか?
だとすれば、いらんことをやっている可能性大。
>>854
コンボボックスのサイズが小さすぎ。
ダイアログリソースでもっと高さを高くするか、
MoveWindow で高さを増やしてください。

・・・コンボボックスの場合 Window の高さで「ドロップダウンしたときの
リスト込みの大きさ」を指定するわけですが。
857854:04/02/18 15:46
>>856
ありがとうございます。
今まで「ダイアログボックス」の高さを変更していました(^^;
>>847 ヘルプファイルをダミーに入れ替える、のはダメかな…
>>853
WH_CALLWNDPROCじゃなくてWH_GETMESSAGEではダメですか?
たしか↑はメッセージの通知を受けるだけだったはず
860デフォルトの名無しさん:04/02/18 21:07
>>846
「: error C2065: 'rect' : 定義されていない識別子です。」ってなります。
rect はどのように定義すればいいのですか?
dc のところは hdc に直しました。
#define はどこで定義すればいいのですか?
あと黒いマスを緑色にしたいです。
これらは WM_PAINT の中に書けばいいんですよね?
RECT rect;
おっとあれが進行してるとは思わなかったぜ・・・
863デフォルトの名無しさん:04/02/19 01:44
プロセスが自動で仮想メモリを確保してるっぽいんですが、
これが未使用だったら解放するのを強制するAPIってありますか?
>>863
自分のプログラムで確保したメモリを、外部から勝手に解放されたらどうなると思う?
865863:04/02/19 01:56
>864
具体的にはCView内である操作をすると勝手に仮想メモリを確保してしまい、
CViewが破棄されてもそれが解放されなくて困ってます
866デフォルトの名無しさん:04/02/19 03:31
>>863
兄が自分の夕食を作っていました。
そこへ、君がやってきて兄がちょっと目を離した隙に食べちゃいました。

どうなりますか?
ていうか、ここW32APIスレだよな?
>>866
お兄ちゃんは
「何で妹じゃないんだ…」
と、日々溜め込んできた辛い思いが一気に爆発し、うなだれる事でしょう。
>>865
MFCスレ逝け
870デフォルトの名無しさん:04/02/19 10:14
Excel VBA で使います
Date and Time Picker Control でドロップダウンリストを自動で表示させたいんだけど
CB_SHOWDROPDOWN みたいな方法があれば教えてください
今は暫定策としてフォーカス移して Alt + ↓キーを送ってます
871デフォルトの名無しさん:04/02/19 13:33
最近APIと関係ない質問が多いな
872デフォルトの名無しさん:04/02/19 13:43
PSAPIってピサピーって呼びますか?
ピーサピ
874デフォルトの名無しさん:04/02/19 14:25
複数のリソースファイル(*.rc)を使っているのですが
なんでもいいのでファイルを変更してビルドすると

obj : fatal error LNK1000: Internal error during Pass2

とかでてきます。
もう一度ビルドするとエラーがなくなります。
どっかバッティングしてるのでしょうか?
複数の*.rcファイルを使うときに注意することって何があるのでしょうか?

ちなみにrcファイルは一度作ったものをコピーしてテキストエディタで開いて
Resource.hのところを変更して使っています。(変更箇所はファイルごとに2箇所ぐらいです)
ちなみにResource.hも複数あります。
もちろんファイル名はResource0.h Resource1.h Resource2.hとかなっています。
リソースファイルを複数使ってる方おりましたらアドバイスよろしくおねがいします。
APIのエロい人に質問です。
「英数」キーが離されたことを検出する方法があれば教えてください。
メッセージで検出しようとしても、WM_KEYDOWN なら送られてくるんですが、
「ひらがな」「カタカナ」キーを押さない限り、WM_KEYUP が送られてこないんですよ。
DirectInputのサンプルで「英数」キーの動きを見れば、
まあ大概、無理だと判るだろう。特に日本語キーボードは、
Shift+英数がCapsLockなのでこのあたりの対処が惨い。
だからどうにかするなら、ドライバレベルまで降りてくるより他にない。
877874:04/02/19 15:35
878875:04/02/19 15:46
>>876
なるほど。やはりAPIレベルでは無理でしたか…。
丁寧な解説をどうもありがとうございました!
なぜMSGをプロシジャーにおくることをdispatchというのですか?
送るから
881844:04/02/19 18:34
市松模様のことですが、
int n=8,x=100,y=100,a=40; // nは8マス,xとyは座標,aは中に置くコマの大きさ
int xx=140;           // xxは座標
int m=1;            // mは1マスと言う意味

 // 四角形1マスの色(白)
 Hdr = CreateSolidBrush(RGB (255,255,225));
 HdrOld = SelectObject(hdc,Hdr );
 // 四角形1マスを描く1
Rectangle(hdc,x,y,x+a*m,y+a*m);
SelectObject(hdc,HdrOld);
DeleteObject(Hdr);

 //四角形1マスの色(緑)
 Hdr = CreateSolidBrush(RGB (0,155,0));
 HdrOld = SelectObject(hdc,Hdr );
 //四角形1ますを描く2
 Rectangle(hdc,xx,y,xx+a*m,y+a*m);
 SelectObject(hdc,HdrOld);
 DeleteObject(Hdr);

これだとxが100yが100の所に白と、xが140yが140の所に緑が1つずつしか書けない
のですが、これに何か付け加えて8マス×8マスの市松模様を作れませんか?
これを繰り返せばいいのかと思っているのですが、どのようにすればいいのか
よく分かりません。お分かりになる方教えていただけないでしょうか?
(もちろんAPIです)

>>881
Cの勉強をしましょう。APIとは特に関係のない部分ですね。
API的にやるなら市松のビットマップつくって、それをブラシに設定。
一気に塗りつぶせばいいじゃない。
884863:04/02/19 20:10
FreeUserPhysicalPagesみたいなAPIをご存知の方がいれば、と思い
質問したのですが、どうもCViewを出してしまったせいで
MFCと勘違いされてしまった方がいるみたいですね(汗
>>884
>CView内である操作をすると勝手に
ここが重要なんじゃねーかよ
>>884
SetProcessWorkingSetSize( hProcess, -1, -1) で何かが起こるかも?
でも、仮想メモリの使用量は変わらないか。
外部のプロセスのトップレベルウィンドウのハンドルを
取得している状態で、
なんらかのメッセージを送って、
モーダルダイアログがとじれられている状態にしたいのですが
(ESCを押したような)
どうしたらよいでしょうか?
そこから目的のウィンドウハンドルを取得して、メッセージを送る。
モーダルダイアログのハンドルを手に入れるにはどうしたらよいでしょうか?
(´-`).。oO("登録しる!"Dialogをオートで閉じる奴でも作るのかな…)
SetWindowsHookEx( WH_CBT )
892887:04/02/19 22:25
ある瞬間だけなので、フックを作るのは今回は適当でないかもしれません。
トップレベルウィンドウを列挙して、オーナーウィンドウを調べるのがよいかと思いました。
どうもありがとうございました。
子ウィンドウならEnumChildWindowsとか
WinNT系でAdministrator権限の必要な機能を一般ユーザー権限で使うには
サービスとして稼動させる以外の方法は無いのでしょうか?W32APIから多少
外れるようにも思いますが、よろしくお願いします。
>>894
本当にどうしてもアプリケーションが必要とするなら
Administrator権限で起動しる! とReadMeに書く手もあるが。
出来たらまずいだろう・・・
今ならスイッチする方法なかったっけ
Administratorのパスワード要求されるけど
「別のユーザーとして実行」できるな。
それは結局Runasがサービスとして動いてるわけだが
900デフォルトの名無しさん:04/02/20 14:26
>>894 ユーザー名パスワードがわかればLogonUser,ImpersonateLoggedonUserあたり?
プリンタのDPIを設定したディスプレイメモリDCを取得したいのですが、
メモリDCのDPIを変更するにはどうしたらいいんでしょうか?

mhdc = CreateCompatibleDC(printerhdc);
この普通にプリンタのDCから作る方法を使えないため、

dpi = GetDeviceCaps(printerhdc,LOGPIXELSX)
mhdc = CreateCompatibleDC(NULL);
としましたが、この後の設定に悩んでいます。

ご教授お願いいたします。
用紙サイズでメモリDCを作ればいいだろう。
用紙サイズが分からずディスプレイと同じサイズにしたいのなら
ディスプレイ(96dpi)とプリンタのdpi比を掛ければいい
一応ディスプレイの解像度(dpi)は変更可能だから決め打ちすんなよ。
……ってもあれ96dpi以外にするとそこらじゅうで描画破綻するけどな。
質問させていただきます。
Windowのタイトルバーの文字列を指定してボタンを押すと、そのWindowをSW_HIDE状態に隠すツールを作っています。
SHOWボタンを押すとそのツールがHIDEさせたWindowが復帰します。

このツール、すでにSW_HIDEなWindowは除外したいのです。
HIDEさせたWindowのhWndをリストとしてもち、SHOWボタンを押したときそれらをSW_SHOWするので
別の理由でHIDEしていたWindowまでSHOWしてしまうからです。


GetWindowPlacementで
WINDOWPLACEMENTにWindow状態をとり、
lpwndpl.showCmdを調べてみたのですが、SW_HIDEしているWindowなのに
SW_HIDEではなく、
SW_SHOWMINIMIZED (最小化してからSW_HIDEされてる場合)や
SW_SHOWNORMAL (通常状態でSW_HIDEされてる場合)が格納されています。

何故SW_HIDEではなく、他のSW_が入っているのでしょう。
どうすればSW_HIDEしているかを取得できますでしょうか。

分かる方ご教授よろしくお願いいたします。
>>904
>別の理由でHIDEしていたWindowまでSHOWしてしまうからです。
自分でHideさせたWindowHandleをリストとして保持してるのに、
なんで?
906デフォルトの名無しさん:04/02/20 23:54
Mutexオブジェクトの一覧を得る方法ってありますか?
>>905
HIDEさせる時にリストとして保存し、SHOWするときはリストを参照してSHOWするのです。
ですが今のままだと、他のツール(自分のにしろ、他の隠す系のツールにしろ)
「これ」以外のツールによってHIDEされているWindowまでリストにいれてしまいます。

このツールの動作を
「タイトルが指定されているのに一致しており、現在HIDEでないWindowをHIDEさせ、
任意でそれらを再びSHOWできる」
にしたいのです。

今だと
「タイトルが指定されているのに一致しているWindowをHIDEさせ、任意に任意でそれらをSHOWできる」
となってしまい、最初からHIDEしていたWindowまで白日の下に晒してしまうのです。

分かりづらくて申し訳ないです。
908デフォルトの名無しさん:04/02/21 00:16
>>907

>「これ」以外のツールによってHIDEされているWindowまでリストにいれてしまいます。

原因わかってるじゃねーか。
じゃ、そこを直せばいい。
ええ、なので対象のWindowがSW_HIDEしているか
GetWindowPlacementで調べようとしたのですが・・・

>>904の7行目以降な感じになってしまうのです。
>>907
IsWindowVisible
>>910
あー、忘れてた!
ありがとうございました。
計画どおりの動作をするようになりましたヽ(*´ー`)ノ
>>902
>用紙サイズでメモリDCを作ればいいだろう

 ディスプレイDCでも用紙サイズ設定は出来るのですか?
ResetDCで試しましたがダメでした。
どのAPIで設定すれば良いのでしょうか?
>>912
用紙サイズは縦横何インチ?
DPIは1インチ中に含まれるドット数なんだから、
用紙のサイズ*DPIでもとまるでしょ
>>913
用紙はA4です。
プリンタDPIが600DPIで、5040,7128です。
これをどのようにしてディスプレイDCに設定するのかがわからないのです。
ああ、ウインドウDCのスケールを調整したいという話か。
CreateCompatibleDCなんて持ち出すから、メモリDCの話かと思ったよ。

それならば求めるサイズのメモリDCに描画した後、
ウインドウDC(クライアントDC)にStretchBltをするか
SetMapModeのMM_ANISOTROPICを指定するか、
好きなほうを選んでくれ。
>>915
ディスプレイメモリDCです。

プリンタのDPIを設定したディスプレイメモリDCが必要です。
つまり、96DPIのディスプレイメモリDCを600DPIにしたいのです。

>用紙サイズでメモリDCを作ればいいだろう。
ということでしたので、
ディスプレイDCにDPIを設定した後に、CreateCompatibleDCすると思ったのですが。

HDCに図形や文字を描画するActiveXエンジンがありまして、
ディスプレイメモリDCには正常に描画できるのですが、
プリンタメモリDCには正常に描画できないのです。

そのため印刷するには、一度ディスプレイメモリDCに描画した後に、
プリンタDCにStretchDIBitsしているのですが、
ディスプレイメモリDCから作成した互換BITMAPをプリンタのサイズにして描画すると、
図形は正常ですが、文字が非常に小さくなってしまうので、
描画前にDPIをプリンタと同じに出来ればと考えたのです。

非常に分かりにくくて申し訳ないです。
もしかすると、、、
CreateCompatibleBitmapで該当サイズのビットマップを作って、
SelectObjectでメモリDCに設定する。
といったことが知りたかっただけ?
>>900
そのAPI自体にAdminどころかLocalSystem権限が必要
CreateProcessWithLogonWはRunasサービスが必要だし
>>917
>CreateCompatibleBitmapで該当サイズのビットマップを作って、
>SelectObjectでメモリDCに設定する。

916で書いてますように、描画は出来ています。
しかし、BITMAPのサイズを変更しても、
ディスプレイメモリDCのDPIは96のままで600にならず、
正常な文字の描画が出来ないため、
メモリDCのDPIのみを変更する方法が知りたいのです。
SetMapMode で MM_TWIPS じゃ駄目すか?
>>920
SetMapModeでもいろいろ試したんですが、
全体的に拡大縮小はできるのですが、DPIは変更できませんでした。
無理なんでしょうか。

描画前にFontのポイントサイズを変更するしかないのかな‥‥。
>907
何か勝手に解決したみたいだが、何で
>「これ」以外のツールによってHIDEされているWindowまでリストにいれてしまいます。
こうなるのか俺にはさっぱり理解できない。
ShowWindow(HIDE)したHWNDを放り込むだけの処理に、
どうしたら他のHWNDを持ってこれるんだ?
923デフォルトの名無しさん:04/02/21 11:09
こんにちは。

あの、WIN32APIを用いて、
自作アプリケーションから、ある他のアプリケーションへ、メッセージ(Message)を送付する
プログラムを作りたいのですが、実現は可能でしょうか?

例えば、自作アプリケーション内に、あるボタン(Control)があるとして、
そのボタンを押すと、ある特定のメモ帳.exeにテキストが入力されるみたいな。

メモ帳は通常、キーボードからテキストが入力されますが、
そのテキスト入力を、自作アプリケーション側から、したいのです。

それを実現するには、WIN32APIだと、
どのような関数を使用するのでしょうか?
FindWindow、SendMessage
>921
fontで直接指定するのはpixelだった記憶があるが。
ちゃんとDPI指定して変換掛けてるか?
>>920
それじゃ好みのdpiに設定できない
MM_ANISOTROPICを指定してSetWindowExtExとSetViewportExtEx で設定することになる
算数ができれば指定数値は割り出せるはずだから
GETDCを使う意味がわかりません
>>927
誰に聞いてるの?どのレスに対するレス?
すいません、「教えてください」最後の文に書き加えるのを忘れました
」教えてくださいとい」うことでよろしくお願いします
そういう場合は放置しとけ。
931デフォルトの名無しさん:04/02/21 22:02
アプリケーション実行中に Alt キーを押すと、OS が勝手に
プロセスの実行の権利を奪ってしまいますよね。

それを捕らえるためには WM_EXTERMENULOOP とかで良いと思うのですが、
他にも MessageBox とかを使用した場合も同じ事が起こります。

とりあえず、これらのように OS が実行権を奪う前にそれを知る
確実な手段は無いでしょうか?

もし無いのならば、上記2点だけに気を付けてコーディングすれば
良いのでしょうか?
>>931
Altキーを押さなければいい
起動中のアプリケーションのリストを作る場合ですが、
スナップショットAPIでは、実行ファイル名だけは取得できるのですが、
そのファイルのフルパスを取得する方法はないんですかねえ。
934デフォルトの名無しさん:04/02/21 22:42
>>933
EnumProcessで列挙してプロセスからフルパス取得
936933:04/02/21 23:04
>>934,935
サンクス。スナップショットにIDがあるので、GetModuleFileNameEx()で行ってみます。
解決できそうです。ありがと。
>>931
何をしようとしているのかによるが、一般論では思想的に間違っている。
PCの制御をハイジャックすることはユーザにとって脅威でしかない独善だ。

例えばマイクロ秒単位でタイミング保証の必要があるならアプリではなくハード+ドライバ。
確認なんですが、CreateDIBSectionでnewしたメモリはdeleteしなくてもいいんですよね?
939デフォルトの名無しさん:04/02/22 00:03
>>937
いいえ。ハイジャックをするのでは無く、「知ること」ができればよいのです。

例として、Windows のアプリケーションで小さなロボットを動かすことを考えます。
アプリケーションがロボットに何も命令しなければ、ロボットは常に前進し続るように
設計されていますが、アプリケーションは3秒ごとにロボットに右へ曲がるように
命令することによって、ロボットは一定区域内で旋回し続けるようになっているとします。

しかし、Alt キーを押されると、3秒ごとの命令をアプリケーションは発生させることが
出来なくなってしまうので、そのままではロボットはいつまでも前進し続けることになって
しまいます。

OS が実行権を取得する事が事前に分かれば、ロボットに「止まれ」と命令をして、
実行権が戻ってきた時点で「進め」と命令すれば、何の問題もないのですが・・・
それとALTキー検出に何の関連が・・・
941デフォルトの名無しさん:04/02/22 00:06
女性が「泥棒!」…無実?の68歳男性“ショック死”

 三重県警四日市南署は、同県四日市市内のスーパーで、今月17日に「泥棒」と叫び声を挙げた、
子連れの女性を捜している。「泥棒」呼ばわりされた男性(68)は、買い物客に取り押さえられた後に
死亡したが、防犯ビデオの分析などから、何ら犯罪行為をしていない可能性が強いという。

詳しくは、
http://headlines.yahoo.co.jp/hl?a=20040221-00000303-yom-soci
(2004/2/21/11:17 読売新聞 )

■こういう糞女には、ちゃんと責任取らせないとだめです。
 被害者の男性は、犯罪者の汚名を着せられたまま亡くなったのですよ。その無念を想像してください。

三重県警察本部059-222-0110 四日市南警察署0593-55-0110

https://www.police.pref.mie.jp/SITE1PUB/servlet/enquete.EnqueteForm/5
三重県警ご意見BOX
http://www.npa.go.jp/goiken/index.htm
警察庁ご意見箱
>>941
車運転するときはじーさんばーさんにクラクション鳴らさないように気をつけてる。
勝手に死なれちゃかなわん。
>>940
>それとALTキー検出に何の関連が・・・

別に ALT キーに拘っている訳ではなく、「モーダルな」動作に入ろうと
する時を確実に検出できればいいのですが。
>>943
そもそも

> アプリケーション実行中に Alt キーを押すと、OS が勝手にプロセスの実行の権利を奪ってしまいますよね。

と言う認識が間違ってる。
>943
スレッド使えよ
>>944
>と言う認識が間違ってる。

言葉の定義や概念の話はどうでもいいのです。
先ほども書いたように、「モーダルな」動作に入ろうとする時を
確実に検出する方法が欲しいだけなのですが・・・
フィルタドライバ作れば?
>>945
こんな些細な問題でスレッドは使いたくないのですが・・・
とかいいつつこのスレッドはもうすぐ終わりだよ
>>948
些細な問題なら放置しとけば?
>>946
> 先ほども書いたように、「モーダルな」動作に入ろうとする時を
> 確実に検出する方法が欲しいだけなのですが・・・

MFC スレならともかく、このスレ的には ALT キーで「モーダルな」動作に入るのは「あんたのプログラムの動作」だよ。
やはりブロックしたくないならUIスレッドとロボット制御スレッドを分離した方が…
>>926
そうか、SetMapModeを設定したものを出力した時に、
縮小しているように見えたのは、DPIの設定が出来ていたということでしたか。
GetDeviceCaps(memhdc,LOGPIXELSX)が96のままだったので見過ごしていました。
納得しました。ありがとうございます。

ちなみに、この返り値96を変更するAPIはあるんでしょうか?
>>951
>「あんたのプログラムの動作」だよ。

それは要するに、メッセージや呼び出す API 一つ一つに常に注意して、
これ以降の処理はモーダルな動作に入るかどうかに気を配りながら
コーディングするしかない、という意味と解釈して良い訳ですか?

その点数が少ないのなら、そのような方針でも良いのですが、
もしそのような箇所が何十種類、何百種類も出てくると手に
負えなくなるのが目に見えるので。

本来、最初にスレッドを使うことを考えたんですが、それをやらずに
済むのならやりたくないので、もっと楽な方法がないか尋ねたんですが・・・
スレッドを使うことに抵抗があること自体、あまりにもスキル不足。
それはポインタがわからなくて関数化することに抵抗があるのと同じくらいの論外だ。
>>953
できない、システム依存。
画面の設定の詳細から変更した値が返る
>>955
スキル云々より移植性の問題が大きいのですが。
(シングルタスクの実行環境も考慮して実装している為)
元々言語自体に組み込まれているのなら
私も使う事に何のためらいもないのですが。
boostのthreads使えばいいじゃないか
>>957
・シングルタスクの実行環境
・モーダルな処理がある
・定期的な処理をする必要がある

普通に考えたら、何かあきらめないと無理だと思う。
>>957
ハァ? スレ違いか???????????????????????????????????
>(シングルタスクの実行環境も考慮して実装している為)

意味不明。
タイマーでも使えばいいんじゃねーの?
>>961
DOS とかも視野に入れてるってことだろ。
だったらなおさらスレッドにしたほうが良いだろ
イベント式じゃないOSだったらどうするんだよ
>>956
そうでしたか。ありがとうございました。
>>963
あぁ、明らかなスレ違いってことか。
擬似スレッドを自分で実装して、使うしかないな。
がんばれ。
>>963
Win32sとか
969高校生:04/02/22 10:31
SHBrowseForFolder()をつかってディレクトリを選択させようとしています。
この関数の結果を絶対パスにする方法はありませんか?

GetOpenFileName()なら、カレントディレクトリが変わっているので、
GetFullPathName()が使えたのですが、それもできません。
スレッドもまともに扱えないような人が作ったものを、
様様なOSで提供したとしても誰も欲しがらない。
そもそもシングルタスクって、いったい何のOSをターゲットにしてるんだ。

どうしてもマルチプラットフォームにしたいなら、それぞれで組め。
とりあえずWindowsではスレッドだ。それ以外に無い。
971デフォルトの名無しさん:04/02/22 12:08
Buttonを押すメッセージを送りたいのですが、うまくいきません。
SendMessage(hwndBtn, WM_LBUTTONDOWN, 0, 0);
SendMessage(hwndBtn, WM_LBUTTONUP, 0, 0);
なにがいけないのでしょうか?
972971:04/02/22 12:16
hwndBtnはEnumChildWindowsを使って取得しました。
GetWindowTextを使ってキャプションを見る限りは正しく
取得できていると思います。
>>969
SHBrowseForFolder()の返り血をSHGetPathFromIDList()で処理する。
974高校生:04/02/22 13:06
>>973
thanks you!

ところで、MSDNによると、
>The calling application is responsible for freeing the returned PIDL by using the Shell allocator's IMalloc::Free method.

これを呼び出したアプリケーションは、戻り値のPIDLを、シェルアロケーターのIMalloc::Freeメソッドを用いて解放する責任を負う。

とありますが、こんなかんじですか?

  LPITEMIDLIST p;
  p = SHBrowseForFolder(...)
//必要な処理
  IMalloc::Free(p);

もし解放しない場合は、メモリリークしますか?
>>974
::CoTaskMemFree()でどうぞ
976デフォルトの名無しさん:04/02/22 14:20
タスクトレイに常駐させる場合、
アイコンでなく文字列を表示させることはできますか?

ツールチップではなく、
「日付と時刻の調整」のように、
トレイに文字列を表示させたいのです。
文字をビットマップ化してください
SetMenuを実行するとRuntimeError216が発生して悩んでいます。
解決方法のご教授お願いします。

関連するソースは以下の通りです(Delphi 6 personal)。
hM := CreateMenu;
AppendMenu(hM,MF_STRING,IDM_FILE,'&File');
SetMenu(FHandle,hM);
※FHandleはクラスメンバでWndProcでウィンドウハンドルは代入済みです。

リソースで記述したメニューでも、
ウィンドウクラス登録時にwc.lpszMenuNameで設定した場合は、問題ないのですが、
WM_CREATEでLoadMenu、SetMenuで登録しようとするとやはりRuntimeError216が発生してしまいます。
979976:04/02/22 15:55
>>977
そうします
>>978
delphi刷れ池
>>978
CreateWindowで設定しないのはどうして?
CreateProcessで外部のコンソールアプリを実行して、その標準出力の内容を
ログとして出力したいのですが、実現方法(標準出力の取り込み方法)をご教授
願えないでしょうか。
パイプ
>>976
TClockのソースでも参考にすれ。
985978:04/02/22 17:29
>>980
C++でも起こるんですけど(^^;
(この場合はcpu100%に...)
Borland製(DelphiとBCC5.5.1)だから?

>>981
ウィンドウクラスで設定しておけば、問題ないのですが、
RuntimeError216が出る理由が解かるのでは?と思って聞きました。
>971
使ったこと無いけど"BM_CLICK"?
987デフォルトの名無しさん:04/02/22 22:52
やっとバグがとれたよ・・・。この喜びをみんなにも分かってほしい・・・。
じゃ、コードどっかにうpして。
>>989
ありがとうございます。
パイプを使うのですね。試してみます。
>>990
前スレか、前前スレあたりでコンソールからのパイプについては
私が質問&研究しまくった。
ログあさってくれ。

結局他人のツールは、パイプされるのを意識して作られた(flushが所々で行われている)ツール以外は、
リアルタイム取得が無理であきらめた。
>リアルタイム取得が無理であきらめた。
あきらめるもなにも受け取ったバッファをコールバックで
通知するようなインターフェースにしとけばいいだけの話では。
いや、多分そういうことじゃなくてバッファリングの話じゃない?
>>991は無効にできるのを知らなかったのだと思われ。
ライブラリレベルでのバッファリングは親アプリから制御できないだろ
新スレ立った?
>>985
ウィンドウクラスで設定しなくても、CreateWindowでダミーのメニューを与えておき、
あとで置き換えれば上手く行きませんか?
CreateWindowで与えないと、ウィンドウクラスのメニューしか使えなくなる気がします。
新スレ、誰か頼む。
998デフォルトの名無しさん:04/02/23 02:19
次スレ立てますた・・・。

http://pc.2ch.net/test/read.cgi/prog/1077470292/
999
1000たねむら:04/02/23 02:21
1000とはぞっとしない由、本来なら担当者を怒鳴りつけるところだが、
もそもそと苦言を呈しておく。

新スレ http://pc2.2ch.net/test/read.cgi/tech/1077470361/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。