1 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 01:54:24 ] スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。 やさしいお兄さんやお姉さんたちが答えてくれるかも。 「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ! 過去スレ、関連リンクは>>2-10 くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで - Win32API質問箱 wiki wiki.livedoor.jp/program1/d/FrontPage Win32API質問箱 Build76 pc11.2ch.net/test/read.cgi/tech/1233622578/
186 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:46:06 ] VB(笑)
187 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:53:22 ] 本題からは逸れるけど、 UUIDなんて構造体作らなくても、System.GUIDを使えばいいし、 hWndの型はIntPtrのほうが適切。 とここまで書いて、UUID構造体の定義がまずいような気がしてきた、Data4のあたり。 System.GUIDにするとどうだ?
188 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 01:16:42 ] >>187 レスありがとうございます。 System.GUIDというのは Dim IID_IAccessible As Guid = Guid.NewGuid() こうすれば良いでしょうか? hWnd関係は全部IntPtrに置き換えてみました。 TextBox1.Text = GetSysLVHwnd().ToInt32 で65698という数字が帰ってくるので大丈夫だと思います。 何かダメそうなところが分かりましたら教えていただきたいです
189 名前:デフォルトの名無しさん [2009/03/05(木) 01:18:04 ] >>188 API定義これでどうよ?使ったことないけど。 Private Declare Function AccessibleObjectFromWindow Lib "oleacc" (ByVal Hwnd As Int32, _ ByVal dwId As Int32, _ ByRef riid As Guid, _ <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As Int32
190 名前:>>188 [2009/03/05(木) 01:25:00 ] よく見てみると、その後こう使ってるのか。動くのかな? 著作権とかはしらね www.pinvoke.net/default.aspx/oleacc/AccessibleObjectFromWindow.html Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim varChild As Accessibility.IAccessible Dim hWnd As Int32 = GetForegroundWindow() Dim ID As Int32 = 0 Dim IID_IAcce As Guid = New Guid("618736E0-3C3D-11CF-810C-00AA00389B71") Dim aaVal As Int32 = AccessibleObjectFromWindow(hWnd, ID, IID_IAcce, varChild) End Sub
191 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 01:48:30 ] レスありあとうございます。 >>189 を試してみましたが Can not marshal parameter #4: Invalid managed/unmanaged type combination (Interfaces must be paired with Interface). というエラーが出てしまい対応できませんでした。 >>190 New Guid("618736E0-3C3D-11CF-810C-00AA00389B71") を定義すると取得失敗へ行かなくなりました。 varChildに何か入っているようです。 最初のグーグルで最初に出てくるページのサンプルでvarChildを調べる部分でエラーが 出てしまいましたが、また色々やってみたいと思います。 何をやってもNothingのままだったので>>33 がやっと解決できましたみたいでありがたいです。 ありがとうございました。
192 名前:デフォルトの名無しさん [2009/03/05(木) 10:19:12 ] >>191 インターラプト入れれば、マーシャルでエラーでない Imports System.Runtime.InteropServices Private Declare Function AccessibleObjectFromWindow Lib "oleacc" (ByVal Hwnd As Int32, _ ByVal dwId As Int32, _ ByRef riid As Guid, _ <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As Int32
193 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:47:34 ] >>174 そうだ!! WM_COPYDATAがあったんだ! ありがとうありがとう
194 名前:デフォルトの名無しさん [2009/03/05(木) 18:03:33 ] ツールバーを消したいんですけど、手順的にはどうすればいいのですか? サイズを 0,0,0,0 にしたり SW_HIDE とか HWND_BOTTOM を試しても うまくいかず、「上に」詰めた領域がツールバーに隠れるんですが、、、
195 名前:デフォルトの名無しさん [2009/03/05(木) 18:39:06 ] >>194 ShowControlBar()
196 名前:デフォルトの名無しさん [2009/03/05(木) 18:45:54 ] ごめん間違えた。ShowWindowのSW_HIDEで消えないの?
197 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:18:58 ] まともなのが共産と国民新党しかないとかどれだけw
198 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:23:58 ] ひでえ誤爆
199 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:57:10 ] >>192 Imports System.Runtime.InteropServices は書いたのですがエラーになってしまいました。 もう一つ教えて頂きたいのですが、 Dim objAcc As IAccessible という宣言があるのですが、 objAcc を入力したあとにピリオドを入力すると メンバが出るようにしたいのですが方法がありましたら教えて頂きたいです。
200 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:58:46 ] おっとそこまでだ その質問はVB.NETスレでやってくれ
201 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:59:28 ] >>199 何度もすみません。 現在デスクトップ上のアイコンの名前がリストボックス登録されるところまで出来ました。 (グーグル検索の最初に出てくるサンプルをVB.NETに書き換えて)
202 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:10:53 ] >>197 どういう話題のスレか分かってしまうw
203 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:44:55 ] プログラムが立ち上がったときに、エディットコントロールに初期文字が表示されるようにするため、 プログラム内からエディットコントロール内に文字を打ちたいのですが、どのようにすればよいでしょうか? SendMessageを使って、例えば「7」を入力しようとしましたが、ダメでした。 SendMessage( hEdit, WM_KEYDOWN, '7', 0 ); ご助言、お願いします。
204 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:49:55 ] >>203 WM_INITDIALOG 内で SetWindowText()
205 名前:203 mailto:sage [2009/03/06(金) 00:02:49 ] >>204 ありがとうございました!!
206 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 09:29:08 ] >>194 SetMenu(hWnd, NULL);
207 名前:デフォルトの名無しさん [2009/03/06(金) 19:31:44 ] トップレベル・ウィンドウに BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint ); と、 BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); を、 X、Y、W、H とも同じ値にして実行したときに出来るウィンドウのサイズと座標が 全く異なるんですが、これは一体どういうことなんですか??
208 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 19:48:15 ] スクリーン座標とクライアント座標じゃね? WndPosがクライアントだった希ガス
209 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:34:14 ] 悪い、SWP_NOSIZEとSWP_NOMOVE指定してたわ
210 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 07:39:56 ] そーゆーオチかよwww
211 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 16:41:43 ] あああああああああああああああああああああああああああああああああああああああ
212 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 16:43:47 ] 何?何?
213 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 16:49:03 ] 酒飲んでて屁だと思ったのが下痢だった
214 名前:デフォルトの名無しさん [2009/03/08(日) 01:14:34 ] OS:Windows VISTA SP1 ボタンを押したらOS情報取得するプログラムを以下の様に記述 しました。 GetVersionEx(&osv); switch (osv.dwPlatformId) { case VER_PLATFORM_WIN32s: MessageBox(NULL, "Win32sです", "Platform", MB_OK); break; case VER_PLATFORM_WIN32_WINDOWS: MessageBox(NULL, "Windows95です", "Platform", MB_OK); wsprintf(str, str_format, LOWORD(osv.dwBuildNumber)); MessageBox(NULL, str, "OK", MB_OK); break; case VER_PLATFORM_WIN32_NT: MessageBox(NULL, "WindowsNTです", "Platform", MB_OK); break; 結果、なぜか、VISTA上で動かしてボタンを押すと、 VER_PLATFORM_WIN32_NT: MessageBox(NULL, "WindowsNTです", となってしまいます。 VISTAを判別するためのdefineってなんでしょうか? GetProductInfoで細かく取得するつもりはないんですが・・。
215 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:20:02 ] VistaはNTだし…
216 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:21:55 ] dwMajorVersionとdwMajorVersion見ろ
217 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:31:02 ] ドキュメントぐらい読め msdn.microsoft.com/en-us/library/ms724834 (VS.85).aspx
218 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:32:06 ] >>214 msdn.microsoft.com/en-us/library/ms724834 (VS.85).aspx
219 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:32:58 ] かぶったorz
220 名前:デフォルトの名無しさん [2009/03/08(日) 01:36:26 ] NT系列だったんですね 勘違いしてました。 ありがとうございました
221 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:38:07 ] まさか本気でMeの後継だと…
222 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 02:26:19 ] さらに、Windows 7.0はバージョン7.0と思っているに違いない。
223 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 02:49:04 ] え??VISTAの完成度の低さはMeの後継だからでしょ?
224 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 02:52:21 ] うん そうだね
225 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 02:56:45 ] Win32を使っているのならVistaのAPIの完成度の高さはわかるはずだが…
226 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 03:30:29 ] >>222 >Windows 7.0 もしかしてそれはWindows 7と言いたいのか?
227 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 03:31:53 ] >>223 「Meの後継」と「完成度」には何の関係もないだろ
228 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 06:03:34 ] >>226 そのとおり。すまん、つい勢いで書いてしまった。今は反省している。
229 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 06:35:58 ] >>227 そのとおり。すまん、つい勢いで書いてしまった。今は反省している。
230 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:37:52 ] VistaのAPIの完成度の高さ、って…… MS社員乙って言ってほしいのか?
231 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 12:15:03 ] 後に出たAPIほど洗練されるのはある意味当たり前 VistaのAPIが完成度高いってよりWin32 APIが極端に使いにくいだけ でも歴史的背景を考えればやむなし
232 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:40:29 ] はぁ? VistaのAPIが完成度高い??洗練されてる?? もしかして、VistaのAPI=.NET3.0/WPF=洗練されてる、とか言いたいだけの人なのかね
233 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:45:09 ] WERやスレッド関連は以前よりはるかに完成度が高いと思うけど
234 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:49:43 ] >>233 アホは議論に参加しなくていいから。
235 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:54:28 ] 一部流動的なものを対象としている為に、 ライブラリのような「完成度」が求めることが不可能 であるか極度に困難だからこそAPIと呼ばれライブラリ とは呼ばれない件について (以上チラ裏)
236 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:06:18 ] まあ APIの完成度 なんて表現を使う時点で程度の低さが分かっちゃうけどね
237 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:08:39 ] API=Aplication Programming Interface だったっけ? 完成度は求められる対象じゃないか?
238 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:11:14 ] いやVISTAのAPIは完成度高いだろ だってさ、XP用のソフトも使えるんだぜ? XP = XP用のソフトしか使えない VISTA = XP用ソフト、VISTA用ソフトの両方が使える
239 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:18:44 ] そもそもVistaのAPIつっても大部分がWin16時代からの物なのに「完成度」てw どうも"API"を理解してない人がいるみたいだね またいつもの人か?
240 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:20:03 ] どこぞのVZ厨だろ
241 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:21:46 ] >>239 そだね。APIってインターフェースだから内部構造は絶対不変で Win16のコードすら必ず残ってるからね。だからVistaでもXPでも Windows2.0のプログラムがそのまま動くw。
242 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:30:44 ] WERやスレッド関連って、VistaからのAPIだろ…
243 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:40:04 ] MSの互換性絶対主義の賜だね さすがMS様はわかってらっしゃる
244 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:07:33 ] >>241 64bit版にはWin16サポート無くなってるんじゃなかったか? 古いInstallShieldのインストーラが起動しないとかどっかで見た気がする
245 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:23:24 ] まぁさすがにWin16はもういいだろ・・・
246 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:24:42 ] 最近のソフトでも、インストーラーが16bitのがあるのがむかつく。 しかも64bit版でそんなインストーラ使うアホなとこもあるw
247 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:32:33 ] .NET Frameworkなんか糞だろ 開発する側のメリットしか考えてない使い手無視のAPI 互換性だけでWin32APIを残しているあたりも糞OS
248 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:43:59 ] PEの出だしって16bitじゃなかったか?
249 名前:デフォルトの名無しさん [2009/03/08(日) 15:52:50 ] Windowsの灰色ってRGBで言うところの(255,255,255)いくつなんでしょうか? SetTextColor(hdc, RGB(0, 0, 0); SetBkColor(hdc、RGB(???)); 背景はダイアログボックスの灰色です これでいろいろ試してみたんですけど なぜか背景色が合わないんです どうしたらダイアログボックスと文字の背景色を合わせられるでしょうか?
250 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:53:29 ] PEは32/64bitだろ 因みに16bitはNEと呼ばれてた LEとかLXとかっていう16/32bitハイブリッドなのもあってこれは9x時代のドライバにも使われてた
251 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:55:43 ] >>249 hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
252 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:59:24 ] >>250 すまん 言い方が悪かった OSが16bitだった場合実行される16bit命令が出だしにあったんじゃないかと
253 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:00:45 ] int型だぁ〜(><;)わからないよ〜
254 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:04:12 ] >>249 ::SetTextColor( hDC, ::GetSysColor( COLOR_BTNTEXT)); ::SetBkColor( hDC, ::GetSysColor( COLOR_3DFACE));
255 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:04:58 ] >>251 さん SetBkColor(hdc、COLORREF ) hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); を COLORREF形式にするにはどうすればいいんでしょうか?
256 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:05:56 ] >>254 ありがとうございます できましたm(_;)m
257 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:05:58 ] >>249 設定とかによって変わってくるから決めうちはいかんよ。
258 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:17:53 ] ほんと決め打ちは勘弁して欲しい 配色を黒基調にしてると文字が見えなくなるとかw
259 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:46:50 ] __ \|/ | ┌─┼─?|─┬──┐ 三 |入 ,> .└-、 三 = <、 ヽ、 ,-‐-、 三 /.| ,> .┌-、 "''-( ( ̄〇 └─┼───┴──┘ "''''""" ヽ,,,,ソ _|_ ////
260 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:52:59 ] 大抵SetBkMode(TRANSPARENT)するから SetBkColor()はあんまり使わんかも
261 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:56:45 ] >>248 出だしつーかファイルの一番先頭は「このプログラムはDOSじゃ動かねーよ」って表示するだけの16bitコードだな。 極限までバイナリサイズ縮める遊びとかでたまに書き直してた。
262 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:00:21 ] >>261 ちゃんとしたプログラムに差し替えも可能だな。
263 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:31:27 ] 誰ですか、スタブをjxw,exeにした人はw
264 名前:デフォルトの名無しさん [2009/03/08(日) 20:49:27 ] VC++2005 でサウンド入出力プログラムを作っています. SDK,低レベルAPIを使っています. 入力,出力共にマルチバッファリングを行っているのですが, 入力と再生の間に,バッファ数に従う遅延が生じてしまいます. 体感では,(1バッファに録音する秒数 * 用意したバッファ数)秒 の遅延が生じていると思われます. リアルタイムに近い動作を実現したいため, 1バッファに録音する秒数(RecSEC)を短くしています. 現在の設定では RecSEC = 0.005 [sec/buffer] です. バッファ数が少ないと音声がブツブツと途切れてしまいますが, バッファ数を増やす事で解決しました. これで遅延量が少ない動作が実現できたと思っていたのですが, RecSEC = 0.1 として実行してみたところ,約0.1[sec]の遅延を期待していたのですが 約(0.1*バッファ数)[sec] という大きな遅延となってしまいました. ソースコードをアップしましたので,解決方法をご教授願います. waveInStart の実行位置を変えてみる等色々とやってみましたが よくわかりませんでした. pass: sagehoge ttp://www2.uploda.org/uporg2074476.txt.html よろしくお願いします.
265 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:21:12 ] 延滞が気になるASIOを使え
266 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:28:17 ] whOut[k].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; whOut[k].dwLoops = 1; 関係ないと思うけど↑が気になった 両方とも0でよくね?
267 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:44:58 ] >>264 Vista以降ならCoreAudioで扱えばいい。 他にもDirectSoundでバッファ読みまくりとか。 ソースは見るまでもないが、きっとやり方間違っているよ。 あらゆる方法を試した事のある俺が言うんだから間違いない。
268 名前:264 mailto:sage [2009/03/08(日) 21:50:58 ] >>265 ありがとうございます. ですが,低レベルAPIで書きたいです. >>266 ループ再生は不要なので,確かに両方とも0ですね. >>267 XPで書いています.DirectXにも挑戦しようか悩みましたが, 低レベルAPIで片付けてみたいのです. お暇な時にでもソースを見ていただけたら.
269 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:55:49 ] APIレベルではどうしようとも遅延が200〜500msあるんだが、それを理解した上でやっているのか?
270 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:56:58 ] >>264 ここよりサウンドプログラムスレの方が良いアドバイスもらえるんじゃないか
271 名前:264 mailto:sage [2009/03/08(日) 22:07:46 ] >>269 数値がどの程度かは知りませんでしたが それくらいの遅延は覚悟しておりました. しかし現状ではアルゴリズムの問題で遅延が生じてしまっているため それを解消したいのです. >>270 スレ検索が足りなかったようです. サウンドプログラミングのスレを見つけましたので, そちらでお聞きする事にします. 皆さん,ありがとうございました.
272 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:20:37 ] >>231 互換性を切り捨てられるなら君の言うとおりだ。>後の方が洗練
273 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 05:32:19 ] 互換性が切り捨てられるなら新しいOSが出る毎にコードを書き直さないといけないだろ そんなのが洗練されてるとか、馬鹿?
274 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 07:24:18 ] ↑話を分かっていないバカ
275 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 07:27:49 ] >>274 お前がな
276 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 07:34:07 ] >>274 荒らすなよ。
277 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 09:56:49 ] ここは荒らしていいスレじゃなかったっけ
278 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 10:33:57 ] 落書きだらけの壁に「落書き禁止」の紙が貼ってあるようなもんだ。
279 名前:デフォルトの名無しさん [2009/03/09(月) 12:42:44 ] 荒らしていいスレ(笑)
280 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:31:20 ] >>278 「落書き禁止」なんて貼ってないよ 「自由の板です、どうぞ」の紙が貼られている板
281 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:40:56 ] 以下のコードでnewでメモリ確保すると大丈夫なのにスタックにメモリ確保するとエラーになります。 どこがまずいのでしょうか?なんとなくスタックの概念を根本的に間違っているような気がします。 //----大丈夫---------------------------- #include<windows.h> #include<gdiplus.h> #pragma comment(lib,"Gdiplus.lib") #include<cstdio> void main() { Gdiplus::GdiplusStartupInput gdiplusStartupInput1; ULONG_PTR gdiToken; Gdiplus::GdiplusStartup(&gdiToken,&gdiplusStartupInput1,NULL); Gdiplus::Bitmap*pBitmap1=new Gdiplus::Bitmap(TEXT("C:\\WINDOWS\\winnt.bmp")); printf("%d\n",pBitmap1->GetWidth()); delete pBitmap1; Gdiplus::GdiplusShutdown(gdiToken); } //----エラー---------------------------- #include<windows.h> #include<gdiplus.h> #pragma comment(lib,"Gdiplus.lib") #include<cstdio> void main() { Gdiplus::GdiplusStartupInput gdiplusStartupInput1; ULONG_PTR gdiToken; Gdiplus::GdiplusStartup(&gdiToken,&gdiplusStartupInput1,NULL); Gdiplus::Bitmap bitmap1(TEXT("C:\\WINDOWS\\winnt.bmp")); printf("%d\n",bitmap1.GetWidth()); Gdiplus::GdiplusShutdown(gdiToken); }
282 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:45:43 ] >>281 使ってるクラスの内容は知らんが、 上だとビットマップ削除後Shutdown呼んでるが 下だとShutdown呼んだ後ビットマップ削除してる 辺りが原因なのでは?
283 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:46:53 ] スタックうんぬんというより、クラスのインスタンス生成の概念がわかってないんじゃない?
284 名前:281 mailto:sage [2009/03/09(月) 22:02:47 ] >>282 レスありがとうございます。 おっしゃるとおりでした。 main()を抜ける時にBitmapのデストラクタが実行されてすでに開放された領域を読もうとしていたようです。 >>282 レスありがとうございます。 クラスのインスタンス生成の概念がわかってないっぽいです。 自分のやり方だと確保する領域が固定だと Gdiplus::Bitmap bitmap1(TEXT("C:\\WINDOWS\\winnt.bmp")); という風にスタックに確保するのですが、 他の人は Gdiplus::Bitmap*pBitmap1=new Gdiplus::Bitmap(TEXT("C:\\WINDOWS\\winnt.bmp")); という風に確保する領域が固定でもnewで確保しているようです。 なぜそうするかは理解できません。
285 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:07:53 ] newを使いたくないなら無理やり↓みたいにスコープ作ればよいのでは。 { Gdiplus::Bitmap bitmap1(TEXT("C:\\WINDOWS\\winnt.bmp")); printf("%d\n",bitmap1.GetWidth()); }
286 名前:281 mailto:sage [2009/03/09(月) 22:22:46 ] >>285 レスありがとうございます。 デストラクタのタイミングを制御する必要がある時意外でも、 たとえば、デストラクタのタイミングを制御する必要がなく、いっけんnewを使う必要が無いような時も 自分のやり方だと Gdiplus::Graphics graphics1(hdc1); という風にスタックに確保する場面で 他の人は Gdiplus::Graphics*pGraphics1=new Gdiplus::Graphics(hdc1); という風にnewで確保しているようです。 この理由がわかりません。