[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 08/31 01:22 / Filesize : 264 KB / Number-of Response : 1016
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Win32API質問箱 Build123



1 名前:デフォルトの名無しさん mailto:sageteoff [2016/10/08(土) 12:33:02.29 ID:0jaJMPXG.net]
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build122
echo.2ch.net/test/read.cgi/tech/1451988219/

543 名前:デフォルトの名無しさん [2017/04/05(水) 14:24:34.32 ID:+eJqUohN.net]
ここまで漏れの自演

544 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 17:46:17.73 ID:Wug7VRpa.net]
質問お願いします。
QueryPerformanceFrequency
で得た値は実行ごとに変わったりするから毎回計測しないと駄目ですか?

545 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 18:05:42.24 ID:lEpGhGGY.net]
どんな理由から毎回計測しないようにしたいんだ?それによる

546 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 18:18:16.44 ID:Wug7VRpa.net]
QueryPerformanceFrequencyの値がプログラムを終了するまで一定なら
1回しかこれを実行したくないし変わるなら一回時間を計測するごとにこれを実行したいです

547 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 18:30:27.17 ID:lEpGhGGY.net]
それなら一度だけでよかったはず

548 名前:デフォルトの名無しさん mailto:sage [2017/04/07(金) 17:01:14.12 ID:3o5iBWIM.net]
システム起動中に変わることはないってさ

549 名前:デフォルトの名無しさん mailto:sage [2017/04/07(金) 22:21:01.99 ID:9JlGmFFU.net]
ハイバーネーションみたいなのとかVMとか組み合わさるとどうなるかわかんないけどそういうことになってるね

550 名前:デフォルトの名無しさん mailto:sage [2017/04/08(土) 09:03:07.92 ID:ptqONvxu.net]
俺は使うたびに毎回読んでるわ
あえてそうしない意味もないから

551 名前:デフォルトの名無しさん mailto:sage [2017/04/08(土) 17:48:41.54 ID:C7AQR+Mi.net]
すみません、教えてください。

Borland BCC でC/Cppを勉強しているのですが、
CreateWindow( "EDIT", "あああああ", ....
にすると、あああああ の部分が文字化けして ,,,, と表示されてしまいます。
CreateWindow( "STATIC", "あああああ", ...
だと問題なく表示されます。

どうか教えてください、宜しくお願いします。



552 名前:デフォルトの名無しさん mailto:sage [2017/04/08(土) 22:40:07.71 ID:42pK0vcr.net]
>>544
BCCはよくわかんけど、パラメーターが変とかじゃね?あと考えられるのはUNICODEとか?
このコードは RAD Studio10.1 BerlinとVS2015/2017で動くことは確認済み
HINSTANCE hInst;HWND hEdit,hStatic;
HWND hWnd= Handle; // BCBとか用
hInst=GetModuleHandle(0);
hEdit = CreateWindow(TEXT("EDIT") , TEXT("あああ") ,WS_CHILD | WS_VISIBLE | ES_LEFT,0 , 0 , 400 , 20 , hWnd , 0 ,hInst , NULL);
hStatic = CreateWindow(TEXT("STATIC") , TEXT("あああ") ,WS_CHILD | WS_VISIBLE | ES_LEFT ,0 , 20 , 400 , 20 ,hWnd , 0 ,hInst , NULL);

553 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/04/09(日) 07:27:35.73 ID:qFsmFYyf.net]
>>544
省略せずに書いてみて。

554 名前:544 mailto:sage [2017/04/10(月) 07:47:25.26 ID:RoCnetHj.net]
すみません、お手数をおかけします。


// あああああ が表示される
CreateWindow( "STATIC",
"あああああ", WS_CHILD | WS_VISIBLE | SS_CENTER,
x, y, w, h,
hGrp1, (HMENU)ID_TEXT1, hInst, NULL );

// あああああ が表示されず ,,,,, となる
CreateWindow( "EDIT",
"あああああ", WS_CHILD | WS_VISIBLE | SS_CENTER,
x, y+50, w, h,
hGrp1, (HMENU)ID_TEXT2, hInst, NULL );

hGrp1 はグループボックスです。

555 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/04/10(月) 08:21:28.02 ID:73IQobxS.net]
"EDIT"にはSS_CENTERは使えないよ。EDITにはES_...スタイルを使う。

