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


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

Win32API 質問箱 Build9
251 名前:デフォルトの名無しさん :03/02/20 16:45
AllocConsoleなんかしなくても
/subsystem:consoleのアプリから余裕でウィンドウを開けますが

252 名前:239 :03/02/20 16:52
取り合えず、AllocConsoleでやってみたのですが、scanfを使っても勝手にDOS窓が閉じてしまいます。
解決法はないでしょうか?

253 名前:デフォルトの名無しさん :03/02/20 17:05
>>252
 コンソールアプリじゃないと、scanfとかは CRTが違うから初期化されてないわけで
 後から使う為には自前で初期化しないと・・・・ それは環境依存だね。

DelphiのWriteとかは直接出力可能なんだけどね。


254 名前:デフォルトの名無しさん :03/02/20 17:36
NT系ならstdoutやstdinを関連づけるだけで出来る

255 名前:239 :03/02/20 18:06
自分でも調べてみたんですけど、WIN98とかなんで多分無理そうです。
ほかの方法考えます。
ありがとうございました。また聞きに来るかもしんないです

256 名前:デフォルトの名無しさん :03/02/20 20:38
>239
って当初の目的はメモリ内容の16進表示なわけだから、
コンソールにせずwsprintfとTextOutで表示すればいいと思われ。

257 名前:デフォルトの名無しさん :03/02/20 21:06
freopen("CONOUT$", "wt", stdout);

258 名前:デフォルトの名無しさん :03/02/20 22:09
WC_LISTVIEW や REBARCLASSNAME を
CreateWindowEx するとエラーになってしまいます
同じコードで "BUTTON" "EDIT" "LISTBOX" などは作ることができます。
インクルードやリンクのミスは無い筈です。
なにか思い当たる事が御座いましたら、教えてください。

InitCommonControlsEx には
   sizeof( INITCOMMONCONTROLSEX )
   0x3FFF
を入れてます。

#include <commctrl.h>
#pragma comment( lib, "comctl32.lib" )


259 名前:デフォルトの名無しさん :03/02/20 22:43
119さんの質問に便乗なのですが、コールバック関数をサブクラス化する場合、
ユーザーデータを渡せないコールバック関数(AbortProcやDrawStateProc)は
どのようにしてサブクラス化したら良いのでしょうか?

幸いAbortProc、DrawStateProc共にHDCが渡されるので
リスト構造で親クラスを作成し、以下のようにポインタをたどってHDCを探していけば解決できそうなのですが


BOOL CALLBACK AbortProc(HDC hdc, int iError)
{
   for(CBase *p = m_lpTop;p->m_lpNext;p = p->m_lpNext)
       if(p->m_hDC == hDC) p->OnAbortProc(iError); // サブクラス側の関数の呼び出し
}

ウィンドウプロシージャのように大量に生成されると予測できるものはこれでもよさそうですが、
滅多に使わないプリンタ関係のクラスにここまで大げさなモノはあまり作りたくありません。


どなたか、もっと簡単に実現できる方法をご存知でしたらぜひとも教えてください!
お願いします。


260 名前:デフォルトの名無しさん :03/02/20 22:55
>>256
これ知ってるとだいぶ違うから覚えておくといいよね

261 名前:名無し@沢村 :03/02/20 22:59
>>239
OutputDebugString()

262 名前:tantei :03/02/20 23:00
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 24時間受付  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  hentaimtt@k9.dion.ne.jp
   グローバル探偵事務局 



263 名前:デフォルトの名無しさん :03/02/21 01:05
char aaa[] = "a,b,c,d,e";
char *ooo;

ooo = &aaa;

ってした時に、a[1]の値だけを*oooかoooを使って取り出すにはどうしたらよろしいのでしょうか?
よろしくお願いします。

264 名前:デフォルトの名無しさん :03/02/21 01:10
へー、これがWin32APIの質問ねー、ふーん

265 名前:デフォルトの名無しさん :03/02/21 01:14
ちんこが大きくなるにはどうしたらいいか教えてください!

266 名前:デフォルトの名無しさん :03/02/21 01:20
>>265
皮はむけ。

267 名前:デフォルトの名無しさん :03/02/21 01:24
SetFilePointerExがXPで使えない理由を知ってる人手を挙げて

268 名前:デフォルトの名無しさん :03/02/21 01:26
>>263
win32APIとどう関係があるのか?

269 名前:デフォルトの名無しさん :03/02/21 01:26
>>263 いちお、a[1]の ',' は
ooo = aaa;
ooo[1] 
で取り出せる。 と、釣られてみた。

270 名前:デフォルトの名無しさん :03/02/21 01:27
>>263
','でも取り出せるよ

271 名前:267 :03/02/21 01:32
さっきの取り消し。

272 名前:デフォルトの名無しさん :03/02/21 02:42
>263 釣られてみるが
aaa[1]は取り出せるけどa[1] は知らん

273 名前:デフォルトの名無しさん :03/02/21 06:43
リストビューの現在選択されているインデックス番号の取得の仕方が分かりません
 ListView_GetItemPositionとかで出来ますか?

274 名前:デフォルトの名無しさん :03/02/21 06:49
>>273
ListView_GetNextItem

275 名前:デフォルトの名無しさん :03/02/21 06:53
>>273 LVM_GETNEXTITEM

276 名前:デフォルトの名無しさん :03/02/21 07:11
>>274
>>275
LVNI_ALL | LVNI_SELECTED と共に使用して出来きました。
感謝。

277 名前:デフォルトの名無しさん :03/02/21 07:52
>>263
誤>char *ooo;
正>char(*ooo)[10];
それから、このスレで聞くならTCHARくらい使え

278 名前:デフォルトの名無しさん :03/02/21 08:32
>>277
(゚Д゚)ハァ???

279 名前:デフォルトの名無しさん :03/02/21 10:44
>>278
本気で言ってるのか?
詳細を書いてないところがマジっぽい
釣り師ならいい腕だ

280 名前:デフォルトの名無しさん :03/02/21 10:46
>>277
すみません、_TCHARはダメですか?

281 名前:デフォルトの名無しさん :03/02/21 11:03
>>280
_TCHARはVC++固有(たいていのWin32処理系には互換のため
存在するけど)だからスレ違い

282 名前:デフォルトの名無しさん :03/02/21 13:22
>>278はTCHARではなく(*ooo)[10]にハァ?なのかと…

283 名前:デフォルトの名無しさん :03/02/21 13:57
配列へのポインタが分かっとらんということ?
やはり釣りじゃ…

284 名前:デフォルトの名無しさん :03/02/21 14:21
(*ooo)[10]の 10 はどこから出てきたのか教えて( ゚д゚)ホスィ・・・・

285 名前:デフォルトの名無しさん :03/02/21 14:22
そっか。"a,b,c,d,e" + '\0' で 10文字って事か。なーんだ。

286 名前:デフォルトの名無しさん :03/02/21 15:19
waveIn系のAPIなのですが、ステレオ入力の場合バッファに入力される値はWAVEファイルと同じで左右左右左・・・となるのでしょうか?

287 名前:デフォルトの名無しさん :03/02/21 15:25
Waveファイルと同じです


288 名前:デフォルトの名無しさん :03/02/21 15:48
特定のクライアント領域の大きさのウインドウを作るにはどうしたらよいのでしょうか。
CreateWindowで指定するのはクライアント領域ではなくウインドウの大きさですし、
GetClientRectはあってもSetClientRectはないです・・・

