Win32API質問箱 Build53at TECH
Win32API質問箱 Build53 - 暇つぶし2ch112:デフォルトの名無しさん
07/05/18 19:52:55
>>111
それはデバッグなしで実行したときにDebugフォルダに出来るexeファイルの事ですか?
まさにそれなんですが、それは実行ファイルとは違うのでしょうか?

113:デフォルトの名無しさん
07/05/18 19:53:17
>>108
ランタイムDLLのバージョン違いだな

114:デフォルトの名無しさん
07/05/18 20:01:10
>>112
ビルドに何使ってるかわからんが、VC++とかだと
DebugとReleaseを切り替えられる。
Debugは開発環境で動かすものだ。

115:デフォルトの名無しさん
07/05/18 20:05:15
>>108
つまり、他のパソコンにDLLを入れないといけないという事ですか・・・
あまりそういうのは詳しくないので申し訳ないのですが、具体的にどうすればいいのでしょうか?

>>114
Microsoft Visual Studio 2005です。一応Microsoft Visual Studio 2005がインストールされている
他のパソコンでは正常に動作するのを確認できています。

116:デフォルトの名無しさん
07/05/18 20:07:40
>>114
Releaseにしてビルドしたらエラーが102個も出てしまいました・・・。
そういう事なのでしょうか・・・。・゚・(ノД`)・゚・。

117:デフォルトの名無しさん
07/05/18 20:09:07
VS2005を使ってると予想

118:デフォルトの名無しさん
07/05/18 20:17:24
>>116
プロジェクトのプロパティでいろいろ設定しなかったか?
あれはDebug、Release、共通、の3通りで設定できるんで
Debugだけ追加でライブラリ指定してたりするとはまる

119:デフォルトの名無しさん
07/05/18 20:26:06
そのあたりではまる人間はVC初心者スレ行きだ

120:デフォルトの名無しさん
07/05/18 20:49:45
>>115
「プロジェクト」→「プロパティ」→「構成プロパティ」→「C/C++」→「コード生成」

「ランタイム ライブラリ」を
「マルチスレッド デバッグ DLL (/MDd)」なら「マルチスレッド デバッグ (/MTd)」に
「マルチスレッド DLL (/MD)」なら「マルチスレッド (/MT)」にしてビルド

121:デフォルトの名無しさん
07/05/18 21:04:14
#pragma commentで指定する俺は勝ち組

122:デフォルトの名無しさん
07/05/18 21:51:49
>>120をやるほかに、ランタイムを用意する方法もある。
VC++ 2005ならランタイムは別途インストールするか、
マニフェスト書いてEXEと同梱する(ググれば何件か例が見つかる)

SP1を当てているかどうかで別ファイルになるんで要注意(上がSP1用)
URLリンク(www.microsoft.com)
URLリンク(www.microsoft.com)

123:デフォルトの名無しさん
07/05/18 21:55:25
BCBでVCLのスタティックリンクし忘れはしないけどbccのランタイムリンクし忘れで他PCで動かないとかはよくやる/(^o^)\

124:デフォルトの名無しさん
07/05/18 21:58:59
デバッグ用のDLLは配布禁止(ヘルプのどこかに書いてある)なので注意!!


125:デフォルトの名無しさん
07/05/18 22:21:46
ごめんなさい、ご飯を食べてました。
>>118のように、Releaseでリンカ追加したらエラーはなくなり、
他のパソコンでも無事起動させることが出来ました。
ありがとうございます。

でも、他のパソコンでやると何故か変な動作したりするので
これからそれを直そうと思います。Vistaのせいかな・・・。

126:デフォルトの名無しさん
07/05/18 22:25:09
なんか流れてしまってますが、>>105をよろしくお願いします。
気持ち悪いです。

127:デフォルトの名無しさん
07/05/18 22:45:43
>>126
メッセージループが回らないと点滅しないな、これ。
内部的にWM_TIMER使ってるのかもしれん。

128:デフォルトの名無しさん
07/05/18 22:49:33
>>100
manifestを読み込んでいるかどうかはどうやって判断した?

129:デフォルトの名無しさん
07/05/19 00:30:51
>>100
OSは?manifestはリソース埋め込み?
Vistaだと初回起動時に外部manifestが無い場合は次からは読み込まれないようだ。
URLリンク(sakura-editor.sourceforge.net)
一度XP互換モードにすれば解除される。

130:デフォルトの名無しさん
07/05/19 02:49:08
>>128
SysinternalsのProcess Monitorです。

>>129
それだ!!! 助かりました、ありがとうございます。
この挙動は仕様なのかな。ってことは、Superfetch絡みですかねぇ。

131:デフォルトの名無しさん
07/05/19 13:45:36
おぉ久々にためになる情報だ
知らないとハマるなこりゃ

132:デフォルトの名無しさん
07/05/19 15:13:23
知ってる人は知っていると思うが、
mt.exe(Manifest Tool)を使えば、以前にVS6等で作ったexeに、再コンパイル・リンク無しで
mnifestを埋め込むことができるよ。


133:デフォルトの名無しさん
07/05/19 16:50:25
manifestなんてマンドクセ

134:デフォルトの名無しさん
07/05/19 23:11:14
SendMessage(hLog, EM_LINELENGTH, (WPARAM)3, 0);

EM_LINELENGTHって、第3引数番目の行までのバイト数を取得するんですよね?
上の場合だと、エディットコントロールhLogの3行目までのバイト数を返すんだと思うのですが、
第3引数の数字をいくつに変えても同じ数値が戻ってきます。
これは何故なのですか?

135:デフォルトの名無しさん
07/05/19 23:16:19
>>134
指定した文字インデックスを含む行の文字数を返す。

136:デフォルトの名無しさん
07/05/19 23:29:36
>>135
あるサイトの説明によると、
複数行TextBoxにおいて、指定した行インデックスの一つ前の行までのバイト数を取得する
らしいんですけど、行インデックスとは、例えば第3引数に3を指定した場合、
3行目の先頭が行インデックスでいいんですか?

137:デフォルトの名無しさん
07/05/19 23:33:42
その説明は間違っている。今すぐ忘れなさい。

138:デフォルトの名無しさん
07/05/19 23:38:17
>>137
Σ(TдT)えぇぇぇぇ!?
では、指定した行までのバイト数を取得するものはないのでしょうか?
EM_GETLINEで1行ずつバイト数足していくしか方法ないですか?

139:デフォルトの名無しさん
07/05/20 00:22:48
>>138
つ EM_LINEINDEX
指定行の最初の文字の文字インデックスを返す。

140:デフォルトの名無しさん
07/05/20 00:25:27
どうやらEM_LINEINDEXというのがあるようですね。そのサイトに載ってるのが全部だと思ってました・・・。

とりあえずは解決しました。しかし、エディットコントロール内にどんどん書き足していき、
最大行数を超えると、先頭の行から消していくわけですが、出力する度に
エディットコントロールの最上部に移動し、また最下部に戻すためちらついてしまいます。
SendMessage(hLog, WM_SETREDRAW, FALSE, 0);とかしてみたのですが、
全く変わりませんでした。このちらつきを抑えたいのですが、何かいい方法はないでしょうか?


141:デフォルトの名無しさん
07/05/20 00:29:39
>>139
ありがとうございます。微妙にすれ違いになったようですね(´・ω・`)

142:デフォルトの名無しさん
07/05/20 00:30:53
そんな変なサイト読まないで、マイクロソフトのドキュメント見ろよ。

143:デフォルトの名無しさん
07/05/20 00:42:06
>>142
MSDNがなかなか・・・なかなかで。
どうやらちらつく時と、そうでない時があるようです。
また、時々画面に白い横線が入ったりしてて気持ち悪いです。
どのくらい気持ち悪いかというと亜jsふぃじゃ;jfヵfdぁじふぇくらいです。

144:デフォルトの名無しさん
07/05/20 01:38:20
意味不明

145:デフォルトの名無しさん
07/05/20 01:58:14
俺最強

146:デフォルトの名無しさん
07/05/20 02:01:38
俺西京

147:デフォルトの名無しさん
07/05/20 08:38:34
>>143
オフライン版は使ったことある?>>5

148:デフォルトの名無しさん
07/05/20 10:38:13
>>140
WM_SETREDRAWが駄目なら、LockWindowUpdateはどう?
使った事無いけど。

149:デフォルトの名無しさん
07/05/20 12:07:05
0→"ERROR_SUCCESS"
みたいにエラーから名前を取得する機構は無いですかね。

150:デフォルトの名無しさん
07/05/20 12:16:39
FORMAT_MESSAGE_FROM_SYSTEM

151:デフォルトの名無しさん
07/05/20 12:54:43
>>71をどなたかお願いします

152:デフォルトの名無しさん
07/05/20 13:24:56
一般に無理

153:デフォルトの名無しさん
07/05/20 14:05:42
>151
DataGridViewってdotNETの?それならそういうスレに行ったほうがいいと思う。

154:デフォルトの名無しさん
07/05/20 14:13:35
スレ違いかもしれないのですが、どこに書いたらいいのか分からないのでここで質問させてください。
記憶ディスクにセクタ単位でアクセスしたいのですが、
WindowsのAPIだけでそういうことはできるんでしょうか?
FAT32でもNTFSでもかまいません。方法があったら教えてください。

155:デフォルトの名無しさん
07/05/20 14:38:44
NTならCreateFileで\\.\c:\のようにドライブを指定すれば、
あとはRead/WriteFileでいける。
Cとかならバックスラッシュのエスケープに気を付けろ。

9xならvwin32を叩く。
URLリンク(web.archive.org)
俺がやったときには95 OSR2以前と以降で違う方法をとらないとうまくいかなかった。

156:デフォルトの名無しさん
07/05/20 14:45:13
SP2から禁止されなかったっけ

157:154
07/05/20 14:50:52
ありがとうございます。やってみます。

158:デフォルトの名無しさん
07/05/20 14:57:32
>>155
URLリンク(homepage3.nifty.com)
↑ソース付きなので参考になるかも。

159:158
07/05/20 14:58:17
>>155じゃなくて>>154だた。

160:デフォルトの名無しさん
07/05/20 16:01:27
>148
LockWindowUpdateは解除したときに、デスクトップ全部の再描画が発生するよ。


161:デフォルトの名無しさん
07/05/20 16:15:10
>>149

無理