556 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 08:53:21.05 ID:ZIRNWk3W.net]
>>547
とりあえずコントロール毎に指定フラグが違う事を指摘しておく

557 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 16:45:44.18 ID:PH6zMRzh.net]
>>547
マルチバイト文字列が上手くいかないなら"AAAA"のようにシングルバイト文字列で試してみればいいじゃないか。

558 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 17:20:37.45 ID:vopNHtdq.net]
>>547
WM_SETFONTを使って、フォントを関連付けしてみたらどうだい?

559 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/04/10(月) 17:25:49.47 ID:73IQobxS.net]
SS_CENTERがES_ENDELIPSISとして解釈されたんだろうな。
【今日の教訓】
EDITコントロールには、ES_で始まるスタイルを使え。SS_はEDITには使うな。

560 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/04/10(月) 17:32:00.56 ID:73IQobxS.net]
ごめん、ES_ENDELIPSISというスタイルはなかった。SS_CENTERの代わりにES_CENTERを指定すればいい。

561 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 21:33:08.91 ID:G1/iiInq.net]
なんでESとかSSとか種類が有るの?



562 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 21:59:23.57 ID:PH6zMRzh.net]
そりゃ特定のコントロールに対するものだからさ。
あとSS_CENTERもES_CENTERも winuser.h で 0x01L と定義されている。

例えば共通の定義 XX_CENTER 0x01L としていた場合、
EDITコントロールの仕様変更でXX_CENTER 0x02L としたくても
STATICコントロールで同じ意義を使っているため変えることが出来ないだろ。
もし定義を変えた場合、STATICコントロールで0x02L というのは別の意味を持っている(かもしれない)ので動作がおかしくなる。
だから意味は同じでも“値”としては別のものとして扱う(定義する)。

563 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 22:00:00.06 ID:PH6zMRzh.net]
ミス
意義→定義

564 名前:デフォルトの名無しさん mailto:sage [2017/04/10(月) 23:44:29.58 ID:CESguEkt.net]
じゃー将来SS_CENTERが別の値に変更されても安心だね

565 名前:デフォルトの名無しさん mailto:sage [2017/04/11(火) 07:55:30.63 ID:pJyY6xCH.net]
変えたらひどいことになるけどなw
本音と建前みたいなもんでCの欠点だな。後発言語はそういうとこカバーされてる(のもある)

566 名前:デフォルトの名無しさん mailto:sage [2017/04/11(火) 17:52:35.12 ID:xC3FSY5Y.net]
モーダルダイアログをメインの親とし、その後動的にサブメニューを表示する仕組みがあります。
サブメニュー表示中も親側の操作を可能とするため、サブメニューはモードレスとしていますが、
TABなどのキー入力が効きません。
辛うじて、初期フォーカスがあるボタンのみスペースキーを受け付けます。
マウス操作は問題ありません。

原因としてはサブメニューのキー処理をする IsDialogMessage を含むメッセージループが必要
なんだろうと思いますが、こういう場合の定石というのはあるのでしょうか?

思い付く実装は以下2パターンです。

その1
親もモードレスとし、親のメッセージループ中にサブメニューのメッセージも処理する仕組みを入れる。

その2
サブメニュー表示後に別スレッドを立ち上げ、そこでサブメニューのメッセージループを回す。


普通はこうだよ。とか他の方法などありましたらお願いします。

567 名前:デフォルトの名無しさん mailto:sage [2017/04/11(火) 17:55:40.75 ID:xC3FSY5Y.net]
ちょっと語弊がありましたので訂正です。

ここで言う「サブメニュー」とは、CreateMenu などで作られる一般的に言うメニューではなく、
単なるポップアップスタイルのタイトルなしダイアログのことです。
CreateDialog で画面を作っています。
勝手に言葉を作ってすみません。