289 名前:デフォルトの名無しさん :03/02/21 16:05
一応AdjustWindowRect(Ex)つーのがある。あんまり役に立たんが。

290 名前:デフォルトの名無しさん :03/02/21 16:14
>>289

複数行のメニューとか作らなければ、それで十分だったんじゃ。


291 名前:デフォルトの名無しさん :03/02/21 16:24
>>290
複数行メニューを作ろうとしなくても、メニューのフォントサイズをユーザーが大きい物に
してるとメニューが複数行になっちゃったりする。
そして複数行になるかどうかは判断できない。

だから役に立たない。

292 名前:デフォルトの名無しさん :03/02/21 16:54
関連付けられたファイルを開くAPIですが、
WindowsMeで動くAPIを教えてください。
APIやらVB組み込み関数やら4つ試しましたがいずれも
2000では動きましたがMeでは動きませんでした。

293 名前:デフォルトの名無しさん :03/02/21 17:28
>>292
どのAPIでどんなコードがダメだったの?

ShellExecuteでいけてるみたいだけど

294 名前:デフォルトの名無しさん :03/02/21 17:44
>293

' ShellExecute 0, "open", "http://xxx.xxx..net/picture.asp?FileN=" & Index & ".jpg", vbNullString, App.Path, 1
ごめんなさい。ファイルの起動ではなくてブラウザの起動です。
ちなみに手元の本「VisualBasicTips1000+では、この関数Meは対応してないとかいてある。
あとWebでShellExecuteEXなるものを見つけて、いまためしてるところです。

ファイルは開くのですか・・・。

295 名前:デフォルトの名無しさん :03/02/21 17:47
openはつけない方がよい

296 名前:tantei :03/02/21 17:48
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 直通  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  hentaimtt@k9.dion.ne.jp
   グローバル探偵事務局 



297 名前:292 :03/02/21 17:56
EXで動きました。











しかし原因が判明
Meで動作テストさせてるやつが、どうもこちらが最新のプログラムを渡してるのに、
そのプログラムを使わないで勘違いで古いやつをつかって動かないといっているだけだった。
スマソ

298 名前:デフォルトの名無しさん :03/02/21 19:29
>>297
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←Meで動作テストしてる香具師

299 名前:デフォルトの名無しさん :03/02/21 19:40
C++のwindows.hの宣言て

#inlcude <windows>
using namespace std;

ていう風にはできないの?

300 名前:デフォルトの名無しさん :03/02/21 19:42
>>299
無理です。windows.hはstd名前空間に包まれていません。

301 名前:bloom :03/02/21 19:49
http://www.agemasukudasai.com/bloom/

302 名前:仕様書無しさん :03/02/22 09:53
>>299
以下の内容のテキストファイル "windows" を、インクルードフォルダに作成しろ。

#ifndef _INC_STD_WINDOWS
#define _INC_STD_WINDOWS
namespace std {
#include <windows.h>
}
#endif

303 名前:デフォルトの名無しさん :03/02/22 10:27
なんでわざわざ std にするんだ? ms とかにしたほうがいいとおもうが。

304 名前:デフォルトの名無しさん :03/02/22 14:05
で、それでなんかいいことあるの?

305 名前:デフォルトの名無しさん :03/02/22 15:17
using namespace std; をつけないと、Win32のAPI関数の全てに
std::を付けなければならなくなる、それだけ。

306 名前:デフォルトの名無しさん :03/02/22 15:23
>>305
いやお前、ネームスペースのこと理解してるか?


307 名前:デフォルトの名無しさん :03/02/22 16:02
>>306
ん?言いたい事がよくわからんが。ただ、Win32 API関数名を
わざわざstd名前空間内に放り込んで何のメリットがあるのかと。

308 名前:デフォルトの名無しさん :03/02/22 16:43
>>307
そんな事は 299 に訊いてくれ。

309 名前:デフォルトの名無しさん :03/02/23 01:27
関数をDLL化して、その関数の中でコールバックは使えますか?

310 名前:デフォルトの名無しさん :03/02/23 01:57
どのコールバックか知らんけど
そのDLLがアンロードされないように気をつければいいんでないの

311 名前:デフォルトの名無しさん :03/02/23 03:35
ウィンドウアプリからコマンドプロンプトに値を送って表示させるにはどうすればいいでしょうか?
変数の確認用に使おうかと思いまして。


312 名前:デフォルトの名無しさん :03/02/23 06:18
ダイアログのハンドルからフォント情報を得るにはどうればよいのでしょう。
> STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
> CAPTION "ダイアログ"
> FONT 9, "MS Pゴシック"
たとえば↑のような場合に "MS Pゴシック", 9 といった情報を知りたいのです。

313 名前:デフォルトの名無しさん :03/02/23 06:24
WM_GETFONT

314 名前:デフォルトの名無しさん :03/02/23 12:10
Win32で文字列扱う時はどの型を使うのが一般的なんですか?
文字列型使いたかったらやはりMFCのCStringしかない?

315 名前:デフォルトの名無しさん :03/02/23 12:12
>>311
AllocConsole()、FreeConsole()