162:デフォルトの名無しさん
07/05/20 18:55:32
winerror.hをreadしてparseしてだな(ry

163:デフォルトの名無しさん
07/05/20 19:47:21
タスクトレイのアイコンを右クリックして出るメニュー(TrackPopupMenu)の
メニューハンドルを取得するにはどうしたらいいでしょうか?

164:デフォルトの名無しさん
07/05/20 19:49:24
タスクトレイのアイコンを右クリックして出るメニューは自分で作るものだろ?

165:163
07/05/20 19:50:25
すみません、他のアプリです。

166:デフォルトの名無しさん
07/05/20 19:54:39
>>163
TrackPopupMenuをAPIフックするとか

167:デフォルトの名無しさん
07/05/20 19:59:20
メニューハンドルを深追いすると、WinAPIの暗黒に飲み込まれるぞ。

168:デフォルトの名無しさん
07/05/20 20:44:37
>>166-167
マジですか!?
とりあえず深追いしない程度に頑張ってみます。
ありがとうございました。

169:デフォルトの名無しさん
07/05/20 21:22:32
ポップアップするまでハンドルって分からないこともあるんじゃ?
WM_CONTEXTMENUとかでメニュー生成してたらアウトでしょ
ずっとメニューハンドル保持し続けてたらいけるかもしれないけど

170:デフォルトの名無しさん
07/05/20 21:24:25
対象プロセスのウインドウを片っ端からモニタ。

171:デフォルトの名無しさん
07/05/21 06:08:00
>>163
popupメニューの操作で起こるActionを
外部からのトリガで実行したいとか言ってた人?

前のスレで答え出てたぞ
SendMessageで WM_COMMANDとメニュー項目のid値なげればおk
id値はspy++でも使って突き止めれば行けるんでは

172:デフォルトの名無しさん
07/05/21 07:11:51
行けたー━━(゚∀゚)━━!!!!
情報サンクス愛してる♪

173:デフォルトの名無しさん
07/05/21 08:02:08
愛されたw

174:デフォルトの名無しさん
07/05/21 16:27:54
愛されたのは俺ですが

175:デフォルトの名無しさん
07/05/21 17:18:07
>>173
誰だよw

>>174
妬くなよw

176:デフォルトの名無しさん
07/05/21 17:44:33
>>174
上げるほど愛に飢えてるのかw

177:デフォルトの名無しさん
07/05/21 17:55:57
僕愛人!

178:デフォルトの名無しさん
07/05/21 18:09:51
僕ラマンチャ!

179:デフォルトの名無しさん
07/05/21 18:24:45
(XPの)クラシックスタートメニューでコントロールパネルを展開するにしている時、
コントロールパネルのアイテムの増減が即座に反映されるようにするにはどうすればいいですか?
コントロールパネルを開いたら反映されているのですが、アイコンメニューが名前順で並べ替えしないと反映されません。

180:デフォルトの名無しさん
07/05/21 18:25:40
reboot

181:デフォルトの名無しさん
07/05/21 18:28:00
ちょw

182:デフォルトの名無しさん
07/05/21 19:15:13
なのはって頭よさそうじゃん

183:デフォルトの名無しさん
07/05/21 19:16:21
むやみにコントロールパネルに追加するんじゃありません!めっ!

184:デフォルトの名無しさん
07/05/21 21:33:41
エディットコントロールからデスクトップ等にミドルボタンでD&Dした時
ドロップした位置にファイルを作成するにはどうすればいいのでしょうか

185:デフォルトの名無しさん
07/05/21 21:54:40
そんな仕様はMSのガイドラインになかった気がする。

186:デフォルトの名無しさん
07/05/22 00:00:58
IShellFolderからGetUIObjectOfでDataObject作ってDoDragDropかいな?

187:デフォルトの名無しさん
07/05/22 01:24:30
コンソール非表示のためにmainからWinMainに切り替えたんだが、そうすると
起動時にマウスカーソルが5秒程度砂時計になったままになる

長時間砂時計になるのを防ぐいい方法があったら教えてください

188:デフォルトの名無しさん
07/05/22 02:04:24
ありがとうございました
やってみます!

189:デフォルトの名無しさん
07/05/22 03:24:19
IWebBrowser2でHTMLを表示しています。戻る・進むボタンをつけ、
それぞれのボタンの有効・無効を切り替えたいのですが、
GoBack(), GoForward()が実際に有効かどうか判定する方法が分かりません。
どうしたらよいでしょうか。


190:デフォルトの名無しさん
07/05/22 03:25:07
BCC用に作られたDLLを使いたいのですが、付属の.libファイルがVisualC++で使えません。
こういう場合って、LoadLibraryとGetProcAddressで、明示的にロードして使うしか方法が無いのでしょうか?
関数ポインタをいちいちロードしていくのは面倒なんですが・・・
BCCのように、DLLから.libファイルを作るのって無理なんですかね?

191:デフォルトの名無しさん
07/05/22 03:27:08
>>187
メインスレッドが応答しないからそうなる。
別スレッドで実行しろ。

192:デフォルトの名無しさん
07/05/22 03:43:54
>>189
ITravelLogStg

193:デフォルトの名無しさん
07/05/22 07:44:55
>>189
DWebBrowser2インターフェイスでそういうイベントを捕まえられたはず

194:デフォルトの名無しさん
07/05/22 15:12:10
32767を超えるウィンドウって・・・作れないの?
子ウィンドウ(hCWnd)内では一番底に配置してある部品の座標はright:900、bottom:40000なので、WM_CREATEの最後でMoveWindow(hCWnd,0,0,1000,41000)してある。
にも関わらず、その後に親ウィンドウからGetClientRect(hCWnd,&rt)したらrt.bottomが32767になる。
どーりでスクロールバがまともに動かない訳だ・・・
32676を超えるウィンドウってどーやって作るの?
#まさか出来ん??? って・・・秀○とか・・・そこらのテキストエディタってどーやってんだ?
#MFCか?

195:デフォルトの名無しさん
07/05/22 15:27:30
>>190
名前忘れたがフリーソフトである
要は関数名列挙した.defファイルさえあれば.libは作れるんで、それを自動化したものだと思った


で、話変わるけど、GINA差し替えても「ようこそ」画面は維持できるようにする方法ってある?
1.4までの全APIをMSGINAのスタブにしただけのDLLでもようこそ画面は解除されちゃうんで・・・

196:デフォルトの名無しさん
07/05/22 15:28:18
>>194
スクロールバーで子ウィンドウをスクロールさせる発想が間違ってる
子ウィンドウでなく描画位置をかえる

197:デフォルトの名無しさん
07/05/22 15:40:07
>>190
VCなら付属のlib.exeじゃ駄目なのか

198:デフォルトの名無しさん
07/05/22 15:45:27
>>194
スクロールバー自体が最大32767じゃなかったっけ?

199:デフォルトの名無しさん
07/05/22 15:47:14
VC++ 2005EEでWin32APIとC++でゴリゴリ書いてるんだけど、
Windowsフォームアプリケーションみたいなボタンとかの
コントロールって張れるの?

200:デフォルトの名無しさん
07/05/22 15:51:49
>>199
どういった意味で言ってるのかわからん。

コントロールをウィンドウに貼ると言うだけなら
普通にCreateWindowすればいいよん。
エディットコントロールならウィンドウクラスは"EDIT"で、WS_CHILD つけて
親ウィンドウを自分のウィンドウにして。

201:デフォルトの名無しさん
07/05/22 15:55:38
>>196
> >>194
> スクロールバーで子ウィンドウをスクロールさせる発想が間違ってる
> 子ウィンドウでなく描画位置をかえる
ちょっと書き方が悪かったか。別にhCWndをMoveWindowとかしてないよ。
ちゃんとスクロールバが付けているhCWndの親をScrollWindowExで描画位置を変えてるよ。
#汎用的に使える様に子供として乗せる独自クラスを使っている。

ただ、この方法でなくても・・・↑独自クラス化しない・・・例えば 猫の第100章 SCROLLINFO構造体 の例の
WM_SIZE:のGetClientRectでも32767を超えた値を取れないんじゃないか?
#スマソまだ試してないんだけど^^;

202:デフォルトの名無しさん
07/05/22 16:02:27
>>199
ダイアログリソース作ってコントロール配置して ::CreateDialog()。

203:デフォルトの名無しさん
07/05/22 16:02:53
>別にhCWndをMoveWindowとかしてないよ。

なのに、GetClientRectにこだわってるのは何で?

204:デフォルトの名無しさん
07/05/22 16:04:36
あと、たしかにWindows95/98/Meはウィンドウのサイズの上限は32767だけどね

205:デフォルトの名無しさん
07/05/22 16:11:23
>>201
それならウィンドウをそこまで大きくする必要は無い

>>198
メッセージとして送られる値はshortだがSCROLLINFOはintまで使える
後は掛けるなり割るなりして描画位置をかえればいい

206:デフォルトの名無しさん
07/05/22 16:16:58
>>203
> >別にhCWndをMoveWindowとかしてないよ。
>
> なのに、GetClientRectにこだわってるのは何で?
ん?? あれぇ、漏れなんか勘違いしてるかぁ?
描画位置を変えるって、所詮は自分のクライアント領域を上下とか左右にスライドさせている
感覚なのだが…ちゃうんけ?
だからクライアント領域の最大値を最初に SCROLLINFO siとかに設定してスクロールバの位置と表示
されるクライアント領域の位置のつじつまが合う様にしていると思っているのだが…


207:デフォルトの名無しさん
07/05/22 16:30:35
仮に1000行のテキストがあったとする
クライアントには10行表示されたとして
そこから50行スクロールさせる
描画位置は51行、そこから60行までの10行を表示させればいい
1000行分のウィンドウサイズはいらない

208:デフォルトの名無しさん
07/05/22 16:36:33
クライアントエリアの左上は常に 0, 0 なので
どんなにスクロールさせようとGetClientRect の値は
0, 0 を起点にした大きさでしか取得できんよ。

209:デフォルトの名無しさん
07/05/22 17:05:39
>>207
いや、ちょっと待ってくれ。
確かに猫を例にしたのはちょっと悪かったが…
単に文章だけなら、そー言った方法も考えられるんだけど、実際にはクライアント領域には
さまざまなコントロール(ボタンやら)も載ってる訳で…
それらがスクロールバの動きに合わせて見え隠れするってのは、文字列みたいには
ゆかんだろう?

>>208
問題にしているのはrigth/bottomな訳だが…



どこかに良い例文はないかね? orz

210:デフォルトの名無しさん
07/05/22 17:10:09
>>209
>>207は仮の話しだしヒント
コントロールを移動させろ

211:デフォルトの名無しさん
07/05/22 17:11:31
>>209
色々貼り付けられている親のクライアント領域に 貼り付けられた子で
「子のウインドウrectを取って 親へScreenToClient する」 なら意味ありそうだが、
「子のクライアントrect 取って」 もしゃーないんじゃないか? ということを >>208 は言っている。

212:デフォルトの名無しさん
07/05/22 17:14:47
>>209
文字もコントロールも変わらんよ

213:デフォルトの名無しさん
07/05/22 17:25:47
>>209
OSを書き換える気がないなら、ウィンドウズに頼らずに自前で位置を管理して
見える所のコントロール(+α、tab等でフォーカスが次に移る可能性のあるもの)
だけ正しい位置になるようにすればOK。
あとは適当に表示されない位置に移動or非表示に。

ボタン等コントロールらしきものなどが配置された広大な領域を扱いたい
というだけなら、html ダイアログを作るという手もある。

214:デフォルトの名無しさん
07/05/22 17:35:11
フォームビューみたいなことやりたいのかな。
そもそも32767までしか作れないというのはどうやったの?
普通に32767超えられるけど。

215:デフォルトの名無しさん
07/05/22 17:42:20
Sleep()中にマウスカーソルが砂時計になるのですが、
これを矢印のままにしたいです。どうすればできますか?
MFCはできれば使いたくありません。

216:デフォルトの名無しさん
07/05/22 17:50:06
GUIスレッドでSleepすんな

217:デフォルトの名無しさん
07/05/22 17:50:08
試してないが
WM_SETCURSOR
で何とかならんか?

218:デフォルトの名無しさん
07/05/22 17:50:17
MakeSureDirectoryPathExistsって、PCSTRが引数で、
Unicodeビルドするとコンパイルが通らないんですけど、
この関数ってUnicodeのときは使えないものなんでしょうか?

219:デフォルトの名無しさん
07/05/22 17:53:07
あ、メインスレッドとめちゃってる訳ね

220:デフォルトの名無しさん
07/05/22 17:56:39
>>214
高さ、幅サイズが32767を超えられるのか?

72dpiで455インチ(1155.7センチ)、96dpiで341インチ(866.14センチ)かー


221:デフォルトの名無しさん
07/05/22 17:59:26 BE:31057128-2BP(222)
>>209
>それらがスクロールバの動きに合わせて見え隠れするってのは、文字列みたいには

同じ事だろ。

222:デフォルトの名無しさん
07/05/22 18:01:03
>>220
ああごめん、ウィンドウサイズは超えられるけど、クライアントエリアのサイズは32767止まりだったわ

223:デフォルトの名無しさん
07/05/22 18:02:15
>>218
typedef CONST CHAR* PCSTR;だったはず。
多分デバッガ用のヘルパー関数扱いだったから、
UNICODE版がないんだろうね。


224:デフォルトの名無しさん
07/05/22 18:02:37
>>218
コンパイルが通らないだけじゃわからない
必要ファイルがインクルードされてないのか
libがリンクされてないのか
WIN95を対象に開発してるのか
色々ある

225:デフォルトの名無しさん
07/05/22 18:05:27
>>223
TSTR じゃなく STR だし UNICODE版が居ないように見えるね

226:218
07/05/22 18:11:02
1 番目の引数を 'class CString' から 'const char *' に変換できません。
1 番目の引数を 'const unsigned short *' から 'const char *' に変換できません。

などと出てきます。
今までWindows2000でMBCSのままでやってたときは問題無くビルドできていたけど、
UNICODEに変更したらMakeSureDirectoryPathExistsでずらずらエラーが出ました。
UNICODEでやってる人たちって、この関数に頼ってないということなのでしょうか?

227:223
07/05/22 18:11:18
>>218
エスパー魔美な俺が一言
SHCreateDirectoryExを使え!

228:デフォルトの名無しさん
07/05/22 18:12:18
>>227
俺が・・・ってw

229:デフォルトの名無しさん
07/05/22 18:14:23
ヘルプに書いてあるなw
そうでなくてもPCSTRに変換すれば使えそうだけど

230:218
07/05/22 18:24:21
MakeSureDirectoryPathExistsを全部SHCreateDirectoryExに置き換えてみます。
ヘルプを呼んでみた限り、
SHCreateDirectoryEx(NULL, パス名, NULL);
という呼びかたでいいんですよね?
間違ってたら突っ込んでもらえると嬉しいです。
ありがとうございます。

231:デフォルトの名無しさん
07/05/22 19:15:59
dll側から自身を終了させる(exeは終了させない)にはどうしたらいいですか?
dll側で自身をFreeLibraryしてもexeは普通終了されないのでしょうか?

232:デフォルトの名無しさん
07/05/22 19:21:36
根本的に考え方を間違ってないか?

233:231
07/05/22 19:22:48
そうだと思います。
ご指摘お願いします。

234:デフォルトの名無しさん
07/05/22 19:25:23
>>210
ぐえっ、やっぱりそれかよ…orz
確かに説明わるい。早い話がExcelみたいな画面を作りたいわけだ。
で、もう一度よくよくExcelの動きを見ると…そーかぁ…クライアント領域みたいな物をスクロール
させてる訳では無いかも。枠の線って変化しないで中の数字(文字列)だけが移動しているだけかも(?)
#でも横のスクロールは線も移動してるよなぁ^^;
貼り付けたコントロールも移動させてる感じだね。

了解。やってみるよ。

235:デフォルトの名無しさん
07/05/22 19:49:37
>>231
良くわからん
FreeLibraryを使った関数使うのはexe側だろ
だったらexe側でFreeLibraryしたらいいんじゃないの?

236:231
07/05/22 19:55:55
exeは既存の物でdllが自作です。
exeでもFreeLibraryしてますが、それより早く不要になった時点でdllを解放したいのです。

237:デフォルトの名無しさん
07/05/22 19:58:58
>>236
どうやってLoadLibrary&GetProcAddressするの?

238:デフォルトの名無しさん
07/05/22 20:00:21
exe側でFreeLibraryしてるなら、勝手にDLL側終了しちゃダメじゃん。
えらいことになりそうな気がする。

239:231
07/05/22 20:07:18
>>237
特定の関数をエクスポートしていればそのdllをプラグインとして認識するタイプです。

>>238
そうですか。exeの実行時に使用してexeが終了するまで使わないので、
ちょっとでもメモリ消費量なり抑えられればと思ったのですが・・・。

240:デフォルトの名無しさん
07/05/22 20:19:10
>>239
おまいはDLLのなんたるかを理解していないな

241:デフォルトの名無しさん
07/05/22 20:25:12
もう使わないことが分かってるなら、exeのほうからFreeLibraryすりゃいいじゃないか。

242:デフォルトの名無しさん
07/05/22 20:37:27
>>241
dll側のソースだけでどのようにexeのほうからFreeLibraryするか分からないんですが・・・、
すみませんが教えて頂けませんか?

243:デフォルトの名無しさん
07/05/22 20:46:21
>>242
プラグインとして不要と exe 側のコードを書いた人が判断したタイミングで FreeLibrary を呼ぶ

DLL側のコードを書く人は自前で Load/Free を管理できねー

244:231
07/05/22 20:57:47
分かりました。ありがとうございました。

245:デフォルトの名無しさん
07/05/22 21:41:31
>>195
> MSGINAのスタブ
「ようこそ」画面を提供してるのはshgina.dll

246:デフォルトの名無しさん
07/05/22 21:42:41
Thread動かすタイプのDLLなら、
FreeLibraryAndExitThread
という話になるんだよねたしか。

247:デフォルトの名無しさん
07/05/22 21:49:56
そして、
FreeLibrary();
ExitThread();
すればいいのに、何でこんな関数あるのって話になるんだよねたしか。

248:デフォルトの名無しさん
07/05/22 21:54:05
FreeLibrary();
ExitThread();
すればいいのに、何でこんな関数あるの?

249:デフォルトの名無しさん
07/05/22 21:54:34
FreeLibraryを先に呼ぶと、ExitThread呼ぶコードがアンロードされて死亡だし、
ExitThreadを先に呼ぶと、FreeLibraryするチャンスがないからだよ、
ってたしか the Old New Things あたりに載ってたんだよねきっと。

250:デフォルトの名無しさん
07/05/22 22:03:45
なるほど。

251:デフォルトの名無しさん
07/05/22 23:11:53
子プロセスを特定してヌッ殺す方法を教えてください

明示的に作成したプロセスなら簡単なんだけど、コンソールアプリ起動した時の
conime.exeみたいに勝手にくっ付いてる子プロセスを特定する方法が分からない

252:デフォルトの名無しさん
07/05/22 23:33:52
exe, dll, ico, iclなどから
インデックス、サイズ(small/largeだけでなく24とか128も)を
指定してHICONを取得したいと思っています。

IExtractIcon::Extractで希望のアイコンは取得できるのですが
数が多いと動作が遅くて困ってます。
何か他に良い方法ってあるのでしょうか?
ご存知の方いたらお願いします。

253:デフォルトの名無しさん
07/05/22 23:39:52
>>252
エスパーが予想。
IExtractIcon::Extractとは関係ないところで速度低下

254:デフォルトの名無しさん
07/05/22 23:47:17
>251
自分をJobObjectに所属させれば。

255:デフォルトの名無しさん
07/05/23 05:41:22
>>252
>>253が原因でなければ、エクスプローラみたく非同期で処理。

256:デフォルトの名無しさん
07/05/23 09:52:32
SystemParametersInfoに SPI_SETICONSを渡した場合、
MSDNによれば
>システムアイコンを再ロードします。
って事らしいんですけど、
ここで言う「システムアイコン」って何なんですかね?

呼出は成功してるんですけど、今ひとつ実効性というか、
要するにこいつは何をやってくれるんだろうってのが、
はっきり解らないんですけど。
どなたかご存じないですか?

257:デフォルトの名無しさん
07/05/23 09:54:55
>>234
こんなもん、ちょっとでもコード書いてみりゃ要領がわかるよ

258:デフォルトの名無しさん
07/05/23 11:08:31
>>256
システムアイコンはメッセージボックスに表示されるアイコン。
?や!や×みたいなの

259:256
07/05/23 13:44:46
>>258
ありがとうございます!

あれですかー…
どうりで、実行してもぱっと見何も起こらないわけですね。

260:デフォルトの名無しさん
07/05/23 14:42:03
Win2kの環境で
アクティブデスクトップの背景を自分のウィンドウのクライアントに描画したいのですが
SHELLDLL_DefView SysListView32 Internet Explorer_Server DeskMover GetDesktopWindow()
あたりにWM_PAINTやWM_PRINTをいろいろオプション変えて送っても描画されません。
どうしたらアクティブデスクトップの背景を描画させる事ができますか?

261:デフォルトの名無しさん
07/05/23 14:58:29
PrintWindow API辺りならなんとかなるんじゃないかな?

262:デフォルトの名無しさん
07/05/23 16:46:27
マウスカーソルの下のツールバーボタンのコマンドIDかインデックスを取得したいのですがどうすればできますか?

263:デフォルトの名無しさん
07/05/23 17:01:44
>>262
URLリンク(msdn2.microsoft.com)
この中に答えがあるよ

264:デフォルトの名無しさん
07/05/23 22:12:09
>>261
PrintWindowはXPにはない。
それがアリならVistaとAero有効なPCを買ってこいと回答しておこう

265:デフォルトの名無しさん
07/05/23 22:18:21
>>264
PrintWindowはちゃんとXPにあるから。

266:デフォルトの名無しさん
07/05/23 22:21:43
>>265
ごめん「XP以降にしかない」と書こうとして間違えた。

267:252
07/05/23 23:40:35
>>253
Extract自体ではなくて前後の
COM関係のあーだ、こーだが遅いみたいでした。

>>255
非同期処理ですか、
非同期って全然分からなかったので
試しにマルチスレッドでやってみたんですが
IExtractIcon::Extractが支配的で速度は変わりませんでした。
(自分のプログラムじゃなくてオープンソースを改造してたので)。

上記のマルチスレッドも間違ってると思うので
これを気に勉強したいと思います。
ありがとうございました。



268:デフォルトの名無しさん
07/05/23 23:51:57
>>267

>>>253
>Extract自体ではなくて前後の
>COM関係のあーだ、こーだが遅いみたいでした。

よくある話だ、元気出せ。

269:デフォルトの名無しさん
07/05/23 23:52:48
元気出ました。

270:デフォルトの名無しさん
07/05/24 00:30:21
俺元気!

271:デフォルトの名無しさん
07/05/24 00:32:28
サーバークライアント型のチャットプログラミングをやっています。
クライアント側で接続/切断ボタンを超クリックしまくると、時々表示が変になります。
エラーは何も出ないのですが、最前面に出ているのにアクティブじゃなくなって、ウィンドウの一部が消え
背景にあるウィンドウが少しだけ見えるような状態です。これはログウィンドウに大量の文字がある時に起きるっぽいです。
ログウィンドウの最大サイズを3000バイトに制限したら割と正常に動作し、30000バイトにすると上記の不具合が起きます。
ボタンを連打出来ないような仕様にしてもいいのですが、出来ればあまりしたくありません。
どのようにすればいいでしょうか?

ちなみに接続ボタンを押すと接続/受信用スレッドが立ち上がり、切断ボタンを押すとスレッドが終了します。


272:デフォルトの名無しさん
07/05/24 00:39:06
>>271
ログウィンドウはエディットコントロールのおかん
ママー

273:デフォルトの名無しさん
07/05/24 00:51:54
>>272
つまり・・・どういう事ですか?

274:デフォルトの名無しさん
07/05/24 00:53:03
それは、こっちが聞きたい

275:デフォルトの名無しさん
07/05/24 00:54:25
つまりだね

276:デフォルトの名無しさん
07/05/24 01:16:12
>>271
debug

277:デフォルトの名無しさん
07/05/24 01:19:56
質問させて頂きます。
GetOpenFileNameでファイル選択ダイアログを表示し、ファイルを取得しているのですが
何故か、別のモジュール側の処理を少し追加したらダイアログが表示されなくなりました。
原因が全く分かりません…。GetOpenFileNameを利用する上で何か注意しないといけない事があるのでしょうか?

コンパイラはBCCとVCの両方で試しましたが、ダメでした。

278:デフォルトの名無しさん
07/05/24 01:22:23
追加した処理が原因です

279:デフォルトの名無しさん
07/05/24 01:33:20
>>277
debug

280:デフォルトの名無しさん
07/05/24 01:35:10
その処理を消してみて元に戻るかどうかは試したの?

281:デフォルトの名無しさん
07/05/24 01:48:33

      ,.イ´| ̄`ヽr<´ ̄  ̄`ヾ´ ̄ `ヽx''´ ̄「`丶、
     / _|ノ   ├〈,.-―     ;. _  ,ゞ--'、:\___lヽ
     ,':∨::\  /´ ̄  ̄`ヽ ヽ/´  `ヽ、-.、 \::::::::::',
      |、_;/ /  /´   ,.     、  、  \. \ \―|
      ’、  /  /  ,.  / / ,ハ ',.  ヽヽヽヽ  \ヾ/
      \_/:/:/:./ , / .,' / // | l | , l: | ', ',. ! l  :',!|
          |/:/::/:/:/:! l | { /|:!  l l } !ノ|::,!l | :| |::|:::::::|ノ
         |:/l/:/:::,|::|:{イ⌒lヾゝ ノノイ⌒lヽ|:::!::}:;!::l::::::/
        |::/|/l::/l';:{ヾlー''!     lー''!/リノノ/::/:l::/
          || |:/リ、|::l;ゞ ̄´´  ,.  ` ̄" ハ:lリノノノ'
          リ |' __,⊥!、 " " r===、 " " /ノノ  ||
        '/´\:: : \   ヽーノ  /`ーァ-、 ヾ、
       _ /     li : . ',.`ヽ、 _ ,.イ´ /.ノ::l|  ヽ \____
.    /'/       |l   ヽ `Y´ / './ . :l|   |、 /  /
      \l      |l,   \\_!_/ ‐ ´   、!|   | |\ ̄
        |      /; ´     ` ‐  ,     ヽヾ   ! \|
       |    /       ヽ::/      `ヽ |
      |     ,'        `         ', !  他のスレに貼り付けると
.       |   |::: ヾ             ヾ  .:| .|  おっぱいがポロリする
        |   '、:::.:.. .     ―       . .:.:::,' ! 不思議なギガバイ子コピペ。
       ',.     \_:::.: : :_二二二:_: : : : .:.:.:.:::/ ,'
       ':、   ト、 ̄ ´.:.:.::::::::::.:.:.:.` ―┬ '′ /
        \  |l ヽ            l|  /
.           `/,'  ヽ \         ',/
          ∧ヽ   \ \:.:.:..    ∧

282:デフォルトの名無しさん
07/05/24 01:51:56
レスありがとうございます。
>>280さん
はい、戻ります。
追加した処理の内容ですが、実行パスを取得した後に、設定ファイルのパスを作るだけの処理です^^;
メッセージボックスを出す等すると何故か表示されたりします

283:デフォルトの名無しさん
07/05/24 01:58:11
>>282
エラーコード調べたり、デバッガ使ったり
やる事は色々あるだろ

284:デフォルトの名無しさん
07/05/24 02:49:11
正直、これだけの情報で答えられるのはエスパーだけだと思う。
せめて追加したコードだけでも出すとか・・

285:デフォルトの名無しさん
07/05/24 02:52:53
メッセージボックスを出すとうまくいく、というのがなんか引っかかるな。
OPENFILENAME構造体をちゃんと初期化してるか?

286:デフォルトの名無しさん
07/05/24 03:38:11
レス有難うございます。
追加したコードを記載します。

void GetIniPath( char *p_dis, int size )
{

int point;
GetModuleFileName( NULL,p_dis,size);
// EXE名のスタートポイントを取得
point = GetFilenamePoint( p_dis );
if( point > 0 )
{
p_dis[point] = '\0';
}
wsprintf( p_dis, TEXT("%s%s"),p_dis,INI_PATH);
return;

}

GetFilenamePointでは、for文と2バイト文字、半角カナに注意した比較のみで、APIは全く使用していません
上記のコードで、iniファイルのパスを取得し、ロード処理の前で使用しています。
ロード処理に前にメッセージボックス等、処理を止めるような事をするとたまにダイアログが表示されます。

>>285さん
別のモジュールでもファイル選択ダイアログを呼んでいましたので
そのコードをそのまま持ってきて使っています。

明るくなったらもっと詳しく調べてみます。

287:デフォルトの名無しさん
07/05/24 03:51:12
wsprintf( p_dis, TEXT("%s%s"),p_dis,INI_PATH);
これって同じ領域指定しても良かったっけ?

288:デフォルトの名無しさん
07/05/24 04:02:31
だめだめです

289:デフォルトの名無しさん
07/05/24 06:58:22
だからコンパイルエラーとか挙動不審なのはAPIと関係ないっつーの

290:デフォルトの名無しさん
07/05/24 08:16:54
1.GetModuleFileName
2.結果をバッファにコピー
3.PathRemoveFileSpecでモジュール名を取り除く
4.lstrcatで"\"と設定ファイル名を追加する

(ちなみに3は自作のGetFilenamePointでええんとちゃう?)

だめなのか?

291:デフォルトの名無しさん
07/05/24 08:19:36
std::string strPath
TCHAR szAppPath[MAX_PATH];
::GetModuleFileName(NULL, szAppPath, MAX_PATH);
strPath = szAppPath;
strPath = strPath.substr(0, (strPath.rfind('\\')+1));
strPath += "[ファイル名]"

超簡単

292:デフォルトの名無しさん
07/05/24 12:55:21
std::stringのrfindとかってMBCS対応できてるんだっけ?

293:デフォルトの名無しさん
07/05/24 13:01:23
>>290
3でshlwapi使うなら4はPathAddBackslashとStringCchCatだろ

294:デフォルトの名無しさん
07/05/24 15:00:20
名前解決を行うプログラムを作りたいのですが、
DnsQuery()はPIP_ARRAYを使っており、DNSサーバにIPv4のものしか指定できません。
DNSサーバにIPv6アドレスを指定できるDnsQuery()または同等なものはないでしょうか?

よろしくおねがいいたしますm(_ _)m

295:デフォルトの名無しさん
07/05/24 18:39:44
getaddrinfo じゃ駄目なの?

296:デフォルトの名無しさん
07/05/24 18:46:03
hConnect = CreateWindow(
 TEXT("BUTTON") , TEXT("起動") ,
 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
 308 , 10 , 52 , 52 , hwnd , (HMENU)3 ,
 ((LPCREATESTRUCT)(lp))->hInstance , NULL
);

こんな感じでCreateWindow()をしているのですが、9番目の引数で指定した数値が
実際にWM_COMMANDに送られて来ず、意図しない数値が送られて来ます。
今は、WM_COMMANDの直後にLOWORD(wp)の値を調べて、その値を拾うことで
対応しているのですが、どうにかして正常な状態に戻したいです。
何故このような事が起こるのでしょうか?原因がわかりません。


297:デフォルトの名無しさん
07/05/24 18:48:44
LOWORD(wp) の値が 3 じゃないの?

298:デフォルトの名無しさん
07/05/24 18:53:02
LOWORD(wp)をMessageBoxで表示させたところ6とか見当違いの数字が入ってます。

299:デフォルトの名無しさん
07/05/24 18:54:44
追記ですが、そのボタンの9番目の引数を(HMENU)30とかに変えると、
LOWORD(wp)に30が送られてきます。これで正常に動作はさせれるのですが、
結局のところ根本の解決になってないのであまり納得が出来ません。

300:デフォルトの名無しさん
07/05/24 18:57:37
Dialog でかつ WM_INITDIALOG のタイミングで >>296 をやろうとしてる?

LOWORD(wp)==6 って IDYES 相当なんだが、、、
ちゃんとコントロール作れてないとか
break し忘れているとか
そっち方面な気配がする

301:デフォルトの名無しさん
07/05/24 18:57:59
#define IDABORT 3
とかぶってるからじゃないの?

302:デフォルトの名無しさん
07/05/24 19:10:27
Dialogは全く使用していないのですが・・・
あと申し訳ないのですが、3とか6とかいうのは適当でした。ごめんなさい。
数値が被ってるとの原因ででる不具合ならば、正しい数値を書くべきでした。
本当にエラーの出る数値は9~14で、実際に送られてくるのは50、54、58、62、66です。
これらは

for(i=0; i<5; i++){
 CreateWindow(,,,,,,,,,(HMENU)9+i,,,,);
}

で作成しています。また、変数を使わずに直接数値を指定して作成したボタンもあるのですが、
それも違う数値が送られてきます。その数値は正常に動作する別の数値に変えたので覚えていません。

303:デフォルトの名無しさん
07/05/24 19:16:21
>>302
(HMENU)9 + i じゃだめさーね
(HMENU)(9 + i) でないとあかん

304:デフォルトの名無しさん
07/05/24 19:17:05
WM_COMMAND の解説ちゃんと読め

305:デフォルトの名無しさん
07/05/24 19:20:03
>>303
頭悪い間違えですね。ごめんなさい。
首吊ってきます。死ぬ前に、直接数値指定してるのに違う数値が来る時のやつ
調べてきます。

306:デフォルトの名無しさん
07/05/24 20:22:00
>>292
たぶん対応していないし、第一TCHARを使うんだったら、
std::stringではなく、std::basic_string<TCHAR>を使うべき。

307:デフォルトの名無しさん
07/05/24 20:57:44
なんかエディットコントロールに文字が増えれば増えるほど、
動作が重くなってくるのですが、これは仕様って事でいいのでしょうか?
特に、winsockの関数周りが遅くなってるような気がします。

308:294
07/05/24 21:10:12
>>295
レスありがとうございます。

getaddrinfoは名前解決をOSに任せる物だと思っております。
(IPv6アドレスを持った)DNSサーバを指定して名前解決を行いたいです。

309:デフォルトの名無しさん
07/05/24 21:29:44
>>307
とりあえず、EM_GETHANDLE, EM_SETHANDLEを使って、
標準のハンドルを差し替えたら?
GlobalAlloc(GPTR, メモリサイズ)で当てはめはめて

なお、標準のハンドルは解放するの

んで、通信側かエディット側か判断してみれば?

パパー

310:デフォルトの名無しさん
07/05/24 21:44:14
URLリンク(msdn2.microsoft.com)
DnsQueryが使えない理由を詳しく

311:デフォルトの名無しさん
07/05/24 21:52:28
よく読めよ。
IPv6レコードではなく、IPv6アドレスしか持たないDNSサーバを扱う話だろ。

312:294
07/05/24 21:55:11
>>310
「IPv6のレコードを取得する」はできます。
「IPv6のアドレスを持ったDNSサーバに接続する」ができません。
(PIP4_ARRAY)

DNS_STATUS WINAPI DnsQuery_A(PCSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*);
DNS_STATUS WINAPI DnsQuery_W(PCWSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*);
DNS_STATUS WINAPI DnsQuery_UTF8(PCSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*);


313:デフォルトの名無しさん
07/05/24 22:06:42
IPv6でのDNSクエリの発行自体xpSP2でサポートされたばかりだしなあ。

314:デフォルトの名無しさん
07/05/24 22:08:37
URLリンク(msdn2.microsoft.com)
やっぱりよくわからないな
DNS_STATUS WINAPI DnsQuery(
PCSTR lpstrName,
WORD wType,
DWORD fOptions,
PVOID pExtra,
PDNS_RECORD* ppQueryResultsSet,
PVOID* pReserved
);

315:デフォルトの名無しさん
07/05/24 22:18:42
>>312
そのシグニチャはどこから持ってきたん?

316:デフォルトの名無しさん
07/05/24 22:23:51
Windows CE?

317:デフォルトの名無しさん
07/05/24 22:30:11
XPってv6トランスポートで本当に名前解決できるの?
URLリンク(www.ipv6style.jp)
ここ読むとできない、みたいなはなしがあるけどさ

318:デフォルトの名無しさん
07/05/24 22:30:59
>>312
WinDNS.h見てみたけど無理そうだな。アキラメロ

319:294
07/05/24 22:31:25
WinDNS.h よりです

DNS_STATUS
WINAPI
DnsQuery_A(
IN PCSTR pszName,
IN WORD wType,
IN DWORD Options,
IN PIP4_ARRAY aipServers OPTIONAL,
IN OUT PDNS_RECORD * ppQueryResults OPTIONAL,
IN OUT PVOID * pReserved OPTIONAL
);

DnsQuery_UTF8, DnsQuery_WもPCSTR pszName,PCWSTR pszName以外同じ

#ifdef UNICODE
#define DnsQuery DnsQuery_W
#else
#define DnsQuery DnsQuery_A
#endif

320:294
07/05/24 22:33:14
>>317
Vistaならできるはずです。
XPでできないならAPIでも提供されていないでしょうかね?

>>318
自分でDNSプロトコル話すしかないですかねorz

321:デフォルトの名無しさん
07/05/24 22:42:31
>>320
>自分でDNSプロトコル話すしかないですかねorz

そういう事じゃマイカ?Windowsのリゾルバは糞って有名な話で
dnsapi.dll使う前提なら無理。




322:デフォルトの名無しさん
07/05/25 00:45:58
>>294の参照しているのは、2005付属のもので、
最新のWindowsSDKでは宣言が多少変更されたっぽいな。

で、aipServersの所は予約パラメータ扱いに変更されている。
対応するつもりが、面倒で放置したって感じか。

323:名無し@沢村
07/05/25 05:34:10
256色の画面をクリップボードにコピーして、コピーや貼り付けがしたいのですが、
どのようにすればいいかわかりません。
誰か詳しく教えてくれませんか?

324:デフォルトの名無しさん
07/05/25 08:13:10
>>323
クリップボード側の話は
ChangeClipboardChain関数, CloseClipboard関数,
CountClipboardFormats関数, EmptyClipboard関数,
EnumClipboardFormats関数, GetClipboardData関数,
GetClipboardFormatName関数, GetClipboardOwner関数,
GetClipboardViewer関数, GetOpenClipboardWindow関数,
GetPriorityClipboardFormat関数, IsClipboardFormatAvailable関数,
OpenClipboard関数, RegisterClipboardFormat関数,
SetClipboardData関数, SetClipboardViewer関数,
などの関数で操作する。

あとそれに合わせてWM_COPYなどがある。
ミソはSetClipboardData関数ですかな?

325:デフォルトの名無しさん
07/05/25 10:03:00
256色だとパレットも持ってこないとな

326:294
07/05/25 11:32:09
皆様レスありがとうございます
特に>>317の記事大変参考になりました。
DLLをわざわざ開発するくらいですからAPIでは無理ですね。

BIND(dig,host,nslookup,...)のソースなどを参考に時間があるときにでも作成したいと思います。

327:デフォルトの名無しさん
07/05/25 16:15:08
読み込み違反ってどんな時に起きるんでしょうか?
LoadLibraryでDLLを呼び出してDLL内の関数を実行すると、
「アドレス 00000000 でアドレス 00000000 に対する読み込み違反がおきました。」
となります。そのDLL関数は4つの引数をサポートしていて他の3つの引数では成功します。

328:デフォルトの名無しさん
07/05/25 16:19:40
まさにぬるぽ

329:デフォルトの名無しさん
07/05/25 17:24:14
>>327
デバッグしろよ

「作ったソフトがまともに動きませんどうしてでしょうか?」
みたいな質問が多いけど情報は少ないし、しかもスレ違い

330:デフォルトの名無しさん
07/05/25 17:43:54
とりあえず、APIと関係なさそうなのは間違いない感じだなw

あれじゃね?
渡さなきゃいかん値をNULLで渡してるとか。
渡してるつもりになってる変数が0でしたとか。

331:デフォルトの名無しさん
07/05/25 17:48:23
>>327
> そのDLL関数は4つの引数をサポートしていて他の3つの引数では成功します。
どういう意味?
引数の数が一つで、4種類の値しかとらないってこと?
それとも、DLLが複数の関数をエクスポートしていて、
引数が3つのやつは成功するけど、4つのは失敗するってこと?

332:デフォルトの名無しさん
07/05/25 18:31:40
>>327
わんわん わわわん わんわん わん?
(関数ポインタの宣言がおかしいじゃね?)

333:デフォルトの名無しさん
07/05/25 19:30:13
>>327
その「アドレス 00000000 でアドレス 00000000 に対する読み込み違反がおきました。」
という分かりやすく簡潔なメッセージの何がわからないのか書いてもらわないと・・・

「アドレス」の意味が分からないとか?

334:デフォルトの名無しさん
07/05/25 19:37:12
メッセージが分からないとは書いてないぞ

335:デフォルトの名無しさん
07/05/25 19:46:51
じゃあこれでいいだろ

問い
>読み込み違反ってどんな時に起きるんでしょうか?

答え
「アドレス 00000000 に対する読み込み」を行ったとき、等。

336:デフォルトの名無しさん
07/05/25 19:48:52
( ゚д゚)ポカーン

337:デフォルトの名無しさん
07/05/25 19:50:46
OSが保護している領域に書き込んだ時
「そのアドレスはらめぇ」とWinに言われてる

338:デフォルトの名無しさん
07/05/25 19:53:24
読み込みエラーの話をしているのに書き込みの話をし出す馬鹿。

339:デフォルトの名無しさん
07/05/25 19:56:27
馬鹿馬鹿言うしか能のない馬鹿。

340:デフォルトの名無しさん
07/05/25 20:12:10
OSが保護している領域を読み込んだ時
「そのアドレスはらめぇ」とWinに言われてる

341:デフォルトの名無しさん
07/05/25 20:12:11
まぁたぶん今回のはコールバック関数のアドレスとして NULL を渡したとか
なんかそんなことだろうね。IP もゼロだし。

342:デフォルトの名無しさん
07/05/25 20:44:07
>>341
IP???????????

343:デフォルトの名無しさん
07/05/25 20:50:44
>>342
Instruction Pointer。どこのコードを実行するかを格納しているレジスタ。
「アドレス 00000000 で」の部分が当該コードのアドレスを示している。

それはともかくとして、Win32 とかいう以前の話ばかり・・・
レベル低すぎだろいくらなんでも。
この板には初心者スレとか無いのか?

344:デフォルトの名無しさん
07/05/25 20:55:26
たくさんあります

345:デフォルトの名無しさん
07/05/25 21:04:59
>>343
レベル低いのはお前の方では?
コールバック関数のアドレスとして NULL を渡したとかそんなレベルの話でないと思われ。
レベルの低い奴はレベルの低い事しか考えられないと思われても仕方ない。

346:デフォルトの名無しさん
07/05/25 21:10:02
tabcontrolってデフォルトでフォーカスの四角を表示しない機能って
ありませんでしたか?

もしあったら教えてください。

347:デフォルトの名無しさん
07/05/25 21:18:05
>>327
>読み込み違反ってどんな時に起きるんでしょうか?
>LoadLibraryでDLLを呼び出してDLL内の関数を実行すると、
>「アドレス 00000000 でアドレス 00000000 に対する読み込み違反がおきました。」
>となります。そのDLL関数は4つの引数をサポートしていて他の3つの引数では成功します。

とりあえず、考えられるのはこんなとこか?

考察1.まず、LoadLibraryの戻り値はちゃんと値が入っている?
考察2.Unicode版,ANSI版の関数名の問題
     引数に文字列を要求している場合はGetProcAddressには明示的に指定しないいけない。
     CreateFile→ANSI版はCreateFileA, Unicode版はCreateFileW
考察3.GetProcAddressの戻り値のキャスト先の問題。
     多分>>332のわんこが云う様にGetProcAddressの戻り値FARPROCの代入先が不完全で、
     関数コール時できてない。
考察4.引数が3つの関数と引数が4つの関数は同一ライブラリなのか?
     例えばLoadLibraryの実験で、
     一般的な引数3つの関数(Kernel32.libのCopyFile関数)で確認したが、
     引数4つのFloodFill関数は未チェックでKernel32.libをGdi32.libに直してない。
考察5.ライブラリの位置が巧く取得できてない。
考察6.実は、呼び出し元のアプリケーションはVBで、巧くDeclarできてない。

348:デフォルトの名無しさん
07/05/25 21:20:52
僕バッカー!

349:デフォルトの名無しさん
07/05/25 21:22:36
>>346
スタイルのTCS_TABSを外す

350:デフォルトの名無しさん
07/05/25 21:22:51
>>345
>コールバック関数のアドレスとして NULL を渡したとかそんなレベルの話でないと思われ。
おそらくそこまでも行っていないレベルの話だと思われ
NULL をコールしてるんだよね、たぶん。

351:デフォルトの名無しさん
07/05/25 21:25:54
DLL自作なのかな?

352:デフォルトの名無しさん
07/05/25 21:29:06
>>346 TCS_FOCUSNEVER ?

353:名無し@沢村
07/05/25 21:40:29
画面の描画プログラムで、hdcの互換メモリデバイスコンテキストmemdcとmemdc2をつくり、
memdcのほうに黒い線、memdc2のほうに赤い線を描いて、それらをhdcにコピーして
表示するプログラムをつくったんですが、何故かmemdc2のほうの赤い線がWM_PAINTが
送られると消えてしまうんですが、どこが悪いのでしょうか?
プログラムはまったく同じようにmemdcとmemdc2の描画とコピーを並べて書いたんですが…?

354:デフォルトの名無しさん
07/05/25 21:44:35
memdcとmemdc2をSRCPAINTにしてないとか

355:デフォルトの名無しさん
07/05/26 01:08:52
MeteredSection
・パフォーマンスはCriticalSection並で
・セマフォの様にカウンタもあり
・win9x,NT,CEで使える
というステキな同期機構があるようなんですが、

MeteredSectionを作成する関数
CreateMeteredSectionをググっても(日本語)
ヒット数が数件しかありません

これは一般には使われてないんでしょうか
だとしたら理由はなんでしょう

356:デフォルトの名無しさん
07/05/26 01:14:54
そんなに必要じゃないからだろ マイナーだし

357:デフォルトの名無しさん
07/05/26 01:15:52
>>355
単純にみんなが知らないだけだと思われ。
ってか、自分もはじめて知った

358:デフォルトの名無しさん
07/05/26 01:22:24
>>355
URLリンク(msdn.microsoft.com)

マイナーなだけ。
知ってる人は知ってる。

359:デフォルトの名無しさん
07/05/26 01:50:48
唐突な質問すみません。
WAVファイルが使用されているかどうかをチェックするにはどうすればいいでしょうか?

360:デフォルトの名無しさん
07/05/26 02:02:34
アクセス日時でも調べたら?

361:デフォルトの名無しさん
07/05/26 02:09:16
使用とはつまり今使用中なのかどうかを調べたいのですが、

362:デフォルトの名無しさん
07/05/26 02:13:31
そのWAVファイルをごみ箱に投函。

入ってくれなければ使用中。以上

363:デフォルトの名無しさん
07/05/26 02:26:09
さうんどどらいばにおくられているはけいがそのわヴのものならしようちゅう。いじょう。

364:デフォルトの名無しさん
07/05/26 02:31:54
スレ違いでしたら誘導をお願いします

CreateProcessで作成したプロセスを安全に終了させたいと思っています。
メッセージループを持っているプロセスならWM_CLOSEで事足りるのですが、コマンドラインアプリケーションの場合はどうすればいいのでしょうか?
たとえばpingの場合control-Cを送れば終了できるんじゃないかと思い、パイプを作成してETXを送ったのですが終了できません。
また、command.comのプロンプトはCR(control-M)でちゃんと改行と処理されるのですが、パイプを通した場合はLFCRを送らなければ認識されません。
パイプの処理に関して何か根本的な勘違いをしているのでしょうか?

365:デフォルトの名無しさん
07/05/26 02:42:52
>>364
どういう使い方してるの?
ウチの環境ではpingし終わったら勝手に閉じるけど?

366:デフォルトの名無しさん
07/05/26 05:59:02
command.comってことは98・・・か・・・?

367:デフォルトの名無しさん
07/05/26 08:50:30
>>364

URLリンク(support.microsoft.com)

まず、ここのサンプルを試してみ

368:デフォルトの名無しさん
07/05/26 10:16:56
シグナルを送るんだよ

369:デフォルトの名無しさん
07/05/26 11:05:33
>>364
安全に終了させる汎用的な方法は無い。
WM_CLOSEで終了したとしても、それが正規な終了方法でないアプリがあるかもしれない。
結局各アプリを解析して、個別の対応を採らなければならない。

370:デフォルトの名無しさん
07/05/26 11:08:36
ウィンドウクラスのとこで
winc.hIcon = LoadIcon(NULL , (LPCSTR)IDI_ICON2);
で、アイコンを指定しているのですが、何故かふきだしに i マークがついたアイコンになります。
リソースに自分で作成したICONを追加もしているのですが、何か上の式は間違ってるのでしょうか?

371:デフォルトの名無しさん
07/05/26 11:18:46
>>370
MSDNで第一引数の説明を調べるんだ

372:デフォルトの名無しさん
07/05/26 11:37:37
>>371
ああああありがとうございます(泣)
NULLをhInstanceにしたらアイコンが変わりました!
ぬるぬる

373:デフォルトの名無しさん
07/05/26 12:07:52
ぽぽ

374:デフォルトの名無しさん
07/05/26 13:26:33
>>364
GenerateConsoleCtrlEvent

375:364
07/05/26 19:25:12
>>365
現在親プロセスからコマンドラインアプリケーションを起動して標準出力を拾っているのですが、親プロセスを終了したときにそのコマンドラインアプリケーションを安全に終了させたいのです

>>367
拝見したところパイプの接続は私のテスト環境と同じようで、子プロセスの終了も親からでは無くping同様に子プロセスのChild.EXEが勝手に終了するのを待つだけのようでした。

>>369
起動させるプロセスは限られていますので私も個別に対応したいと考えています
たとえばCOMMAND.COMならば'EXIT'を送れば終了でき、pingならばctrl-Cで終了できるはずです。
しかし前者は成功するのですが、後者は失敗しました
パイプでは制御コードを送れないってことはありませんか?

376:デフォルトの名無しさん
07/05/26 19:35:47
>>364
ちょっ話変わるけど、
コンソールリダイレクトの想定先は何?
例えば、コンパイラのキッカーみたいなもの?
バッチ処理の結果を取得したい為?

377:デフォルトの名無しさん
07/05/26 19:35:53
自作アプリケーションにXPスタイルを適用しつつ
一部のコントロール(ステータスバーなど)のみをXPスタイル以外ってできないのかな?

378:デフォルトの名無しさん
07/05/26 20:01:01
>>377 SetWindowTheme

379:355
07/05/26 20:15:21
>>356
>>357
>>358
ありがとうございます

MSDNの記述を読む限り、とても有用な機能だと思ったんですが
何でマイナーになってるんでしょうね・・・

380:デフォルトの名無しさん
07/05/26 20:22:20
>>379
強いて言えば、無くても作れるからかも
URLリンク(msdn.microsoft.com)

381:デフォルトの名無しさん
07/05/26 20:27:33
>>379
自分で作らにゃならんし、メンテナンスや互換性を考えると面倒くさいからでしょ

382:デフォルトの名無しさん
07/05/26 20:27:36
>>379
URLリンク(forums.microsoft.com)
MeteredSectionってもともとはAPIじゃなくて
あるユーザーが勝手に作ったものみたい。

383:デフォルトの名無しさん
07/05/26 21:04:50
>>375
>>374は無視ですか。パイプを作ってCtrl-Cを送る必要自体ないと言ってるんだけど

384:デフォルトの名無しさん
07/05/26 21:13:22
>>383
心配しなくても無視されないよ。
パイプを作ってCtrl-Cを送ってもどうせ効かないから。

385:デフォルトの名無しさん
07/05/26 21:32:05
逆にパイプのデータ経由で死ねるなら、
パイプはバイナリデータを送れない、という話になる

386:デフォルトの名無しさん
07/05/26 21:33:25
その理屈はおかしい

387:デフォルトの名無しさん
07/05/26 23:57:14
ドラッグドロップとImageListについて質問です。

DropTargetの側で
ImageList_BeginDragやImageList_DragMove等のAPIを使って
ドラッグ中の画像を作るのは邪道でしょうか?
実際動いてはいるんですが。
やはりDropSourceの方でやるものなのでしょうか。

あと一つ、
ImageList_BeginDragで始まったあとに
表示されている画像を変更することはできないんでしょうか。
ImageList_Replaceは動作しませんでした。


388:デフォルトの名無しさん
07/05/27 00:11:18
ども。>>364です

>>376
ちょうどそんな感じです

>>383
ご指摘ありがとうございます。完全に見落としていました

>>374
私が探していた方法はまさしくコレです
コマンドラインアプリケーションにもちゃんとExitProcessが標準で実装されていたんですね
プログラム側で入力シーケンスを監視してctrl-C信号を拾っているんだと思っていました
色々とありがとうございました。

389:デフォルトの名無しさん
07/05/27 00:23:29
>>388
だからシグナル送れといっとるだろうが

390:387
07/05/27 00:39:55
自己解決しました。
同スレッドからD&Dされると挙動不審になるみたいです。
別スレッドからなら(一見)問題ないみたいですが。
止めることにしました。


391:デフォルトの名無しさん
07/05/27 02:35:12
猫でもわかるプログラミングってどこにあるんですか?

392:デフォルトの名無しさん
07/05/27 02:36:22
「猫でも」でぐぐれ

393:デフォルトの名無しさん
07/05/27 06:26:12
本屋に有る

394:名無し@沢村
07/05/27 08:40:17
hdc=GetDC(hwnd);

memdc=CreateCompatibleDC(hdc);
memdc2=CreateCompatibleDC(memdc);
hBita=CreateCompatibleBitmap(hdc,maxX,maxY);

SelectObject(memdc,hBita);
SelectObject(memdc2,hBita);
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
PatBlt(memdc2,0,0,maxX,maxY,PATCOPY);

で、後にSelectObjectしたほうのmemdc2がうまく作成されてないようなのですが、
(hdcにコピーして再描画すると消えてしまうので)
memdc2をうまく作成するにはどうしたらいいでしょうか?

395:デフォルトの名無しさん
07/05/27 10:54:49
ダイアログを、呼び出したアプリケーションのフォームの最前面に表示したいのですがどうすればよいのでしょう?
WS_EX_TOPMOSTや、SetWindowPosでHWND_TOPMOSTだと、他のアプリの前面にも出てしまいます。
あくまで呼び出したアプリの最前面にしたいのです。

396:デフォルトの名無しさん
07/05/27 11:04:26
WM_OVERLAPPED & WM_CHILD & WM_POPUP

397:395
07/05/27 11:10:18
失礼しました。
DialogBox関数の第3引数がうまく設定できていないのが原因でした。
お騒がせしました。

398:デフォルトの名無しさん
07/05/27 11:14:09
>>394 そのSelectObjectは何かのギャグか?

399:デフォルトの名無しさん
07/05/27 12:17:07
>>394
URLリンク(msdn.microsoft.com)
> アプリケーションは、1つのビットマップを一度に複数のデバイスコンテキストで選択することはできません。

400:名無し@沢村
07/05/27 12:52:00
>>399
つまり描画用のデバイスコンテキストを複数つくることはできないということですか?
ペイントソフトのアンドウリドゥとかはどうなっているんだろう?
メモリデバイスコンテキストを複数つくれば、そこにコピーして待避させておいて、簡単に実装できるんだけど…

401:デフォルトの名無しさん
07/05/27 12:54:49
逆にビットマップを複数作ればいい

402:名無し@沢村
07/05/27 12:58:04
私がつくりたいのは、
例えば赤と黒で画面に線を描画して、
あとから赤の線だけを消して、赤の線の下に引かれている黒い線もちゃんと復元できるようなソフトなんですけども…

黒い線と赤の線を別々のデバイスコンテキストに描画すれば簡単だと思ったんですがテ…

403:デフォルトの名無しさん
07/05/27 13:13:53
操作履歴があるなら、それをもとに
「ファイルを開く」から復元できるやろうが。

404:デフォルトの名無しさん
07/05/27 13:19:52
例えば、同じビットマップを複数のDCに選択できたとしたら、
片方のDCに書き込んだ内容はもう片方のDCでも同じ内容になるだけだが・・・

なんでビットマップを複数作ルことを思いつかないんだ?

405:デフォルトの名無しさん
07/05/27 14:23:49
熾烈な首位争いを繰り広げる、日本とハンガリー。
日本は現在ハンガリーに500万クリックほど差をつけているものの、
これで安心してはいけない。
我々のこれまでの最大クリック速度は8万~9万回/分が限度だが、
ハンガリーはなんと13万回/分を叩き出した実績がある。
実際、1400万の差を一晩でひっくり返されている。

今はハンガリー時間で7時を過ぎたところ。
彼らの動きが活発になり始めるころだ。
おまけに月曜日は祝日だという確定情報もある。
今の戦力では心もとない、まだまだ戦力を募集中だ。

もはやVIPPERだけでは太刀打ちできない。
これはもはや、VIPの枠を超え、2ch全体で立ち向かう以外に勝機はない。
諸君の参戦を切に願う。

現行スレ
【首位奪還】一番クリックした国が優勝 Click82【天王山の決戦!!】
スレリンク(news4vip板)

まとめサイト
URLリンク(www33.atwiki.jp)


406:デフォルトの名無しさん
07/05/27 14:49:49
>例えば赤と黒で画面に線を描画して、
>あとから赤の線だけを消して、赤の線の下に引かれている黒い線もちゃんと復元できるようなソフトなんですけども…

レイヤーのことだろうか?

407:デフォルトの名無しさん
07/05/27 16:23:17
この手のは、BitBltをパワーアップさせて、転送先や転送元に、
HDCだけじゃなくHWNDやHBITMAPも渡せるような
関数を作っておくと楽かな。

408:デフォルトの名無しさん
07/05/27 18:36:53
>>402
スレ違いの回答になるが・・・・
Undo/Redoをやりたいなら、ビットマップレベルで履歴を保存するより
描画内容(座標・色・線種など)で履歴を保存するほうがいいと思うよ。


409:デフォルトの名無しさん
07/05/27 18:42:42
質問です。F1を押したときにある動作をさせたいのですが、
ウィンドウプロシージャでWM_KEYDOWNでメッセージを受け取る事が出来ません。
起動した直後は出来るのですが、その後、エディットコントロールにフォーカスを移動した時とかに
メッセージを拾う事ができなくなります。エディットコントロールやボタンにフォーカスがある状態でも
メッセージを受け取るにはどうすればいいのでしょうか?

410:デフォルトの名無しさん
07/05/27 18:54:56
キー関係のメッセージははフォーカスを持つウィンドウに送られる

メッセージをDispatchする前に、アクセタレータを使うなり何なりすること。

411:デフォルトの名無しさん
07/05/27 18:56:55
ごめtypo
*アクセラレータ

TranslateAcceleratortとかHACCELとかのことです

412:デフォルトの名無しさん
07/05/27 19:56:41
HP見ながら頑張ってみたのですが、上手くいきません。
肝心な部分だけ書いてみました。どこかいけないところはあるでしょうか?

//aaa.rc
IDR_ACCELERATOR1 ACCELERATORS
BEGIN
  VK_F1,  ID_MYHELP,  VIRTKEY,  NOINVERT
END

//resource.h
#define ID_MYHELP 40001

//aaa.cpp
WinMain(){
  haccel = LoadAccelerators(hInstance, (LPCSTR)IDR_ACCELERATOR1);
}

WndProc(){
  case WM_COMMAND:
    if(LOWORD(wp)==ID_MYHELP) MessageBox();
    return 0;
}

413:デフォルトの名無しさん
07/05/27 20:07:28
LoadAccelerators(hInstance, MAKEINTRESOURCE(IDA_ACCEL1)); とか
TranslateAccelerator(hwnd, hAccel, &msg) 抜けとかかなーといってみる


414:デフォルトの名無しさん
07/05/27 20:12:37
TranslateAcceleratorは?
あと、(LPCSTR)IDR_ACCELERATOR1よりもMAKEINTRESOURCE(IDR_ACCELERATOR1)
LOWORD(wp)よりもGET_WM_COMMAND_ID(wp, lp)お薦め

415:デフォルトの名無しさん
07/05/27 20:32:19
>>413-414
TranslateAccelerator()を入れたら動作しました!
大事なところを見逃してました。ありがとうございます。

416:名無し@沢村
07/05/27 20:39:52
>>404
>なんでビットマップを複数つくることを思いつかないんだ?
memBit1=CreateCompatibleBitmap(hdc,x,y);
memBit2=CreateCompatibleBitmap(hdc,x,y);
のようにでしょうか?
表示用のデバイスは1つ(hdc)しかないので、ちょっと無理っぽい気が…

417:デフォルトの名無しさん
07/05/27 20:40:34
なんで見えない番号があるのかと思ったら
なつかしいな沢村

418:デフォルトの名無しさん
07/05/27 20:42:47
TranslateAcceleratorは>>411でわざわざ言ってあげたのにな

419:名無し@沢村
07/05/27 20:47:02
>>408
描画内容(座標、線種、色)を数値データとしてスタックに保存するのでしょうか?
データを画面に復元するときはどうすれば?
思い付くのはSetPixcelですが、
SetPixcelで1点ずつ画面に点を打っていくのでは、時間がかかりすぎるような気が…

420:名無し@沢村
07/05/27 20:52:27
>>417
なつかしいな。
プログラミングは当分休止。つーかいまプログラミングしてるけど…
いま投稿用の漫画描くためのソフトつくろうと思って質問しまくっているとこ…

これができたら、プログラミングはお休みして漫画に専念する。

421:デフォルトの名無しさん
07/05/27 21:00:41
>>419
既にAPIの質問ではないと思うが
基本的な方法としては、
1、画像そのものを最初にどこかに保存しておいて
2、描画時に使ったコマンドの内容を保存しておく。 点を打った、線を引いた、円を描いたというようなね。

そして、巻き戻すときは、1から順にコマンドを再現して、一つ手前で止めればいい。

422:デフォルトの名無しさん
07/05/27 21:26:41
WM_CHARメッセージで、送られてきた文字を取得することは可能なのでしょうか?


423:デフォルトの名無しさん
07/05/27 21:29:18
>>422
お前が手の届く範囲にいたら殴りたい。
なんで訊く前にちょっと調べてみないわけ?
ほんの少し調べれば分かることなのに。

424:デフォルトの名無しさん
07/05/27 21:37:34
本人にとって、2chで聞く=調べる、なんだろうな

お前の手の届く範囲にはディスプレイがあるだろうから代わりにそれでも殴っとけ

425:デフォルトの名無しさん
07/05/27 21:52:49
いえ、質問の仕方が適当すぎました・・・。
WM_CHARのwpに入ってるっぽいのですが、その取り出し方がわかりません。
MessageBox()で表示させようと、(PTSTR)&wpにしても、文字コード取得しようとして(int)wpで見てみても
なんか全然変な値が入っててわけわかりません。

426:デフォルトの名無しさん
07/05/27 22:01:52
あのさあ、ちゃんと調べてんの?
ぐぐっただけで詳しい使い方なり情報なりわんさか出てくるんだが。

TranslateMessageはちゃんと読んでんよな?
だったらWPARAM型のwpにキャラクタコードが入ってるんだが。
ちなみにキーコードじゃないぞ

俺も殴りたくなってきた

427:デフォルトの名無しさん
07/05/27 22:02:22
殴るなら俺を殴れ

428:デフォルトの名無しさん
07/05/27 22:15:19
>>419
SaveDC, RestoreDCじゃダメか?

429:デフォルトの名無しさん
07/05/27 22:16:38
>>425
Cの文字の扱いをまるで理解していないと見た。

430:デフォルトの名無しさん
07/05/27 22:36:50
いえ、殴るなら僕を殴って下さい。それはそのはず、入ってるわけがありませんでした。
WM_COMMANDで拾ってそのパラメータからWM_CHARの処理やってたので、
そのままWM_CHARを捕まえたような気分になってました。

431:デフォルトの名無しさん
07/05/27 22:44:41
>>430
あんた誰だよ。>>425か?

名乗りもせずいきなり僕などという一人称使うな。殴るぞ

432:412
07/05/27 22:57:40
>>412-415
これでF1はどこにカーソルがあっても機能するようになったのですが、
F2、F3は機能しなくなりました。F2、F3等は、あるエディットコントロール内にカーソルが
ある時のみ有効にしたくて、F1だけ特殊な感じでした。これはF2、F3とかも
アクセラレータに持っていかれてしまってるせいなのでしょうか?

433:デフォルトの名無しさん
07/05/27 22:59:21
>>431
すみません、俺が悪かったです。もう名乗りません。
違う方法でなんとか解決できたのでなんとか出来ました。

434:デフォルトの名無しさん
07/05/27 23:25:20
>>433
だーかーら、名乗りもせず「俺が」なんて言うな、っていってんだよ
>>430です、くらい書けよ
誰だかわからんだろう

435:デフォルトの名無しさん
07/05/27 23:28:17
いえ、それは俺です。

436:デフォルトの名無しさん
07/05/27 23:29:05
>>434
俺だよ俺

437:デフォルトの名無しさん
07/05/27 23:34:17
だから俺が俺なんだって
勝手に人の名前騙るなよ

438:デフォルトの名無しさん
07/05/27 23:36:23
>>437
すまん、お前が俺か。
悪かった。

439:デフォルトの名無しさん
07/05/27 23:54:24
>>412
もしかして: WM_HELP
なんか、ID_MYHELPとか書いているし。

440:412
07/05/28 00:02:55
>>439
いえ、WM_HELPではありません。まぁ同じなんですけど、
F1ボタンを押したら自分で作ったヘルプのウィンドウが出るようにしています。
それはいいんですが、F2~F8にもその他の機能を用意していて、
あるエディットコントロールをサブクラス化してそのプロシージャで
WM_KEYDOWNで拾っているのですが、それが機能しなくなりました。
F1だけをアクセラレータで変にやったせいなのでしょうか?

441:デフォルトの名無しさん
07/05/28 00:12:26
>>420
コミックスタジオでも買った方が良いぞ

あ、マンガ描くためのソフトから作ったのを作品の
ネタにするのなら恐れ入る

442:名無し@沢村
07/05/28 00:16:43
突然ですが、2つのメモリデバイスコンテキストを合成して描画することに成功しました。
黒い線の画面のほうをBitBltのSRCANDで画面にコピーし、
赤い線の画面のほうをSRCCOPYで画面にコピーしたら、
再描画をかけてもどっちの線も消えませんでした。
ただ、この方法だと、赤い線も黒くなってしまうようです…

赤い線が黒くならないようにするには、どうしたらいいのでしょう?
いくつも組み合わせがあるので、全部ためすのは、気が遠くなるほど時間がかかりそうなので…

443:デフォルトの名無しさん
07/05/28 00:20:18
組み合わせとは何の組み合わせ?

444:デフォルトの名無しさん
07/05/28 00:30:55
ねむい

445:デフォルトの名無しさん
07/05/28 00:58:48
質問です。
CでWindowsプログラム作るため、Win32APIを学ぼうと思っていろいろ調べている途中で気になったことがあります。
テンプレのWin32 API入門というサイトではWin32API学ぶ上で、
windowsの知識とアーキテクチャの知識が必須だと書かれていました。
そこで、「コンピュータの構成と設計」「アーキテクチャ徹底解説MicrosoftWindows2000・・・」
などの書籍でコンピュータアーキテクチャについて学んだ方がいいのでしょうか?
お金に余裕がないので無駄な出費は避けたいです。
ちなみに私は、基本情報技術者試験の知識とCの入門書の知識くらいしかもっていません。
御回答よろしくお願いします。

446:デフォルトの名無しさん
07/05/28 01:02:31
パソコン初心者でもなければ別に要らないと思う

447:デフォルトの名無しさん
07/05/28 01:02:50
いらん

448:デフォルトの名無しさん
07/05/28 01:03:19
その程度は、Win32APIを色々試しているうちに自ずと判ってくるから要らない。

449:445
07/05/28 01:09:36
>>446-448
御回答ありがとうございました。
ではこのままWin32APIの学習に入ろうと思います。

450:デフォルトの名無しさん
07/05/28 02:30:45
Windowsプログラムを作るためならば、APIから学ぶのは止めたほうがいい。
実際開発では窓とかはフレームワーク任せだからな。それで問題ない。
ど~しても、変態的な非効率な開発を求めるならAPIから始めることを止めはしない。

451:デフォルトの名無しさん
07/05/28 02:59:11
>>449
>>450の意見と思いっきり逆のタイトルですまんが

APIで学ぶWindows徹底理解
URLリンク(www.amazon.co.jp)

この本はまじでおすすめ。
雑誌連載のムック化だから、それぞれのトピックは完全に独立してて
一つ一つ段階的に学習していく、って使い方はできない(想定されてない)けど、
それぞれに読み応えがあるし、なにより文章がとても上手くて面白い。
内容はタイトルどおりで(「徹底」はちと言いすぎか)、
APIの使用例を通してWindowsの仕組みや叩き方が結構クリアに見えてくると思う

ただし、Cの基礎が分かっていることが条件。
あとソースはBCC用だがVCのことも全体に渡ってちゃんと配慮して書かれてる

まぁ服毒本として興味があればどうぞ


452:デフォルトの名無しさん
07/05/28 05:26:58
XPのタスクマネージャのプロセスタブと同じ様な働きをするプログラムを作ってます。
本物のタスクマネージャのプロセス一覧でユーザー名を有効にすると、
LOCAL_SERVICEやNETWORK_SERVICEといったユーザー名の
プロセスが表示されますが、これらのプロセスをOpenProcessTokenで
開こうとするとGetLastError() == 5のアクセス違反でを取得できません。
ログインユーザーやSYSTEMのプロセスなら成功するのですが、
こういった****_SERVICEのプロセスからユーザー名を取得する
方法がありましたら教えてください。
Web検索しても成功してる人の記事が見つかりませんでした。

ぶっちゃけ下の人と同じ事をしたいのですが、
リンク先の回答者が教えているcodeprojectの方法では
取得する事はできない様です。
URLリンク(rararahp.cool.ne.jp)


453:デフォルトの名無しさん
07/05/28 06:03:28
すいません、アクセス違反じゃなくて、
GetLastError() 5 「アクセスが拒否されました。」
ってエラーです。

454:デフォルトの名無しさん
07/05/28 06:31:58
開き方が悪い

455:デフォルトの名無しさん
07/05/28 08:08:45
最低限必要なところのAPIくらい理解しとかんと問題が起きたときにどうにもならん

456:デフォルトの名無しさん
07/05/28 08:14:01
>>442
そうか?
小さいBMPを2つ作って、
組み合わせをプレビューをすればいいんじゃない?

Photoshopとかあれば、もっと容易だけど

457:デフォルトの名無しさん
07/05/28 08:44:38
>>453
偽装しておけ

458:デフォルトの名無しさん
07/05/28 10:08:22
ツールバーのアイコンに指定する背景色のカラーコードって何を指定すると透過になるんですか?

459:デフォルトの名無しさん
07/05/28 10:10:09
イメージリストを作るときのフラグによって異なる

460:445
07/05/28 10:59:14
いろんな回答がでて、よく分からなくなってきました。
最終的にDirectX使いたいという場合はどうなのでしょう?


461:デフォルトの名無しさん
07/05/28 11:04:22
DirectXとWin32API はあんまり関係ない。
API直接やDirectX直接を身に付けたいなら 参考書を買ってDelphiでやるという手がある。
API/DirectXの参考書はC/C++で書かれているから、これをC/C++のままコピペしたら
動くのは当然だけど勉強には、あんまりならん。
Delphiに直しながらやれば結構勉強になる。


462:デフォルトの名無しさん
07/05/28 11:17:27
>>460
DirectX 入門

>>461
Delphiはマジ死亡しているんで知らないなら覚えるだけ無駄。
移植の問題ありまくりなのに素人に、わざわざ複雑な方法を提案してどうする馬鹿か?

463:デフォルトの名無しさん
07/05/28 11:18:25
>>461
Delphiの布教乙

464:デフォルトの名無しさん
07/05/28 11:22:02
>>462
  WIN32APIを今さらやるのも、Delphiやるのも同じだろう。
トータルで速い方法を説明してるだけ。
DelphiのVCLはWin32APIの非常に素直なラッパで、VCLを理解すればAPIの作法も理解出来るからね。
MFCでやるよりはずっといい。

465:デフォルトの名無しさん
07/05/28 11:22:39
DirectX はコピペだけでもやること多いのに、さらに言語移植て…

466:デフォルトの名無しさん
07/05/28 11:23:33
>>464
ラッパライブラリから API を学ぶのは違うようなキガス

467:デフォルトの名無しさん
07/05/28 11:25:31
DirectXをやるのにDelphiを勧めるぐらいならC++Builderにしろよ

468:デフォルトの名無しさん
07/05/28 11:26:14
APIって学ぶものなの?
こんなんあったよな~ってMSDN漁って
挙動とか注意点とか調べて使うだけじゃない?

469:デフォルトの名無しさん
07/05/28 11:28:00
>>468
最初の作法とイベント駆動まわり、MSDNの見方だけは 慣れとく必要がないかな?

470:デフォルトの名無しさん
07/05/28 11:37:09
>>464
>WIN32APIを今さらやるのも、Delphiやるのも同じだろう。
同じじゃねーよ!

471:デフォルトの名無しさん
07/05/28 11:41:58
>>465
DirectXは COMで IDispatch も持ってるから、 Delphiからだと実はVBのようにもアクセス出来る
インターフェースを定義せずに、OLEVariantでアクセス出来るわけ。
ただし遅いけど挙動を見るお試しならまあ十分


472:デフォルトの名無しさん
07/05/28 11:44:46
>>460
Win32APIでWindowsプログラミングは激しく不向き。
窓一枚で100行とか書かされるからな(コピペですむにしても)。

ただDirectXアプリは窓一枚出せば枠組みはそれでおしまいだから十分いける。

言語に関してはWindowsでCが最適な分野というものはほぼ存在しない。
Cの学習が主眼でないならC++なんかの他の言語の方が後々効率がよい。
C++はCの知識の延長で使うだけでもだいぶ便利。

>「コンピュータの構成と設計」「アーキテクチャ徹底解説MicrosoftWindows2000・・・」
この辺は日本語学習における日本文化の知識みたいなもんでさしあたり不要。
最低限の説明はDirectXの本に載っている程度のもので十分。

473:デフォルトの名無しさん
07/05/28 12:34:07
>>471
サンプルやヘルプがC++を前提に書かれていて、
いちいち言語の違いを意識して書き直さなければならないので、
挙動を見るだけでも完全に不向き。

474:デフォルトの名無しさん
07/05/28 12:37:12
>>461は自分がやった方法が一番良いと思っている可哀想な子

475:デフォルトの名無しさん
07/05/28 13:02:54
>>473
質問者はC++じゃなくてCらしいから
->lpVtbl->ブフォァアな目にあうけどな

476:デフォルトの名無しさん
07/05/28 13:10:43
全く別の言語を扱うより遙かにマシ。

477:デフォルトの名無しさん
07/05/28 13:10:57
ぶふぉぁあ?

478:デフォルトの名無しさん
07/05/28 13:18:39
>>477
次のバージョンで追加されるメソッドです
たぶん

479:デフォルトの名無しさん
07/05/28 13:20:29
そうなのか、ダイレクトエッキスには日本語のメソッドがあるんだなたぶん

480:デフォルトの名無しさん
07/05/28 13:53:17
COMの話だろ

481:デフォルトの名無しさん
07/05/28 14:31:16
昔は、Delphiから CreateOleObject('CLSID_DirectInput') とか出来たけど DirectX8から出来なくなった


482:445
07/05/28 15:23:03
ではアーキテクチャについては放置し、C++の方が楽みたいなのでそちらも覚えながら、
C++でDirectX使えることを目標にします

483:デフォルトの名無しさん
07/05/28 15:27:18
DirectXならDirectXだけの世界だから大丈夫 Win32もとなると大変だけどね。

なお、言語の複雑さは C++ >>> Delphi/C#/VB > C だから覚悟はしておいてね

484:デフォルトの名無しさん
07/05/28 15:46:39
C#って結構難しいよ

485:デフォルトの名無しさん
07/05/28 16:15:54
>>483
>言語の複雑さは C++ >>> Delphi/C#/VB > C
C++の全てを理解しようとすればそうかもしれんが、DirectX/MFC等を使うのに必要最低限の知識でいいなら、
Cを(本当に)知ってる人なら3日もあればOKでしょう。


486:デフォルトの名無しさん
07/05/28 16:21:02
言語論争ウゼェ

487:デフォルトの名無しさん
07/05/28 16:33:10
>>445君へ

まずは、君が言うとこのDirectXの大海に向かって漕ぎ出せばいいんじゃね?
悩んだら、CやSDKの掟みたいなものをクレクレで聞くんじゃなく、
自分なりの解答を得たうえでをここの荒くれどもに問い合わせればいいんじゃない?
(そこそこ罵声はあるけどビビらないで)

んで、気が付きゃ、君も荒くれどもの一員

488:デフォルトの名無しさん
07/05/28 16:37:47
>>486 素のAPIに触ろうなんて貴重な人材を自分の陣営に入れたくて必死なんだろ。 許してやれよ

489:デフォルトの名無しさん
07/05/28 19:16:09
ウィンドウの中にタブコントロールを作成し、それにアイテムを
1つだけ挿入するプログラムを書いたのですがうまくいきません。

以下のコードはメインウィンドウのウィンドウプロシージャが
WM_CREATEを受け取ったときに実行されるOnCreate関数です。

これを実行すると、ウィンドウの中に 250×150のサイズの立体的な
ダイアログ色の長方形が表示されますが、その長方形にタブは付いていません。
また、タブコントロールに挿入されているアイテムの数を表示するメッセージ
ボックスは "n=0"と表示します。なぜでしょうか?

1. throwは実行されない ⇒ タブコントロールの作成は成功している。
2. "挿入失敗"のダイアログは表示されない ⇒ アイテムの挿入にも成功しているはず。

490:デフォルトの名無しさん
07/05/28 19:17:26
void OnCreate(HWND hParent)
{
InitCommonControls();
HWND hTab = CreateWindow(WC_TABCONTROL,
"",
WS_CHILD | WS_VISIBLE,
0, 0, 250, 150,
hParent, (HMENU)123,
(HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE), 0);
if (!hTab) throw;
TCITEM item;
item.mask = TCIF_TEXT;
item.pszText = "hello";
if (TabCtrl_SetItem(hTab, 0, &item) == -1)
MessageBox(0, "挿入失敗", "", MB_OK);

// 挿入されたかどうかチェック
int n = TabCtrl_GetItemCount(hTab);
char buf[1024];
wsprintf(buf, "n=%d", n);
MessageBox(0, buf, "", MB_OK);
}

491:デフォルトの名無しさん
07/05/28 19:23:24
エディットコントロールにWS_VSCROLLでついてくるスクロールバーについてですが、
このスクロールバーが一番下までスクロールされているかされていないかを判断するには
SetScrollInfo()とGetScrollInfo()を使わなければいけないのでしょうか?
なんかSetScrollInfo()で設定しても、元からあるスクロールバーのままで何も変わらず
いまいち使い方がよくわからなくて困ってます。これらを使わずに
一番下までスクロールされているかそうでないかを判断する方法はないでしょうか?

492:デフォルトの名無しさん
07/05/28 19:26:43
あります

493:デフォルトの名無しさん
07/05/28 19:43:45
で?

494:デフォルトの名無しさん
07/05/28 19:48:07
bool 型は便利だな

495:デフォルトの名無しさん
07/05/28 20:33:48
>>492
>>491の後半部分しか答えてないよ。

496:デフォルトの名無しさん
07/05/28 20:42:39
全部の質問に答えたとは誰も言っていない。

497:491
07/05/28 21:29:42
どのように判断すればいいのでしょうか?

498:デフォルトの名無しさん
07/05/28 21:38:57
::GetScrollPos

499:デフォルトの名無しさん
07/05/28 21:46:11
>>489-490
> (中略)
> 2. "挿入失敗"のダイアログは表示されない ⇒ アイテムの挿入にも成功しているはず。
> (中略)
> if (TabCtrl_SetItem(hTab, 0, &item) == -1)
> MessageBox(0, "挿入失敗", "", MB_OK);

挿入のときはTabCtrl_InertItem(or TCM_INSERTITEM)。

あと、そこのSetItemは失敗してる。
にもかかわず"挿入失敗"のダイアログが出ないのは「== -1」にしているから。
ヘルプでSetItemの戻り値確認してみ。(InsertItemとの違いもな)


500:デフォルトの名無しさん
07/05/28 23:12:36
教えてください。
SetClipboardViewerで画像かどうかを識別するには何を使えばいいのでしょうか?

501:デフォルトの名無しさん
07/05/28 23:29:50
>>500
WM_DRAWCLIPBOARDでEnumClipboardFormats

502:500
07/05/28 23:35:32
>>501
ありがとうございます。やってみます。

503:デフォルトの名無しさん
07/05/29 00:02:42
自作アプリの起動時処理として、とある起動済みの(自作でない)アプリケーションのウィンドウハンドルを取得したいのですが
ウィンドウキャプションがしょっちゅう変わる上に
ウィンドウクラス名もATL:00xxxxxxといった名前でこれまたWindowsを再起動するたびに変わります

なので FindWindow では手が出ません。
どうやって取得したらいいでしょう?


現在は、起動時に「対象アプリケーションをクリックしてください」と表示して
SetCapture と WindowFromPoint の組み合わせでなんとか取得してますが自動化したいのです。

504:デフォルトの名無しさん
07/05/29 00:10:16
そのアプリの特徴を研究する。

505:デフォルトの名無しさん
07/05/29 00:23:09
子ウィンドウを列挙してそのパターンから判別ればよかろ。

506:デフォルトの名無しさん
07/05/29 00:31:55
プロセス列挙してモジュール名で判別なんてのも

507:503
07/05/29 00:59:45
>>504-506
506さんの方法でやってみます。
ありがとうございました。

508:デフォルトの名無しさん
07/05/29 02:03:14
>>503
FindWindowを使えばいいよ

509:デフォルトの名無しさん
07/05/29 05:31:25
>>503
アプリケーションの名前が判ってるなら、
GetWindowThreadProcessIdで指定の窓のpidを取得、
pidからOpenProcessでプロセスハンドル、
プロセスハンドルからEnumProcessModulesでモジュールハンドル、
GetModuleBaseNameでアプリケーション名を取得できる。
GetModuleFileNameExでフルパス名も取得できる。
以上を見つかるまでEnumWindowsで繰り返す。

EnumProcessesから辿る場合はどうすんのかな。


510:452
07/05/29 05:52:02
お願いします。
>>452

511:デフォルトの名無しさん
07/05/29 06:01:19
>>510
セキュリティソフトに蹴られたりしてね?
最近のセキュリティソフトはマルウェア対策でその手のアクセスを蹴る場合がある

512:デフォルトの名無しさん
07/05/29 06:12:48
あ、分かった
>>510
WTSEnumerateProcessesでプロセスのSIDが直接手に入る
OpenProcessTokenは必要ない

513:452
07/05/29 06:37:47
ありがとうございます。
SID取得できたんで解決しそうです。

514:489
07/05/29 06:39:32
>>499
ありがとうございます。
TabCtrl_InsertItemに変えるとうまくいきました。

515:452
07/05/29 07:06:24
NETWORK SERVICE、LOCAL SERVICE共に
無事LookupAccountSidで取得できました。

516:デフォルトの名無しさん
07/05/29 07:11:47
報告乙

517:デフォルトの名無しさん
07/05/29 07:20:17
なんか夜明けと共に明るい声が響いてくる

518:デフォルトの名無しさん
07/05/29 07:42:12
EnumWindows/EnumChildWindowsで見て特徴的な何かを探すかないんじゃないの

519:デフォルトの名無しさん
07/05/29 08:20:52
>>509
それをソースコードにするとどのようになりますか?

520:デフォルトの名無しさん
07/05/29 08:42:03
コンパイルすればプログラムになるだろ。

521:デフォルトの名無しさん
07/05/29 11:31:32
とにかく、ウィンドウタイトルもウィンドウクラスも変わるものに対して、
何を持って特定するのだろうか。EXEファイル名だって変えられるしな。

522:デフォルトの名無しさん
07/05/29 12:19:32
ファイル名が分かればファイルのチェックサムを算出できる。

523:デフォルトの名無しさん
07/05/29 12:31:16
>>503
なんか、ネトゲのチートツールかなにかを作ろうとしてるように見えるwww

524:デフォルトの名無しさん
07/05/29 12:56:08
ATL製ネトゲなんてあるのか・・・?

525:デフォルトの名無しさん
07/05/29 14:26:51
ふとした疑問なんだけど
Win32ファイバって一体どういう用途で使うと真価を発揮できるんだろ?

526:デフォルトの名無しさん
07/05/29 15:06:03
アセンブラが使えない言語でコルーチンを実装したい場合だろうな >>525
C++/Delphi はインラインアセンブラが使えるから自前でコールチンの実装が出来るから不要。
C#.NET VB.NET あたりの為に用意されたものだろう。

コルーチンは、get/put同士を接続するパイプとか
クライアント型で書かれたものをサーバ型に変換するといった場合に使う

527:デフォルトの名無しさん
07/05/29 15:07:04
フィボナッチ数列を求める

528:デフォルトの名無しさん
07/05/29 15:32:41
アニョハセヨー(SJIS)を
%E3%82%A2%E3%83%8B%E3%83%A7%E3%83%8F%E3%82%BB%E3%83%A8%E3%83%BC
に変換するのってなんか手っ取り早いAPIあったら教えてください。
最終的には↓にしたいです。
URLリンク(www.google.co.jp)


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