568 名前:デフォルトの名無しさん mailto:sage [2017/04/11(火) 18:23:36.29 ID:9HH9Hffg.net]
2つウインドウがあって、1つはメインウインドウ、もう1つはメニューウインドウ
メインウインドウにキーフォーカスがあるとメニューウインドウでキー操作できず、メニューウインドウにフォーカスがあるとメインウインドウでキー操作できない
メッセージを適宜流せばいいんじゃないか?

569 名前:デフォルトの名無しさん mailto:sage [2017/04/11(火) 22:23:16.04 ID:xC3FSY5Y.net]
フォーカスはそれがあるウィンドウで処理できるようなUIを考えています。
ユーザーがメインウィンドウにフォーカスを(マウスなどで)移せば、
以降はそのウィンドウでキーボード操作ができればいいです。その逆も然り。

適宜メッセージを流すにしても、結局どこでメッセージループを回すかという
話になるのではと思うのですが、違うのでしょうか?

570 名前:デフォルトの名無しさん mailto:sage [2017/04/12(水) 22:43:12.22 ID:iYQoJoP4.net]
なにいってんだこいつ

571 名前:デフォルトの名無しさん mailto:sage [2017/04/12(水) 23:28:35.38 ID:lhjyuLrL.net]
分からないのに無理して答えるなよ



572 名前:デフォルトの名無しさん [2017/04/13(木) 02:45:23.01 ID:8XBnDqPS.net]
最近よく足がつる

573 名前:デフォルトの名無しさん mailto:sage [2017/04/13(木) 11:42:08.71 ID:9jlRESvt.net]
>>562
フォーカスを移してキーボード操作なんて危険なことを平気でやろうとする人はWin32APIなんて使わない方が良いんじゃね?

普通はフォーカスを移そうとしているオブジェクトにフォーカスを移す移さない関係なく文字列送信するもんじゃないの?

キーボード操作中にユーザーが別のウィンドウをクリックした場合とか考えないの?

574 名前:デフォルトの名無しさん mailto:sage [2017/04/13(木) 13:32:39.75 ID:OCOdT3+H.net]
>>562
難しく考えるよりも、例えば、MVCベースで考えて設計したらいいんじゃねーの?
オブジェクト指向で設計するのもいいし、データ処理ありきで設計するのもあり、やりやすいように作ればいいよ。

575 名前:デフォルトの名無しさん mailto:sage [2017/04/13(木) 17:59:38.26 ID:zh4lU2gJ.net]
>>566
なんで何も理解できていないのに無理に話に入ろうとするの?

576 名前:デフォルトの名無しさん mailto:sage [2017/04/13(木) 18:16:04.36 ID:xmE6C1ua.net]
spyで見てどこにメッセージ届いてるか見ろ

577 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 00:20:20.46 ID:+RGtmVs/.net]
フォースを使うのじゃ

578 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 00:39:04.52 ID:6ECgJlCU.net]
Windows 10 Creators Update入れたら
DrawTextで大きめのフォントの描画が異常に遅くなった。
高DPI未対応のアプリは見捨ててGDIはシンプルに動いてほしい。

579 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 05:38:58.24 ID:kIyPPZzD.net]
>>567
2行目めちゃくちゃだなw

580 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 10:41:54.49 ID:7fCdXhh/.net]
>>561
>メッセージを適宜
それが質問内容でしょうよ。

>>566
タブコンに子ウィンドウ貼り付けて画面切り替えやキー入力受付なんて
日常茶飯事なのになにとち狂ったこと言ってるんだよ。

>>572
ほんとそう。
自分の知ってる単語を並べただけだわな。

581 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 11:11:32.10 ID:LVRPT4/o.net]
Win32APIの後継でc++/cliじゃないライブラリってないのかね?



582 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 11:29:24.19 ID:iAr+rl+J.net]
win32apiはオンリーワンで現役なので後継ってもんがそもそもなし
.netはラッパーライブラリ、cliは言語仕様
>>574の求めてる物の意味が分からん
UWPでも触ってろと言えばいいのか?