316 名前:デフォルトの名無しさん :03/02/23 12:15
   ______________
 /:\.____\
 |: ̄\(∩´∀`) \  <先生!こんなのがありました!
 |:在  |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/tochigi/

317 名前:デフォルトの名無しさん :03/02/23 12:33
>>314
LPTSTR
というのは冗談で、アプリ側で好き好きに文字列型を決めていいと思う。
APIを呼び出す部分でwrapすればいいわけで。

318 名前:デフォルトの名無しさん :03/02/23 12:36
VC6SDK でWM_TIMERが急に動作しなくなったのですが
どうしてですか?

319 名前:デフォルトの名無しさん :03/02/23 12:41
>>318
settimer()を消した。

320 名前:デフォルトの名無しさん :03/02/23 12:43
漏れが良くやるのは WM_TIMER から OnTimer() のような関数を
呼び出してるつもりで、実は呼び出し忘れてたとか。

321 名前:デフォルトの名無しさん :03/02/23 13:02
Windows2000だかXPだかでそんな感じのWindowsUpdateがあったわけだが。

322 名前:デフォルトの名無しさん :03/02/23 13:06
void Testhoge(void){
char s[5];
int iRet;
//ローカルタイムを取得

GetLocalTime(&sm);
if(sm.wMonth=2) {
strcpy(s,"2月です。");
}else{
strcpy(s,"2月以外");
}
iRet = MessageBox(NULL,s,"アドバイス",MB_OK);

}

こういう関数をメッセージから呼び出すと必ずメッセージボックスのあと
エラーになるのですがなぜですか?

323 名前:デフォルトの名無しさん :03/02/23 13:18
char s[5];

で、

strcpy(s,"2月です。");


どういう神経してんだと。

324 名前:デフォルトの名無しさん :03/02/23 13:19
>>322
メッセージボックスを表示しないようにしてもエラーになると思う。

325 名前:デフォルトの名無しさん :03/02/23 14:10
(・∀・)チンポ!!

326 名前:デフォルトの名無しさん :03/02/23 14:45
全角文字は2バイトです。と書いておくか

327 名前:デフォルトの名無しさん :03/02/23 15:25
次は
char s[10];
でエラー出すと予想

328 名前:デフォルトの名無しさん :03/02/23 15:47
VisualBasicでいうForm1.Visible Hide
にあたるAPIはありますか?

329 名前:デフォルトの名無しさん :03/02/23 15:47
>>327 なぜ?

330 名前:デフォルトの名無しさん :03/02/23 15:49
>>329
char s[11]; としないといけないから。

331 名前:デフォルトの名無しさん :03/02/23 15:53
で、次に2月の2は半角ですよ、とくるわけか。

332 名前:デフォルトの名無しさん :03/02/23 15:54
>>331
2が半角なら問題ないわけだが。

333 名前:デフォルトの名無しさん :03/02/23 15:57
問題ないから>>327じゃエラー出ないだろと。

つーかこういうのつまんねーし、そもそもWin32APIじゃないからやめようや。

はい次↓

334 名前:デフォルトの名無しさん :03/02/23 16:04
↓ ↑
 →

335 名前:デフォルトの名無しさん :03/02/23 16:05
ガオガイガー 15話,,40,0,,1


336 名前:デフォルトの名無しさん :03/02/23 16:12
VisualBasicでいうForm1.Visible Hide
にあたるAPIはありますか?


337 名前:デフォルトの名無しさん :03/02/23 16:15
>>336
ShowWindow

338 名前:デフォルトの名無しさん :03/02/23 16:24
>>337
どうもです。
ついでに表示しない状態で起動するにはどうしたらよいのでしょう?
WM_CREATEに書いたらだめでした。

339 名前:デフォルトの名無しさん :03/02/23 16:41
WM_CREATE は CreateWindow の処理中に送信されるからな。
ここで消しても CreateWindow() の後で ShowWindow()を
呼び出してたらまた表示される。

340 名前:名無し@沢村 :03/02/23 17:55
>>338
ヌヒよ、CreateWindow()に渡すウィンドウスタイルからWS_VISIBLEを外せ。

341 名前:デフォルトの名無しさん :03/02/23 18:08
底なし沼にいる気分だ・・・
プログラミング始めたばかりの頃の気分と
似てるな、右も左もわからず、おれには
無理と諦めていたあの頃・・・

342 名前:341 :03/02/23 18:14
すみません。マ板と間違えますた。

343 名前:デフォルトの名無しさん :03/02/23 18:30
>>341
結局その泥沼から自分で這い出せた奴のみがプログラマになれるわけで。


344 名前:312 :03/02/23 22:09
> 313
> WM_GETFONT
すみません、質問の仕方が悪かったです。
ウィンドウ(今回はダイアログ)に指定されているフォントに対応する LOGFONT を得るにはどうしたらよいでしょうか。
以下のメンバさえ分かれば他はかまいません。
どうかよろしくお願いします。

typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWeight;
BYTE lfItalic;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;

345 名前:デフォルトの名無しさん :03/02/23 22:23
>344
GetObject

346 名前:デフォルトの名無しさん :03/02/24 00:23
>>318
もしかして、これと関係ある?
http://pc2.2ch.net/test/read.cgi/tech/1018239290/727

347 名前:デフォルトの名無しさん :03/02/24 00:30
>>318
http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/security/bulletin/ms02-071.asp
ここの 2003/02/08 追記のことかい?

348 名前:デフォルトの名無しさん :03/02/24 01:02
シェルエクステンション詳しい人いらっしゃいますか?
海外のサンプルを試行錯誤しながらいじくり回して
やっと少しずつ理解(?)できてきました。
でも、C、VC系って仕事でもほとんどやったことないから
難しい〜〜〜〜。
まだ、わからないところもあやふやなのでまとまったら
質問しまつ。そのときはよろしくです。

349 名前:デフォルトの名無しさん :03/02/24 01:53
>>348
もっと沢村風に書け

350 名前:ヌッヒー沢村 ◆4DRE6TAt5Q :03/02/24 01:54
呼んだ?

351 名前:309 :03/02/24 18:19
>>310
レス遅くなってすみません。
DLLがアンロードされないようにって言うのは具体的にどのようにすればよろしいのでしょうか?
と言うか、どう言うことかよく分かりません。呼び出したDLLから抜け出さなければよいって事でしょうか?

352 名前:デフォルトの名無しさん :03/02/24 18:32
具体的にって・・・
まずどのコールバックか書くのが先じゃないか?

353 名前:309 :03/02/24 20:33
>>352
すいません。WndProcってやつです

354 名前:デフォルトの名無しさん :03/02/24 22:14
WINDOWINFO 構造体や、GetWindowInfo 関数を使うと
『定義されていない識別子です』となり、コンパイルが通りません。
windows.h をインクルードするだけでは使えないのでしょうか?

355 名前:デフォルトの名無しさん :03/02/24 22:16
>>354
windowsx.hをインクルードしろ。

356 名前:デフォルトの名無しさん :03/02/24 22:18
>>354
そんな関数や構造体がないのでは?

357 名前:354 :03/02/24 22:28
>>355
すみません、やってみましたが無理でした…

>>356
一応MSDNには載ってたんですけど、どうなっているんでしょう。

358 名前:デフォルトの名無しさん :03/02/24 22:30
>>357
SDKが古いのだよ。

359 名前:デフォルトの名無しさん :03/02/24 22:31
>>357
> Windows NT/2000/XP: Included in Windows NT 4.0 SP3 and later.
> Windows 95/98/Me: Included in Windows 98 and later.

と書いてあるのであれだ、_WIN_VER とか何かそういう
バージョン指定の #define をしなけりゃ使えないはず。

360 名前:354 :03/02/24 22:42
>>358-359
今までそんなこと全然気にせずにやってきたので
何がなんだか分かりませんでした。
ええと、VCにサービスパックか何かを当てる必要があるのでしょうか?
それとも、#defineするだけで良いのですか?VCは6.0なのですが…

361 名前:デフォルトの名無しさん :03/02/24 23:09
>>360
#defineの値が重要だよー。
いくつにするかはヘッダファイルにgrepすればわかるでしょ…。

362 名前:デフォルトの名無しさん :03/02/24 23:24
>>360
今となってはVC++6は「新しい」とは云いかねるものであって、
事実VC++6のSDKヘッダは最新の物よりかなり古い。
もしVC++6のSDKヘッダに含まれていない新しい機能を使いたいのであれば、
MicrosoftのPlatform SDKダウンロードページから、新しいのを落とす必要が或る。
MicrosoftはVC++6のSPに新しいSDKを入れる気はないようだね。
バージョン絡みのマクロだが、大きくは
1) OSのバージョン(WIN_VER)
2) IE(shell)のバージョン(_WIN32_IE)
があるんで注意。勿論、普通はコンパイラに対して-Dオプションで
渡すだけでよい。SDKのinclude/にあるWin32.makあたりも参考にしる。


363 名前:デフォルトの名無しさん :03/02/24 23:42
waveIn系のAPIで音声をマイクから録音するとき、録音している最中に録音している音がスピーカーから出ないようにする方法は無いでしょうか?

364 名前:354 :03/02/24 23:44
いろいろとアドバイスありがとうございます。

とりあえず、ヘッダファイルの中に
#define WINVER 0x0500
というのを見つけたので、よく分からないけど
プログラムの先頭の部分で#define WINVER 0x0500としたらコンパイルは通りました。

今までこういう勉強をしてこなかったのでわけ分からないですが
いろいろ調べて理解できるようになりたいです。

365 名前:354 :03/02/24 23:58
ええと、WINDOWINFOみたいな
#define WINVER 0x0500
で使えるようになったものを使うと

> Windows NT/2000/XP: Included in Windows NT 4.0 SP3 and later.
> Windows 95/98/Me: Included in Windows 98 and later.

にあるように、NTのSP3より古いのでは実行できなくなる、って解釈でOKですか?

366 名前:デフォルトの名無しさん :03/02/25 02:34
WINAPIでウィンドウを作らずにプログラムを実行するってことは出来るのでしょうか?

367 名前:デフォルトの名無しさん :03/02/25 02:47
できる

368 名前:デフォルトの名無しさん :03/02/25 03:00
じゃあ、DLL化したときにウィンドウを作るってのはできますか?

369 名前:デフォルトの名無しさん :03/02/25 03:19
apiの定数とか全て網羅したファイルは何処のありますか?
フリーのapiビュアー付属の物にはは、SS_NOTIFYなどが
載ってないみたいでした。

370 名前:デフォルトの名無しさん :03/02/25 03:56
>>369
Include

371 名前:デフォルトの名無しさん :03/02/25 06:07
>>368
できるけどそのウィンドウはDLLじゃなくてexeが所有する

372 名前:デフォルトの名無しさん :03/02/25 07:04
リストボックスは WM_CTLCOLORLISTBOXで文字色を変えれたけど、
リストビューコントロールの場合はどのようにするか教えてください。

373 名前:デフォルトの名無しさん :03/02/25 07:37
自己レス
SendMessage( hWndLView, LVM_SETTEXTCOLOR, 0, RGB(255,255,250) );
で出来ました。

374 名前:368 :03/02/25 09:15
>>371
int __declspec(dllexport) __stdcall WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style= CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc= WndProc;
winc.cbClsExtra= winc.cbWndExtra= 0;
winc.hInstance= hInstance;
winc.hIcon= LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor= LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName= NULL;
winc.lpszClassName= TEXT("ahohhh");

if (!RegisterClass(&winc)) return -1;

いきなりこれで-1が返って来てしまうんですが、どうしてかわかりません。
EXEの時には作れてたと思うんですが・・・

375 名前:デフォルトの名無しさん :03/02/25 09:35
そのWinMainはどうやって呼び出してる?

376 名前:368 :03/02/25 09:44
ごめんなさい、呼び出す時に変な変数はいってました。
助言ありがとうございました。

377 名前:368 :03/02/25 11:39
またまた、すみません。
WinMainを呼び出す時に値を渡したいときはどうしたらよろしいのでしょうか?
もしくは、値を渡さず呼び出すにはどうしたらいいでしょうか?
(HINSTANCE hInstance などに値が入らないようにしたいのです )

378 名前:デフォルトの名無しさん :03/02/25 11:45
>>377
>値を渡さず呼び出すには
無茶いわないの。

379 名前:368 :03/02/25 11:52
ごめんなさい、ここらへんのことあまりよく分かってなくて・・・
ほかの関数からWinMainを呼び出して、HINSTANCE hInstanceの値を使う時ってどうすればいいのですか?


380 名前:デフォルトの名無しさん :03/02/25 11:58
>>379
何がやりたU co82だよ・・・

381 名前:380 :03/02/25 11:59
何か化けた・・・

「何がやりたいんだよ」と書いたんだが

382 名前:デフォルトの名無しさん :03/02/25 12:30
WinMain関数をそのままdllに移してるって事?
で、先のWinMainはプログラムエントリではない、と。

383 名前:デフォルトの名無しさん :03/02/25 13:10
>__stdcall WINAPI
これって2度同じこと書いてることにならない?

384 名前:368 :03/02/25 14:07
>>382
もう全部書いちゃいますと、VBからCとAPIで作ったDLLを呼び出して、
そのDLLでウィンドウを作る。
作ったウィンドウの中で作業し(コールバック等も使用)値をまたVBに戻す
ってことをしたいと思ってます。
ですので、呼び出す関数はWinMainじゃなくてもいいので、ウィンドウを作成して
hInstance等の値さえ取れればどう言う方法でもかまいません。

>>383
すいません、そこら辺はコピペでやってたのでよく分かりませんでした・・・


385 名前:デフォルトの名無しさん :03/02/25 14:08
スレ違いかもしれませんが他によさげなスレがないのでここで質問します。

Shell Namespaceでごみ箱やマイコンピュータのような仮想フォルダ(アイコン)を
デスクトップ上に作成しました。
この時、このアイコンに他のファイルをD&Dし
そのファイルに対して何かしらの処理を行いと思います。
Shell ExtensionのようにレジストリにDropHandlerを定義し
DLLにIPersistFileとIDropTargetをインプリメントすれば可能かと思いましたが
アイコン上にドラッグしても何も反応しませんでした。
このイベントを取得するにはどのようにすればいいのでしょうか。
Shell Extensionでは上手くいっているのですが。


386 名前:デフォルトの名無しさん :03/02/25 14:17
>>384
DllMain使ってる……よね?

387 名前:368 :03/02/25 14:37
すみません、ほんと初心者なもので・・・
DllMainってただの宣言か何かだと思ってました・・・
で、DLLが他のプログラムから呼び出されるとまず最初にDllMainが実行されて、
それから呼び出した関数が実行されるって感じでよろしいのでしょうか?
それで、hinstDLLがhInstanceに当たる物って事でよろしいでしょうか?

388 名前:デフォルトの名無しさん :03/02/25 14:46
HINSTANCEの値が欲しいだけ?
だったら、GetModuleHandle(NULL)がヨロシ

389 名前:デフォルトの名無しさん :03/02/25 15:14
DLLでウィンドウ作るときってDLLとexeのどっちの
hInstance渡すの?

390 名前:368 :03/02/25 15:27
>>389-389
DLLです。
ってことはGetModuleHandle(NULL)をDLL内で指定すればどこでもDLLのhInstanceが得られるってことですね?

391 名前:デフォルトの名無しさん :03/02/25 15:32
あれ?DLLでGetModuleHandle(NULL)すると呼び出したEXEのハンドルが返らなかったっけ?
あやふや、スマン。

392 名前:デフォルトの名無しさん :03/02/25 15:34
GetModuleHandle(NULL)の返り値は呼び出し側プロセスの作成に使われたファイルのハンドル。

DLLのHINSTANCEが欲しいならDllMainの引数保存しとけ。


393 名前:368 :03/02/25 16:33
ありがとうございます。
その方向で行かせてもらいます。

394 名前:デフォルトの名無しさん :03/02/25 17:24
ウィンドウを作らない時のコールバックはどのようにしたらよいのでしょうか?
WinMainに返すってことは出来るのでしょうか?


395 名前:デフォルトの名無しさん :03/02/25 17:44
コールバックが何を指してるのか意味不明

396 名前:デフォルトの名無しさん :03/02/25 18:15
関数が返す値を整数で2つ以上にすることは出来るでしょうか?

397 名前:デフォルトの名無しさん :03/02/25 18:18
>>396
構造体に入れてそれを返せばできる。

398 名前:デフォルトの名無しさん :03/02/25 18:19
>>397
ありがとうございます。

399 名前:デフォルトの名無しさん :03/02/25 19:20
>>396
std::pairもしくはboost::tupleを使え。

400 名前:デフォルトの名無しさん :03/02/25 19:36
余裕でキリ番ゲット

401 名前:デフォルトの名無しさん :03/02/25 20:07
もうぜんぜんAPIの質問じゃないな

402 名前:デフォルトの名無しさん :03/02/25 22:40
ものすごく初歩的な質問ですみません。
C、C++をフリーのコンパイラを使って勉強してるんですが
Win32APIはVBかVC++環境でしか使えないんでしょうか?
Win32API関連の書籍の冒頭部分を読むと大抵の本はそのふたつの環境の
ことを前提に書いてあるようなので…。
全部読めばわかったのかもしれないんですけど
2時間ほど本屋でいろいろ読んでたら店じまいになってしまったので
ネットで検索したんですが、どこみてもVC++前提なんで…
C、C++とフリーコンパイラ環境では無理なんでしょうか?
Windowsプログラムつくりたいんですけど
フリー環境では無理があるでしょうか?

403 名前:デフォルトの名無しさん :03/02/25 22:54
そのコンパイラ環境とやら次第だな。

404 名前:402 :03/02/25 22:59
LSI C-86 Ver.3.30試食版っていう
Cの入門書についてたやつをそのまま使っています。

なにやらgccやbccのほうが人気があるようですが…

405 名前:デフォルトの名無しさん :03/02/25 23:01
>>404
LSI-Cの試食版ではWindows GUIのプログラムは作れないよ。
せめて Borland-C++ 5.5.1 にしとけ。
windows.h をインクルードすれば、Win32API関数は使える。

406 名前:402 :03/02/25 23:09
>>403,405
返答ありがとうございます。
助かりました。
Cの入門書をひととおり終えて
今更ながら
「Cってwindows専用の言語でもなんでもないからwindowやwindowsの
オブジェクトを扱う関数なんてどにも載ってなくて当たり前か…」

などと絶望に打ちひしがれていた馬鹿者です。
Borland-C++ 落としてwindos.hを#includeすれば
使えるのなら、Win32API関連の本を買っても無駄な出費には
ならないようですね。
結構高い上にやたら分厚いものなので買うかどうか悩んでました。

407 名前:385 :03/02/26 00:10
何のレスも無い状態で流れてしまったのでもう一度だけ。

Shell Namespaceでごみ箱やマイコンピュータのような仮想フォルダ(アイコン)を
デスクトップ上に作成しました。
この時、このアイコンに他のファイルをD&Dし
そのファイルに対して何かしらの処理を行いと思います。
Shell ExtensionのようにレジストリにDropHandlerを定義し
DLLにIPersistFileとIDropTargetをインプリメントすれば可能かと思いましたが
アイコン上にドラッグしても何も反応しませんでした。
このイベントを取得するにはどのようにすればいいのでしょうか。
Shell Extensionでは上手くいっているのですが。

408 名前:デフォルトの名無しさん :03/02/26 00:32
>>407
適当に答えるけど、SHChangeNotifyRegisterで監視するってのはどうよ。

409 名前:デフォルトの名無しさん :03/02/26 02:02
>>406
今あなたと同じようにBorland-C++でWin32API学んでます。
もしまだインストール等何もしていないのなら、
以下のホームページが参考になります。

ttp://www.neco.nu/gohodoji/index.html
ttp://homepage1.nifty.com/tyuuki/old/cc/bcc_install.html

それとインストール後は>>1
「猫でもわかるプログラミング」という
ホームページが参考になります。

410 名前:385 :03/02/26 02:57
>>408
すみません、MSDNにも載ってなかったので調べるのに時間がかかりました。
しかしこればWindows2000以降でしか使えないようですね。
それにウィンドウにメッセージが送られるみたいですが
Shellなのでウィンドウなど持っていませんし
仮にダミーを作っておく事も出来ますがあまりにスマートでないです。
何かレジストリに登録して何かをインプリメントすればShellから呼ばれるはずです。
レジストリの何処に何を登録して、DLLに何をインプリメントするのか、それが判るといいのですが。

411 名前:デフォルトの名無しさん :03/02/26 03:05
低レベルサウンドAPIを使っているのですが、バッファ再生終了までの期間
mainの処理を待たせたいのですが、この場合どういう方法がありますか?
Sleepのような関数があれば良いのですが、ざっと見た所ない様子だったので
スレッドを使ってメインルーチンとの同期を取るべきなのでしょうか。
それともWaitSingleObject何とかオブジェクトを使って同期をとるのが
良いのでしょうか?


412 名前:デフォルトの名無しさん :03/02/26 03:50
コールバック関数使用してWOM_DONEとか

413 名前:402 :03/02/26 05:21
>>409
ありがとうございます。
本当に助かります。

ようやく何を勉強すればいいのかが
わかりました。

414 名前:デフォルトの名無しさん :03/02/26 06:35
NICのインタフェース名一覧を取得するにはどうしたらよいですか?
※「ローカル エリア接続」みたいなやつ。

415 名前:デフォルトの名無しさん :03/02/26 06:46
Win32APIと.NETの関係を教えてください。

416 名前:デフォルトの名無しさん :03/02/26 06:51
>>415
あかの他人

417 名前:デフォルトの名無しさん :03/02/26 06:52
>>415
低レベル関数ライブラリと高レベルクラスライブラリ

418 名前:デフォルトの名無しさん :03/02/26 06:52
これからWin64APIも出るの??

419 名前:デフォルトの名無しさん :03/02/26 07:13
いや、これからじゃないし。

420 名前:デフォルトの名無しさん :03/02/26 07:51
>407
Shell Commandオブジェクト
ってゆうのは?
使ったこと無いけど。

421 名前:デフォルトの名無しさん :03/02/26 09:56
あの分厚いリファレンス本買う金があるなら、
同じくらいの金額でC++Builder Personal買った方が便利な気もするが

422 名前:デフォルトの名無しさん :03/02/26 13:27
while(GetMessage(&msg , hwnd , 0 , 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DLL内で、このループとコールバックを使って制御しようと思ってるのですが
ウィンドウの×ボタンを押すと
case WM_DESTROY:
PostQuitMessage(0);
return 0;
となりループが終わり閉じるようにしています
しかし、これをやるとDLLを呼び出す側の親ウィンドウも閉じてしまいます
解決法はないでしょうか?

423 名前:デフォルトの名無しさん :03/02/26 13:37
>>421
なんの本?

424 名前:デフォルトの名無しさん :03/02/26 13:52
ウィンドウを破棄する関数ってありますか?

425 名前:デフォルトの名無しさん :03/02/26 13:53
>>422
WM_CLOSEを処理してみれば

426 名前:デフォルトの名無しさん :03/02/26 13:55
>>424
DestroyWindow()

427 名前:デフォルトの名無しさん :03/02/26 14:20
>>422
PostQuitMessageとGetMessageの仕組みを良く理解してみよう

428 名前:422 :03/02/26 14:37
>>427
どう言うことかさっぱりわかりません・・・
PostQuitMessageから受け取ったメッセージをGetMessageはさらにどこかに送ってるとかのことですか?


429 名前:デフォルトの名無しさん :03/02/26 15:41
コンパイラそのものというよりリソースエディタと
デバッガがないととてもやってらん・・・

430 名前:デフォルトの名無しさん :03/02/26 15:44
>>429
低脳(w

431 名前:385 :03/02/26 15:50
>>420
有難うございます。
調べてみましたがそれはダブルクリックをした際の動作の設定みたいです。
いわば関連付けと同じ物のようです。
D&D時の呼び出し方法なのでこれとは残念ながら違いました。

432 名前:デフォルトの名無しさん :03/02/26 16:07
>>428
アプリケーションはWM_QUITで終了するように作られてるわけだよね?
GetMessageはWM_QUITを受け取ると0を返すから、
whileを抜けるようになっているわけだ。

PostQuitMessageを削除すれば望みの動作になるんじゃないかな?

433 名前:デフォルトの名無しさん :03/02/26 16:14
>431
Command=REG_EXPAND_SZ:"rundll32 ..."
の部分を
Command=REG_EXPAND_SZ:"Hoge.exe %1 ..."
のようにすれば、もしかしたらドロップした時に%1には
パス名がついて起動されるのかな、と思ったのだけど。

434 名前:422 :03/02/26 16:47
ごめんなさい、すっごく私の書き方が悪かったです。
EXEで一度ウィンドウを開いて、DLLを呼び出してさらにそのDLL内で別のウィンドウをもう一つ開こうとしています。
だから、結局、親ウィンドウと子ウィンドウの2つが開かれるわけです。
で、DLLで開かれた子ウィンドウのほうを閉じると親ウィンドウも閉じてしまうのを直したかったのですが・・・

それと、もう一つ不具合が・・・(T_T)
DLL側の子ウィンドウですが、DLLにせずEXEにすると起動して計算しすぐに閉じるようなプログラムにしてあります。
それをそっくりそのままDLLにしたら起動して計算後ウィンドウが消えずに残ってしまっています。
DestroyWindow()を使ってもいいのですが、ウィンドウが残ってるってことは、まだDLL内のプログラムは動いてる(ループしてる?)ってことなんですよね?
しかも、調べてみたらreturnの値が返って来てる・・・
どうしたらいいか全然わかりません。
どなたか助言お願いします。


435 名前:258 :03/02/26 17:18
どなたか助けてください。
>>258


WC_LISTVIEW を
TEXT( "SysListView32" ) と TEXT( "SysListView" ) に変えてみたところ、
前者はエラー、後者は通ります

#define _WIN32
#define WINVER 0x0400
#define _WIN32_IE 0x0400
#define _WIN32_WINNT 0x0400

comctl32.lib のバージョンは 5.80 です

436 名前:デフォルトの名無しさん :03/02/26 17:19
訂正:
comctl32.dll のバージョンは 5.80 です


437 名前:385 :03/02/26 17:53
>>433
それだと例え出来たとしても普通のexeにドラッグするのと同じようになるかと。
引数制限も出るだろうしシェルの意味が無くなってしまいます。

438 名前:デフォルトの名無しさん :03/02/26 17:55
>>434
良く分かんないけど、dllとexe(子と親)それぞれメッセージループを持ってるってこと?
マルチスレッドならともかく、シングルスレッドでそれをやるのはヘン

439 名前:422 :03/02/26 18:12
>>438
うぁ、もしかして分けわかんないことしてますか?
ほんと初心者で・・・APIとか最近知ったばかりで・・・
私の最終的にやりたいことはDLLの関数を呼び出すと今マイクから入ってきている音量を返すって
ことをやりたいだけなのですが、調べてるうちにどんどんわからなくなってしまいました・・・
もしかして、コールバックとかウィンドウ作ったりしなくても出来ちゃったりします?

440 名前:デフォルトの名無しさん :03/02/26 21:43
>>439
いい加減自分で調べろ

441 名前:414 :03/02/26 23:55
放置かよ!

442 名前:デフォルトの名無しさん :03/02/27 00:26
雑談スレから流れてきました
DLLについて聞きたいのですが…
/* begin */
int x = 3;

BOOL WINAPI
DllEntryPoint(HINSTANCE hinst, DWORD whyCalled, void* rsv)
{
  return(TRUE);
}

/* 以下にxを使うような関数が並ぶ */
/* end */
こういうファイルからDLLを作ったとします。
このDLLが、なんらかの実行ファイルから
LoadLibrary()されたとします。

外部変数のxは、メモリのどこらへんに
あるのでしょうか?
メモリにロードされたDLLの中ですか?
だとしたら、複数の実行ファイルが
1つのDLLをロードしたら、xについて
競合がおきるのでしょうか?

あと、3で初期化するように書いてますが
いつ初期化されるのでしょう?

また、constで修飾していませんが、
DLL内の関数で、自由にread/writeしたら
呼んだ実行プロセスの方に影響しますか?

443 名前:デフォルトの名無しさん :03/02/27 01:30
> メモリにロードされたDLLの中ですか?
はい。
> だとしたら、複数の実行ファイルが
> 1つのDLLをロードしたら、xについて
> 競合がおきるのでしょうか?
起きません。デフォルトでプロセスごとに別々の
物理メモリが割り当てられます(共有させることも可能)
> あと、3で初期化するように書いてますが
> いつ初期化されるのでしょう?
DLLがプロセスのアドレス空間にマップされた瞬間です。
DLLのイメージに初期値がすでに含まれています。
> また、constで修飾していませんが、
> DLL内の関数で、自由にread/writeしたら
> 呼んだ実行プロセスの方に影響しますか?
意味がわかりません。

444 名前:デフォルトの名無しさん :03/02/27 04:22
コンソールアプリでメッセージを受ける部分があります

while(メッセージ判定){
}

でウィンドウに送られてくるようなメッセージ待ちをしているのですが、待ちの
間CPU消費が大きいです。よい方法はありますか?

445 名前:名無し@沢村 :03/02/27 04:44
>>444
WaitMessage()

446 名前:444 :03/02/27 06:24
ありがとうヌッヒー沢村。きみわ正義の味方だね。でもあまり役に立たなかった
けれど。
僕はWaitForSingleObjectを使えるように努力しようと思うよ。ヌッヒー。

447 名前:デフォルトの名無しさん :03/02/27 07:19
>>444
ごく普通にGetMessageではいかんのか?

448 名前:デフォルトの名無しさん :03/02/27 07:33
>429
lccwin32は?
リソースエディタだけ使いまわす手もある。

449 名前:デフォルトの名無しさん :03/02/27 09:46
lcc-win32でOLELoadPicture()が使えないんですが
なんかヘッダがおかしい様で
誰か回避した猛者はいませんか


450 名前:422 :03/02/27 10:04
すみませんでした、もうちょっと自分で勉強してみます。

451 名前:デフォルトの名無しさん :03/02/27 12:07
WM_CREATE見たいな自分で作ったメッセージをコールバックのメッセージキューに入れることはできますか?

452 名前:デフォルトの名無しさん :03/02/27 12:22
できます

453 名前:デフォルトの名無しさん :03/02/27 14:22
どこに書こうか迷ったけど、XP用APIが追加されるってことで一応ここに。

Microsoft、Windowsに依存するP2Pアプリの開発促進
http://www.zdnet.co.jp/news/0302/27/ne00_p2p.html

> 同社は2月26日、「Windows XP Peer-to-Peer Software Development Kit」の
> ベータ版をリリース。このソフト開発キットの狙いは、ソフトプロバイダーや企業の
> 開発者がWindows XP対応のP2Pアプリケーションを容易に構築できるように
> することにある。


454 名前:名無し@沢村 :03/02/27 17:02
>>446
MsgWaitForMultipleObjects()

455 名前:デフォルトの名無しさん :03/02/27 17:12
CALLBACK_FUNCTIONやCALLBACK_THREADはCALLBACK_WINDOWでのウィンドウハンドルに当たるところに
何を指定すればいいのでしょうか?

456 名前:422 :03/02/27 18:39
プログラム板の皆さんありがとうございました。
おかげで目的のものが作れる目処が立ちました。
ほんと、ありがとうございました。

457 名前:442 :03/02/27 22:05
>>443
>>起きません。デフォルトでプロセスごとに別々の
>>物理メモリが割り当てられます(共有させることも可能)

この「デフォルトで」というのは
どういうことでしょうか?
別々にさせるか、共有させるか、
指定できるということですか?

458 名前:442 :03/02/27 22:06
>>443
指定できるならば、どうやって?
変数を宣言するときに、なんらかの
修飾をするのでしょうか。
例えば、ちょっと違うけど、
registerとかvolatileのように、
_shareとか?

あるいはコンパイラ(リンカ)で
大域変数を共有させる…みたいな
オプションをつけるのでしょうか?

それともロードするときに大域変数を
共有させるか否かを指定するのでしょうか?
LoadLibrary()には特にオプションを
指定できないようなので、他に
LoadLibraryShare()のような
APIがあるのでしょうか?

459 名前:442 :03/02/27 22:09
>>457,458
質問ばかりでなんだかキツイ口調に
なったみたいでごめんなさい

460 名前:デフォルトの名無しさん :03/02/27 22:39
>>442
悪いことはいわんからAdvanced Windowsでも読んで体系的な知識を身に付けろ。
それを理解するのに必要な知識自体がかけてるから。

461 名前:デフォルトの名無しさん :03/02/27 22:40
>>458
VC++なら共有したい変数は #pragma data_seg("hoge") 〜 #pragma data_seg()
で挟め。hogeは8文字以内の任意のデータセグメント名。

462 名前:デフォルトの名無しさん :03/02/27 22:42
ちと訂正。「データセグメント名」ではなくて「セクション名」。

463 名前:デフォルトの名無しさん :03/02/28 02:15
9x系OSで一度に大量のファイルをコピーするとWindowsが異常に重くなってしまいます。
SHFileOperationで一気にコピーする方法とfopen, fread, fwrite で一つづつ複製する方法を試したのですが、どちらも駄目でした。
このような症状を避けるにはどうすればよいのでしょうか。
どうかよろしくお願いします。

464 名前:デフォルトの名無しさん :03/02/28 03:04
>>463
>>136では駄目かな?


465 名前:デフォルトの名無しさん :03/02/28 07:59
>>414,441
通信技術板住人のほうが詳しいかも。

>463
DOS時代には10〜20ファイルくらい一度にまとめてオープンしてから読み込んだり
書き込んだりしてたツールがいくつかあった。
openとread/writeを交互に行うとディスクのヘッドが管理領域とデーター領域を
往復するので遅い(SHFile〜も同じ仕組み?)
464が言うようにキャッシュの関係もあるかも。

466 名前:デフォルトの名無しさん :03/02/28 08:02
>>463
9x系だけじゃなくNT系でもなるよ。

467 名前:デフォルトの名無しさん :03/02/28 08:13
趣味でサンプルムービーのサイト作りました
http://homepage3.nifty.com/digikei/sample/sample.html

468 名前:デフォルトの名無しさん :03/02/28 08:33
>414
GetInterfaceInfo

469 名前:デフォルトの名無しさん :03/02/28 13:52
VC++6.0でMDIアプリケーションを作っているのですが
Debugビルドをした時は正常に動作するのにReleaseビルドをした時に
一部の動作が期待したものと違ってしまいます。

具体的にはCreateWindow()で作成したスクロールバーやオートチェックボックスの動作が
違います。自作のclassの動きが違っている可能性もあるのですが、ビルドの設定の違いで
プログラムの動作が違ってくる原因は何が考えられるでしょうか?

470 名前:デフォルトの名無しさん :03/02/28 14:02
>>469
初期化していない領域を参照したとかデバッグモードのマクロが効いているとか依存するライブラリが違うとかそんなあたり

471 名前:デフォルトの名無しさん :03/02/28 14:46
>>469
Debugライブラリのバグ。

472 名前:469 :03/02/28 15:19
レスありがとうございます。

初期化していない領域の参照というのが気になりましたので
検索したところ、それらしき情報を見つけることが出来ました。

www.bekkoame.ne.jp/ha/yoshi_s/tips/vcpp.html#debug_release
↑にあるように、変数を初期化するのとしないのとではデバックとリリースで
結果が変わるということが確認できました。というわけで、私のプログラミング作法が
ヘタレだった、という説が有力となりました。(戦場では通用しないコードだったようです)

これから、変数まわりを一つ一つチェックしてみます(;´д`)