583 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 15:40:59.51 ID:Z/bjVn5R.net]
しいて言えばQtじゃね?
Qtのアプリって結構あるよね

584 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 18:23:47.19 ID:R7yCPQGT.net]
>>574
ライブラリってかAPIはユニバーサルwinのがそれじゃないの?

585 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 18:31:24.82 ID:uRqmXJpf.net]
WinRT API

586 名前:デフォルトの名無しさん [2017/04/14(金) 22:27:03.58 ID:Gjx6wpyy.net]
ここでWTLがまさかの大復活を遂げるわけよ

587 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 06:16:39.59 ID:qt9qpnGQ.net]
ちょっとしたもんつくるにはwtlが一番いい

588 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 18:14:11.71 ID:JjgxHVsv.net]
>>574
Windows API
後継っつーか名前が変わっただけだが

589 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 00:01:23.37 ID:j+7+fM28.net]
Windows10S では Win32/.net アプリは動かないだと。
UWPに変換すれば行けるらしいが、もうおしまいか?

590 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 00:15:11.42 ID:NU+YZp1H.net]
Windows10Sが相手にされなくて終わるだけ。

591 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 00:41:30.18 ID:W8ns9+oF.net]
既に相手されていない感



592 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 03:08:44.86 ID:IUUvTOhg.net]
お前らが相手にされてないじゃん
おっさんしかいないだろうこのスレ

593 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 08:12:57.54 ID:WdEsZnG0.net]
今回のターゲット層はメインストリームじゃないから
既存のアプリが使えなくても不満は少ないと踏んでるんだろう
まあWindowsRTみたいに核爆死はしないんじゃないか
MSもそんなに数を出荷しないだろうから

もう一度WindowsRTをSurfaceやらに載せることを夢見ているのなら
やはりもう一度爆死するだろう

594 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 18:13:03.55 ID:ERU+CvkU.net]
教育用途だっけ
今時のキッズは学校支給タブレットの制限外してゲームしてるらしいからその点ではいいかもな

595 名前:片山博文MZ mailto:age [2017/05/06(土) 18:59:21.43 ID:0OTJXmRc.net]
あるプログラムで使用中のGDIオブジェクトの個数を数える方法はありますか?

596 名前:デフォルトの名無しさん mailto:sage [2017/05/06(土) 20:36:55.22 ID:TAVkl+y8.net]
タスクマネージャで見れるよ

597 名前:デフォルトの名無しさん mailto:sage [2017/05/06(土) 20:50:23.24 ID:IA0Dpe0I.net]
GetGuiResources(hProcess, GR_GDIOBJECTS)

598 名前:デフォルトの名無しさん mailto:sage [2017/05/06(土) 20:53:17.94 ID:Mwx5Td89.net]
>>588
GetGuiResources
GR_GDIOBJECTS(0) Return the count of GDI objects.
ってあるし。

599 名前:片山博文MZ mailto:age [2017/05/06(土) 20:54:47.07 ID:NWV3MG9s.net]
ありがとー。

600 名前:デフォルトの名無しさん mailto:sage [2017/05/06(土) 21:06:22.69 ID:HiVS0qll.net]
なにするつもりなのさ

601 名前:片山博文MZ mailto:age [2017/05/06(土) 21:08:39.06 ID:NWV3MG9s.net]
メモリーリーク対策やデバッグやらだよ。



602 名前:雪風 [2017/05/06(土) 21:54:04.69 ID:QwsGrGdx.net]
>>593
自演 オナヌーだろ

603 名前:デフォルトの名無しさん mailto:sage [2017/05/06(土) 22:06:22.10 ID:sQ11ayCM.net]
書いてて恥ずかしくないの?

604 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 02:01:32.34 ID:KMqw+OzL.net]
memory leak detector
https://tocsworld.wordpress.com/2014/09/02/vc%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E6%A4%9C%E5%87%BA%E3%83%84%E3%83%BC%E3%83%AB/