473 名前:デフォルトの名無しさん :03/02/28 15:55
MessageBoxAPIについて教えてください。
MessageBoxを最前面に表示するためにMB_TOPMOSTフラグを立てていました。
しかし、とあるお客様のPCでこのフラグを立てても最背面に表示されてしまいます。
OSはWindows2000Pro+SP3 開発はVC++5.0(Non MFC)です。
自分のPCでは再現できずお客様のところへは簡単には行けません。
そこでMB_SYSTEMMODALフラグに変更したところ最前面へは表示される
ようになったのですが、そのメッセージボックスはアクティブな状態で
表示されないようです。
なにかヒントなどあれば教えてください。

474 名前:デフォルトの名無しさん :03/02/28 16:38
>>473
TOPMOSTなウィンドウが他にもあったら、MB_TOPMOST指定しても、
必ずしも最前面にはならない罠。
MB_SYSTEMMODAL + MB_SETFOREGROUND はどう?

>そのメッセージボックスはアクティブな状態で表示されないようです
MB_SETFOREGROUND指定しても、自分がフォアグラウンドになるための条件(MSDNに載っ
てるはず)があるので、必ずしも望みどうりにはならない。(要裏技)

475 名前:デフォルトの名無しさん :03/02/28 16:55
>>474
ありがとうございます。
MB_TOPMOST+MB_SETFOREGROUNDは試してもらったのですが
だめでした。
そもそもMB_SYSTEMMODALってあまり指定しないほうがよいのかなーと
ヘルプを読んでいて思いこんでしまって。
今度、MB_SYSTEMMODAL + MB_SETFOREGROUNDを試してもらおうと
思います。