605 名前:デフォルトの名無しさん [2017/05/07(日) 07:23:08.46 ID:fOF53fEF.net]
firefoxとかリーク笑えるよな

606 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 09:36:37.30 ID:PBqzgUoz.net]
特定のアプリケーションがハング状態になってるかを判断する方法ありませんか?
.netではRespondingプロパティで判断できるようですがwin32apiでやりたいので

607 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 09:45:13.26 ID:XSL1JKA6.net]
そこまで分かってるならソース読めよ
https://github.com/Microsoft/referencesource/blob/master/System/services/monitoring/system/diagnosticts/Process.cs

SendMessageTimeoutでWM_NULLを投げてるだけだな

608 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 10:04:41.73 ID:4hsRJ4JE.net]
その質問コピペだよ

609 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 10:17:40.46 ID:PBqzgUoz.net]
ありがとうございました!

610 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 11:30:51.02 ID:fjUlBZmQ.net]
>>600
これ使ってDoS攻撃みたいなこと出来るんかな

611 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 21:20:50.87 ID:2/UhKD8y.net]
最近のアプリに多い、重い処理は別スレッドで実行してGUIが固まらないようにしてる場合は役に立たないかな



612 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 21:48:08.53 ID:LCRfM0F6.net]
>>604
それは「重い処理のときにハングアップしているように見える」というだけの話で、
そういうレベルでの意味ならマルチスレッド化によって役には立たない。
でもそういうマルチスレッド化したソフトウェアでも
画面描画の時の不具合などでハングアップすることもあるわけで役に立たないということはないよ。

613 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 22:06:52.23 ID:2/UhKD8y.net]
>>605
バグでずっと重い処理が終わらない場合を想定してた。ウィンドウメッセージは処理されるものの、事実上のハング。
確かに全く役に立たないわけではないね。

614 名前:デフォルトの名無しさん mailto:sage [2017/05/09(火) 23:47:50.15 ID:Ephb2XFu.net]
ウィンドウがわかるならIsHungAppWindowってのがある

615 名前:デフォルトの名無しさん mailto:sage [2017/05/10(水) 02:35:27.31 ID:bnhY1qc6.net]
>>606
動画の変換みたいに純粋に時間がかかる場合とか、ユーザーのクリック待ちとかもあるから、判断はできんだろうな

616 名前:デフォルトの名無しさん mailto:sage [2017/05/10(水) 02:56:46.04 ID:SJjrbjyQ.net]
止めようとしても停まらないもの?
WindowsUpdateかな?

617 名前:デフォルトの名無しさん mailto:sage [2017/05/10(水) 11:25:51.30 ID:Cp7+CNi6.net]
>>609
ネットワーク切れてからのタイムアウトも異常に遅いんだよな

618 名前:デフォルトの名無しさん [2017/05/14(日) 19:29:07.89 ID:QF9yNcvN.net]
まだ見放されてないぞ

【IT】マイクロソフト、サポート切れOS「Windows 8、Windows XP、Windows Server 2003」にも修正ソフト提供

asahi.2ch.net
test/read.cgi/newsplus/1494723803

619 名前:デフォルトの名無しさん [2017/05/19(金) 19:48:39.48 ID:7xgwPeWo.net]
質問ささてください
構造体AをGlobalAllocで領域を確保して値を入れた後、構造体BをGlobalAllocで確保すると、構造体Aのメンバであるポインタのアドレスが変わってしまうのですが何が原因なのでしょうか?

620 名前:デフォルトの名無しさん mailto:sage [2017/05/19(金) 20:35:00.88 ID:bDipVMhT.net]
あるプロセスのメモリ情報のリージョンサイズや属性を調べるにはどのAPIを使えばいいですか?

621 名前:デフォルトの名無しさん mailto:sage [2017/05/19(金) 20:49:42.55 ID:McGsnd5l.net]
>>612
Windowsは働き者の賢いOSだからなぁ



622 名前:デフォルトの名無しさん [2017/05/19(金) 21:09:20.04 ID:/MnRfLXT.net]
動かしたくないならLockしてください