476 名前:デフォルトの名無しさん :03/02/28 17:44
Spy++ とかで見てもらえば原因が分かるんじゃないすか?

だめすか?

そうすか。

477 名前:デフォルトの名無しさん :03/02/28 23:29
WM_CREATE時に
SetWindowLong関数でWS_EX_TOOLWINDOWを指定すると
タイトルバーとクライアント領域の間に隙間が出来てしまうのですが
解決する方法はありますか?

隙間の幅は数ピクセルで通常のタイトルバーとの差分ほどです。
その部分はクライアント領域ではないらしく、描画ができません。

478 名前:477 :03/02/28 23:56
自力解決しました。

SetWindowPos関数にSWP_DRAWFRAMEフラグでいけました。
ウィンドウスタイル変更だけでは不完全なんですね…

479 名前:デフォルトの名無しさん :03/03/01 02:44
SetClipboardDataでクリップボードへ設定したメモリ領域は
以後クリップボードが制御するので、アプリケーションが
解放してはいけないとか、CloseClipboardの後ならGlobalFreeで
解放して良いとか解説であるのですが、どっちが正しいのでしょう?

480 名前:デフォルトの名無しさん :03/03/01 03:14
   ______________  
 /:\.____\
 |: ̄\(∩´∀`) \  < >>479!こんなのがありました!
 |:   |: ̄ ̄ U ̄:|

SetClipboardDataの MSDN の記述が、
The application can read the data,
but must not free the handle or leave it locked.

The application can read the data,
but must not free the handle or leave it locked
until the CloseClipboard function is called.
と改訂されているようだ。  

481 名前:デフォルトの名無しさん :03/03/01 05:43
>>479
前々スレの425-437あたりも。
前々スレ : http://pc3.2ch.net/tech/kako/1036/10366/1036654893.html

482 名前:デフォルトの名無しさん :03/03/01 06:38
>>480 >>481 サンクス。 
両方正しいそうですね。でも自分は
あえて辞めておくことにします。CloseClipboardの
後なら解放してイイよ、とは書いてないし・・・

483 名前:デフォルトの名無しさん :03/03/01 08:58
CloseClipboard()した後で他のアプリで同じデータを貼り付けられるためには
CloseClipboard()後もGlobalFree()は実行してはならないし、
EmptyClipboard()が中でGlobalFree()してるんだよなきっと。
Windowsのソース持ってないからあくまで想像だけど、
そうじゃないと辻褄が合わない。

484 名前:デフォルトの名無しさん :03/03/01 10:56
俺はGlobalFreeしてるけど動いてるなあ…。
SetClipboardDataって、確保した領域からクリップボードの内部バッファに
転送する命令だとばかり思ってたし。

でも確かに転送するだけならGMEM_SHAREフラグは要らんわな。
使用中のGMEM_SHAREメモリを開放したら実際の開放は使用が終わるまで
遅延されるとかの安全装置が入ってると見た。

485 名前:デフォルトの名無しさん :03/03/01 11:16
動作中の他アプリのフルパスを得たいのですが、Process32First/Nextではファイル名のみしか帰ってきません。
フルパスをなんとかして得る方法は無いものでしょうか‥‥全ディレクトリ検索以外で∧||∧



486 名前:デフォルトの名無しさん :03/03/01 11:17
>>484
ただ単に偶然WindowsのGCが延期されているという考え方も。


487 名前:デフォルトの名無しさん :03/03/01 11:24
GlobalFreeの問題はWin16の頃の名残だっつーの
Win32では解放して問題ない。

488 名前:デフォルトの名無しさん :03/03/01 11:29
GetModuleFilenameExとか>485

489 名前:485 :03/03/01 12:26
>>488
そっちでできないとか思ってましたが、EnumProcessModulesの引数間違えてました‥鬱だ氏脳‥‥

な訳で下のコードで動きました

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &out);
GetModuleFileNameEx(hProcess, hModule, filename, MAX_PATH);
printf("%s\n", filename);
CloseHandle(hProcess);

エラー処理は省略

490 名前:デフォルトの名無しさん :03/03/01 12:46
>>487
実際にCloseClipboard後にGlobalFreeするとさ
自分とこでGlobalAllocしたオブジェクトは使えなくなり
他のアプリでGlobalAllocしたオブジェクトは次も使えるよな

貼り付けを行うところのコードを
そのオブジェクトがどこでアロケートされたのかに対しては
透過的に書けるのが「問題ない」ってことだと思うぜ

つまりCloseClipboard後のGlobalFreeには問題があると言いたい

491 名前:デフォルトの名無しさん :03/03/01 12:57
前にウィンドウのキャプションをクリップボードにコピーするアプリ作ったけど
1度目のコピーの時は問題ないけど2度目コピーしようとすると
SetClipboardDataが失敗するって現象が起きて困った事があった。

そう、原因はGlobalFreeをしていたからで、それを止めたら問題なくなった。

そのアプリからの流用だがためしに以下の関数を2度続けて実行してみるとわかる。
BOOL CTestDlg::CopyToClipboard(LPCTSTR lpString)
{
 HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, strlen(lpString) + 1);
 if (!hMem)
  return FALSE;
 if (::lstrcpy((char*)::GlobalLock(hMem), lpString) && OpenClipboard())
 {
  ::GlobalUnlock(hMem);
  if (::EmptyClipboard())
  {
   if (::SetClipboardData(CF_TEXT, hMem))
   {
    ::CloseClipboard();
    ::GlobalFree(hMem); // コメントアウトすれば正常になる
    return TRUE;
   }
  }
  ::CloseClipboard();
 }
 ::GlobalFree(hMem);
 return FALSE;
}

492 名前:デフォルトの名無しさん :03/03/01 13:00
CloseClipboardの後に再ロックして領域を上書きしてもクリップボードは元データのまま。
クリップボードは渡したデータのコピーを管理していると見た。

493 名前:デフォルトの名無しさん :03/03/01 13:36
>>491
> 2度続けて実行
> SetClipboardDataが失敗する
って具体的にどうやるとどうなる?
for 文で10回ループさせてみたが何の問題もない
(TRUE を返しテキストも設定されている)ようだが。
ちなみに WinMe で実験。
夜にNT系で再テストしてみるよ。

494 名前:デフォルトの名無しさん :03/03/01 15:15
>>490
OSが内部でコピーを持ってるから問題ないよ
つか、自分とこでGlobalFreeしたデータを読もうとするのは問題外。
再度クリップボードから正常に動く

495 名前:デフォルトの名無しさん :03/03/01 17:45
>>494
どういう場合にコピーを作るんだ?
少なくとも490が示したデータの中には
コピーを作らない場合があるようだ

コピーがあればGlobalFreeしても構わないと言うなら
コピーがあるか否かはどうやってチェックするんだ?
磔が2回目かどうかはどうやってチェックするんだ?

透過的な操作という観点からは
CloseClipboard後のGlobalFreeは
問題だらけだよな

496 名前:495 :03/03/01 17:48
追伸
どういう場合にコピーを作ると《保証されている》んだ?
492や493にも同じことを問いたい

497 名前:デフォルトの名無しさん :03/03/01 17:59
ウィンドウハンドルから、
そのウィンドウを作成したインスタンスの
ハンドルを取得する関数ってないですか?

HINSTANCE GetInstHandle(HWND hWnd)
なんてやつ。


498 名前:デフォルトの名無しさん :03/03/01 17:59
>>496
Win32 で稼動する場合に。

499 名前:デフォルトの名無しさん :03/03/01 18:01
>>498
その文書が《保証している》ケースで
コピーが作られない場合を490は示している

500 名前:デフォルトの名無しさん :03/03/01 18:02
>>497
GetWindowLongのGWL_HINSTANCE


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