623 名前:デフォルトの名無しさん mailto:sage [2017/05/19(金) 21:11:02.62 ID:vqbyNvRL.net]
>>612
GlobalAllocじゃなくて自分で書き換えてるんでしょ

624 名前:デフォルトの名無しさん mailto:sage [2017/05/19(金) 21:22:03.75 ID:Q8L1LGu9.net]
>>612
GMEM_FIXEDを指定していないGlobalAllocでロックカウントが0の場合はメモリの再配置が起きる
GlobalLockとGlobalUnlockの間なら
「構造体Aのメンバであるポインタのアドレス」は変わることがないけど
GlobalUnlockを呼び出しロックを解除した場合は再配置される可能性がある

625 名前:デフォルトの名無しさん [2017/05/20(土) 18:36:33.10 ID:urI3JAo7.net]
皆様レスありがとうございます
>>612
構造体BのGlobalAllocをコメントアウトすれば問題なく動くのでこれが原因なのはたぶん間違いないです

>>617
構造体A自体のLockやFIXは試しましたがダメでした。構造体Aは領域確保後にwinAPIに渡して値を格納してもらうのですが格納後にメンバ全ての固定が必要なのでしょうか?


ともあれメモリ再配置が原因なのですね。ありがとうございました。この方向でもう少し試してみます。

626 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 18:43:52.60 ID:YAniTqrY.net]
違うんじゃね

627 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 19:05:41.41 ID:rnnQH6fx.net]
ソースコードにイージーミスがある可能性の方がクッソ高いと思う

628 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 19:06:46.68 ID:opost44+.net]
>>618
そもそもの使い方が間違っているんじゃないか?

>構造体Aは領域確保後にwinAPIに渡して
そのwinAPIは何?
というかなぜ隠す必要があるのか

629 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 19:08:39.87 ID:YAniTqrY.net]
必要最小限の再現ソース晒してからだな

630 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 02:26:55.08 ID:8+aEBKAw.net]
構造体A、もしくはその近くのメモリ確保量が足りていないような気がする
スタック破壊、または、メモリ内容破壊では?

631 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 10:34:21.57 ID:UufpipHO.net]
>>613
VirtualQueryEx



632 名前:デフォルトの名無しさん [2017/05/21(日) 10:40:12.71 ID:8IHB32RP.net]
すみません。自分がC++素人でメモリ周り疎いのでよくあるトラブルかなと思い、動作確認できている部分は抽象的に書きました。イージーミスの可能性はかなりあります。
ソースが手元にないのですが、具体的にはこのような処理をしています。スマホから書いたので文法ミスあるかもしれません。

メイン処理
DWOR count=0;
LPBYTE pStructA = (LPBYTE)GlobalAlloc(GHND,sizeof(0));

GetPrinterInfo(pStructA,&count);//自作関数 pStructAに構造体格納

/*ここでブレーク張ってpStructAのpNameのアドレスが正しい文字列指してるのは確認済み*/
PStructB pStructB = (PStructB)GlobalAlloc(GHND,sizeof(StructB)*count);

/*ここで改めてpNameを取得しようとするとpNameのアドレスがpStructBを確保する前と変わっている。元の文字列データは以前として前のアドレス上に存在してることは確認済み。pStructA自体のアドレスは変わっていない
*/
for(i=0 ;i<count;i++){
LPTSTR name= (((PRINTER_INFO_1*)pStructA)+count)->pName;
}
〜〜〜
自作関数 (動作確認済み)
DWORD GetPrinterInfo(LPBYTE pStructA, LPDWORD count){
DWORD result=0;
DWORD pNeeded=0;
//必要サイズ取得
EnumPrinter(PRINTER_ENUM_LOCAL,NULL,1,NULL,pdw
&pNeeded,count);
//必要サイズ再確保
Global ReAlloc(pStructA,pNeeded,GHND);
//ここでPRINTER_INFO_1構造体をpStructAに格納
EnumPrinter(PRINTER_ENUM_LOCAL,NULL,1,pStructA,pdw
pNeeded,count);
return result;
}

633 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 11:10:23.22 ID:Bmvuj1qA.net]
GlobalAllocの戻り値のハンドルを直接キャストしてポインタに代入したら駄目だろ
ハンドルを引数としてGlobalLockを呼び出して、その戻り値をキャストしてポインタに代入しろ

634 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 11:25:17.73 ID:8zMWeNzv.net]
蓋を開けてみればやはりこんなもんだ

635 名前: mailto:sage [2017/05/21(日) 11:29:51.82 ID:pUWFtSb1.net]
p = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
HeapFree(GetProcessHeap(), 0, p);
でうまくやってるよ,GlobalAlloc は win3.1 の仕様を下敷きにしているので使いにくいよ

636 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 14:52:03.05 ID:2E7Z41P0.net]
オワコンだしな
今はもうmallocでいいよ

637 名前: mailto:sage [2017/05/21(日) 15:16:35.99 ID:pUWFtSb1.net]
>>629
それはどこにあるのかな?

638 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 16:25:59.44 ID:qIzrXw0L.net]
>>625
関数の仕様ぐらい確認しろといいたい
https://msdn.microsoft.com/ja-jp/library/cc430065.aspx
GMEM_FIXEDを指定していないGlobalAllocはメモリハンドルを返す
アドレスではなくハンドルであり、このハンドルをGlobalLockに渡すことでメモリアドレスを取得できる

メイン処理
DWORD count=0;
HGLOBAL gm = GlobalAlloc(GHND,sizeof(0));
GetPrinterInfo(gm,&count);
LPBYTE pStructA = (LPBYTE)GlobalLock(gm);
for(i=0 ;i<count;i++){
LPTSTR name= ((PRINTER_INFO_1*)pStructA)[i].pName;
}
〜〜〜
DWORD GetPrinterInfo(HGLOBAL gm, LPDWORD count){
DWORD dwSize;
DWORD result=0;
DWORD pNeeded=0;
EnumPrinter(PRINTER_ENUM_LOCAL,NULL,1,NULL,0,&pNeeded,count);
Global ReAlloc(gm,pNeeded,GHND);
dwSize = GlobalSize(gm);
LPBYTE pStructA = (LPBYTE)GlobalLock(gm);
EnumPrinter(PRINTER_ENUM_LOCAL,NULL,1,pStructA,dwSize,&pNeeded,count);
GlobalUnlock(gm);
return result;
}

639 名前:デフォルトの名無しさん [2017/05/21(日) 16:40:14.23 ID:s+TjotGN.net]
GMEM_MOVEABLE
移動可能メモリを割り当てます。Win32 環境では、物理メモリ内でメモリブロックが移動されることは決してありませんが、既定のヒープ内で移動することは可能です。
戻り値は、メモリオブジェクトのハンドルです。このハンドルをポインタへ変換するには、GlobalLock 関数を使います。
この値を GMEM_FIXED フラグと組み合わせることはできません。

Win32では移動することがないあるよって言ってるし、GPTRフラグを使うか、メモリ確保をmallocなりに置き換えたほうが良いね
EnumPrintersに渡すバッファのポインタは別になんでも良いみたいだし

640 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 16:51:37.43 ID:UufpipHO.net]
GlobalAllocはクリップボード弄る時くらいでいいよ

641 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 18:27:54.67 ID:8+aEBKAw.net]
こうゆう奴がプロジェクトにいると、デバックでは動くがリリースでは動かない
プログラムとか出来上がるんだろうな。。。

(もちろん、リリース+デバック情報埋込なら動く最悪のパターン)



642 名前:デフォルトの名無しさん mailto:sage [2017/05/22(月) 03:45:08.81 ID:6WP6IGo9.net]
mallocでも、newでも好きなのつかったらいいんじゃね?

643 名前:デフォルトの名無しさん [2017/05/22(月) 07:02:35.87 ID:1fjxccfj.net]
sizeof(0) ...






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<264KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef