1 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:39:56 ] スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。 やさしいお兄さんやお姉さんたちが答えてくれるかも。 過去スレ、関連リンクは>>2-5 くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
101 名前:90=92=93=97=100 mailto:sage [2007/11/14(水) 23:44:52 ] >>98 ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en ↑ これには ”Date Published: 5/2/2005 ”とあるようです。 このSDKはあんまり薦められないってことですか? 今回はこれでないと動かない代物だったので仕方ないですが 必要なければ使わないほうが良いのでしょうか?
102 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:46:11 ] タスクトレイのアイコン上でマウスホイールで操作したときに処理をすることを 考えているんですが、タスクトレイのアイコン上でマウスホイールを操作しても、 WM_MOUSEWHEELがとんできません。 WM_MOUSEWHEELをフックしても、タスクトレイのどのアイコン上なのか 識別する方法がわかりません。 NOTIFYICONDATAのhWndとかuIDを判別する方法ありませんか?
103 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:46:54 ] 今ならWindowsSDKだけで十分なような気も
104 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:49:38 ] >>102 状況がよくわからんけど・・・ タスクトレイから通知が来たときのLPARAMを見てみる
105 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:52:04 ] あ、違うか どのアイコンか判定したかったらShell_NotifyIconのAPIフックからしないと駄目な気が 通知メッセージはユーザー定義だからフックできんし WM_MOUSEWHEELは普通にタスクトレイが受け取ってるはず
106 名前:102 mailto:sage [2007/11/15(木) 00:13:14 ] >>105 レスどうもです。 えとですね。 自分のアプリで登録しているアイコンなんですよ。 タスクトレイのアイコン上で操作したときに、 例えば左クリックならばWM_LBUTTONDOWNは来るんですが、 マウスホイール操作のWM_MOUSEWHEELは来ないんです。 なので、WM_MOUSEWHEELをフックして処理しようかと思ったのですが、 自分のアプリで登録しているタスクトレイのアイコン上であるかどうかの 判別ってどうするんだ?と困っているところなのです。
107 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:24:41 ] >>101 そのページに書いてあるでしょ >This SDK does not support working with Microsoft Visual C/C++®, 6.0 as support for VC 6.0 has ended. >The last SDK that will work with VC 6.0 is the February 2003 Edition, you can order a CD on the fulfillment site. 2003年2月版でもXPSP1ぐらいまではサポートしてるので普通に使う分には困らないと思う
108 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 04:44:07 ] >>81 NT系ならFATでも使える。まだ9xサポートしてるのか?
109 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 06:19:56 ] >>95 知らなかった。ちょっと楽になる。サンクスですわ
110 名前:デフォルトの名無しさん [2007/11/15(木) 06:46:39 ] zipの圧縮、解凍をサポートするapi関数ってある? Jpegの伸縮のように、外部ライブラリ入れないとダメかな
111 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 08:09:45 ] なんでXPでzipfldr.dllなんてDLLが追加されたか考えれば分かるだろう
112 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 08:16:37 ] スレ違いだけど.NETならGZipStreamクラスある
113 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 08:49:12 ] zip圧縮解凍ライブラリなんてネット上に腐るほどあるだろ zipfldrを呼び出す方が遥かに面倒だと思うが
114 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:05:12 ] COM使ったことあれば、そう面倒でもないと思うが・・・まぁ人それぞれか
115 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 11:24:13 ] zipfldr.dllのCOMインターフェイスって公開されてたっけ? IShellFolder::GetUIObjectOfでIDropTargetを取得してD&Dをエミュレートして・・・とか考えたけど結構面倒な気が 他に方法あったらおせーて
116 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 11:56:30 ] rundll32.exe zipfldr.dll,RouteTheCall %zipfile% これか?ためしてないけど
117 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:05:42 ] CLSIDFromString("CompressedFolder",&clsid); CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IStorage,(LPVOID*)&pStorage); pStorage->QueryInterface<IPersistFile>(&pPersistFile); pPersistFile->Load("zipファイル名",STGM_READWRITE|STGM_SHARE_EXCLUSIVE); てな感じ、足りないとこは脳内補完よろ あとはIStorageとIStreamの操作で中身読める。 書き込みは試したことないけど・・・、たぶん似たような手順でいけるとおもふ
118 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:10:27 ] それって rundll32.exe unzip32.dll,UnZipCommandLine "%1" と同レベルな気が
119 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:12:31 ] リロードしてなかった >>118 は>>116 へのレス >CLSIDFromString("CompressedFolder",&clsid); これって将来的に大丈夫なのかな? そんなモン気にするなってツッコミは無しで
120 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:21:32 ] 質問です。 SetWindowsHookEx でグローバルフック登録しているのですが、runas 等で別のユーザで起動したウィンドウへのメッセージがフックできないようです。 普通の (同じユーザ) ウィンドウへのメッセージはフックできています。 何か方法はありますか?
121 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:23:56 ] 別ユーザのウィンドウがフック出来たらセキュリティホール以外の何物でもないだろう ImpersonateLoggedOnUserとか使えばどうにかなるかも知れんが
122 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 12:27:09 ] 自分も昇格する
123 名前:120 mailto:sage [2007/11/15(木) 13:06:13 ] >>121 そういわれればそうですねぇ。 まあ、今回のは特殊用途なので権限は気にしなくていいのですが・・・ ImpersonateLoggedOnUser 知らなかったので調べます。
124 名前:110 [2007/11/15(木) 15:11:57 ] c++は使えないから、comとか無しで頼む 普通にapi関数を一本呼び出し(ループでも)で使えないの?
125 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:14:11 ] 無理だっつうの
126 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:15:27 ] もう自分でdeflate書け
127 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:18:37 ] >>124 例えCでもCOMは使えるぞ いったい何を言ってるんだ?
128 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:20:07 ] >>124 unzip32使え 嫌なら.net使え いずれにせよスレ違いだからもう来なくていいよ
129 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:20:30 ] (124は)CでCOMが使えない
130 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:25:45 ] 124では無いがCでCOMなんて面倒すぎるだろ 第1引数省略できねーしスマートポインタ使えねーしlpVtblとか一々書いてられるか
131 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:28:31 ] で、だから何?
132 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:30:40 ] 124みたいな奴がCでCOMなんかに手を出すとリークしまくりの糞プログラムにしかならんだろうという事だ
133 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 15:35:16 ] なるほど
134 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:58:01 ] >>110 一般公開されていないよ、MSのZIP解凍/圧縮は。 APIもCOMも。
135 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:04:43 ] このスレでいいのかどうか悩んだんですが 『Advenced Windows』を読む上で、Win32APIやOSの知識は前提になっているのでしょうか? C/C++は一通りやったけどWindowsプログラムは未経験という段階の人間が、 >>1 にある言葉を借りると「APIフックなど高度な事」が最終目標だという場合、 先に『プログラミングWindwos』などを読んでおくべきなのかどうかと思いまして。
136 名前:デフォルトの名無しさん [2007/11/16(金) 00:27:30 ] www.kumei.ne.jp/c_lang/sdk4/sdk_346.htm 上記のプログラムでCreateWindowExにてウィンドウスタイルを WS_OVERLAPPEDWINDOW としているのを WS_POPUP に置き換えるとウインドウが表示されなくなってしまうのですがどうしてでしょうか? 枠線が消えるのはわかりますが、表示されていたはずのピットマップまで消えてしまうので 納得できませんでした。 よろしくお願いします。
137 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:31:11 ] 基礎的なAPIの知識は必要。 最終的にAdvenced Windowsを買う「べき」なのは間違いないと思うけど入門には向かない。 4倍ぐらいの量と金額のEffectiveC++ or STLを入門として買うようなもの。 個人的には APIで学ぶWindows徹底理解 ちゅうのが激しくオススメ
138 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:31:46 ] どこでエラーが出てるか調べろ
139 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:33:44 ] 沢山のソースコードを読むほうがためになると思う。
140 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:53:01 ] >>139 に同意
141 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:07:23 ] >>137-139 アンカーつけて喋れw
142 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:18:33 ] はい
143 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:42:04 ] いいえ
144 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:47:24 ] はいえ
145 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:14:27 ] ないあるよ
146 名前:135 mailto:sage [2007/11/16(金) 02:17:40 ] >>137 分かりやすい解説、ありがとうございました。 おすすめいただいた書籍、目次見てたらおもしろそうなので、 是非目を通してみたいと思います。
147 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 05:04:23 ] >>136 CW_USEDEFAULTはWS_OVERLAPPEDでないと効果がない。 WS_POPUPだと単にサイズゼロのウィンドウが画面外に作成されてしまう
148 名前:デフォルトの名無しさん [2007/11/16(金) 11:22:25 ] TextOutで表示させる文字のフォントを変更したいのですが、 どのようにすればいいのでしょうか?
149 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 11:35:57 ] SelectObject
150 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 11:58:39 ] もっといえばCreateFont→SelectObject
151 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:04:38 ] スレ違いの場合は誘導をお願いします。 今、生DVDにデータを書き込むプログラムを作っています。理想は、時系列で増え続けるデータを direct recordingすることです。 ところがまず、Windows 2003 DDK添付のspti.cでWRITE DATA BUFFER operationがエラーコード2で 失敗する所ではまっています。 そもそも生DVDに対しては、spti.cでは書き込みは行えないのでしょうか?
152 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 13:33:13 ] _beginthreadex関数で、void*型の引数で文字列を渡したいんですけど _beginthreadex(NULL, 0, mythread, (void*)str, 0, (unsigned int*)&thID); でスレッド作成をして、スレッド内で char buf[256]; strcpy(buf, str); としていますが、上手く引数を受け取れません。 表示させてみると「フフフ…」となります。 strの部分を&strとしたり、色々試してみたのですが上手くいきません。 おとなしくグローバル変数で値を渡したほうがよいのでしょうか…。
153 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 13:41:33 ] 呼び出している側の領域が、相手のスレッドが動作する前に消失しているんだろ。 馬鹿がよくやる。
154 名前:デフォルトの名無しさん [2007/11/16(金) 16:55:25 ] よくわからないけど、とりあえずはキャストしないといけないんじゃない?
155 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:28:39 ] >>152 複数作成したりどうしてもグローバル変数使いたくないなら 動的に確保してやればいい ローカル変数のアドレスを渡すなんて問題外
156 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:43:29 ] プログラミングに慣れてないならスレッドなんかに手を出すのはやめとけよ ネット上のサンプルでも排他制御やアトミックオペレーションしてない、いい加減なソースが多いしな
157 名前:136 mailto:sage [2007/11/16(金) 20:11:06 ] >>147 また一つ賢くなれました。 ありがとうございました。
158 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 08:31:31 ] 助けて下さい。 次の物を作らなければなりません。 hp.jpdo.com/cc009/1/img/1718.jpg 図形は、単純なのですが、作り方が分かりません・・・ アドバイス・参考文献 宜しくお願いします。 出来れば優しい神降臨求む
159 名前:158 mailto:sage [2007/11/17(土) 08:39:59 ] i-bbs.sijex.net/imageDisp.jsp?id=gtrgtr&file=1195256319996o.jpg 上の画像は、出ないのでコチラ?
160 名前:158 mailto:sage [2007/11/17(土) 08:46:25 ] 画像は、サンプルです。実際は単純な○△◇等です。 言語は、Vidual c++ 6.0以降 ダイヤログから出発、ボタンを押すと各図形を表示 宜しくお願いします
161 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 08:53:38 ] 何が分かっていて、何がわからないの? CあるいはC++はわかるならプログラミングWindowsでも読め。
162 名前:158 mailto:sage [2007/11/17(土) 09:16:18 ] ダイアログからダイアログの飛ばし方が分からないです。 とばすのに必要なのは? ダイアログでも図形は、書けるものなのか? それに必要なのは? とりあえずこの2点の知識お願いします。
163 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:30:39 ] >ダイアログからダイアログの飛ばし方が分からないです。 ダイアログを親ウィンドウにしてダイアログを生成する >とばすのに必要なのは? お前のプログラミング知識 >ダイアログでも図形は、書けるものなのか? 描ける (書けるって何だよ) >それに必要なのは? お前のプログラミング知識
164 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:44:40 ] 宿題か >ダイアログからダイアログの飛ばし方が分からないです。 >とばすのに必要なのは? DialogBox msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_dialogbox.asp これだとダイアログリソースが必要になる CreateWindowExでも書けると言えば書ける www.sm.rim.or.jp/~shishido/mdialog.html こちらは普通にウィンドウを作るのでリソースは必要ない >ダイアログでも図形は、書けるものなのか? >それに必要なのは? 例示された奴をとりあえず書けって言われたら BeginPaint、EndPaint、GetStockObject、FillRect、LineTo、MoveToEx、SetPixel辺りで書くかな 訳分からなければWin32 API入門の30章あたりまで読め
165 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 10:49:57 ] やさしいインタネッツだな
166 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:03:22 ] ダイアログにその画像貼っとけ
167 名前:158 mailto:sage [2007/11/17(土) 11:36:02 ] >>164 様 他 有難う御座います・・・ 読んだけど、分け分から無いです。 取りあえず”Win32 API入門”を買って読みます。 必死なので、また来ます。 それでは、宜しくお願いします。
168 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:36:50 ] つーかMFCだろスレ違い
169 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:43:41 ] >>167 Win32 API入門って「サイト名」なんだけどね >>168 少なくとも164に上がってんのはほぼ全部API
170 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:05:01 ] リソースとして埋め込んだビットマップを 普通にファイルからビットマップ読み込んだ時のように CreateDIBSectionする方法って無いでしょうか? リソースとして埋め込んだビットマップで アルファブレンド等をしたいのでピクセル列が欲しいんです、W98SEです
171 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:10:19 ] とりあえず、LoadImageにLR_CREATEDIBSECTION使っとけばいいんじゃね? 暇なら、FindResourceから始める、という手もあるけど。
172 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:29:05 ] 今時98SEかよ
173 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:30:55 ] >>171 どうもありがとう、両方試してみます
174 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:38:48 ] アクティブなウインドウのファイル名を取得するコードを書いてます。 ネットではぴったりのコードがなく、つなぎ合わせで なんとかこんな感じでまとめたのですが、よくわからない のもあって、うまく動きません。 環境はBCB WinXPです。 /* //ttp://m--takahashi.com/bbs/pastlog/11800/11731.html 1) GetWindowThreadProcessId() で HWND から ProcessID を得る 2) OpenProcess() で ProcessID から hProcess を得る 3) EnumProcessModules() で hProcess から hModule を得る 4) hProcess / hModule を使って GetModuleFileNameEx() でヤッター!! */ DWORD dwPID; DWORD dwProcessID = GetWindowThreadProcessId(GetForegroundWindow(), &dwPID); DWORD ProcessIDs[1000]; /* プロセスIDの一覧 */ HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessID); DWORD ReturnSize; /* プロセスID一覧の取得結果のサイズ */ EnumProcesses(dwProcessID, sizeof(dwProcessID), &ReturnSize);//この行は? if(handle) { HMODULE hMod; DWORD size; char fname[MAX_PATH]; EnumProcessModules(handle, &hMod, sizeof(hMod) ,&size); GetModuleFileNameEx(handle, hMod, fname, sizeof(fname)); CloseHandle(handle); ShowMessage(fname); }
175 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:45:03 ] GetWindowThreadProcessIdの返り値はスレッドID
176 名前:デフォルトの名無しさん [2007/11/17(土) 12:45:50 ] 途中で送信しちまった GetWindowThreadProcessIdの返り値はスレッドIDなのに OpenProcessにスレッドID渡してるぞハゲ
177 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:48:17 ] EnumProcessesの第一引数
178 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:49:33 ] そもそもEnumProcessesいらないだろこの場合 HWNDからProcessID取るって言ってんだから
179 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:59:47 ] なんかもうアレ
180 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 13:12:37 ] DWORD dwPID; DWORD dwProcessID = GetWindowThreadProcessId(GetForegroundWindow(), &dwPID); 噴いたwww
181 名前:デフォルトの名無しさん [2007/11/17(土) 14:47:18 ] wiodwsXP visual studio .net にてwindowアプリケーションを作っておりますが、 Heap corruption detected at 038A9008(最後の数字は毎回変わる) のような文章が「出力」の欄に出て警告もなしに勝手に終了します。 ググッた結果、どうやら領域確保あたりが怪しいらしく mallocやfree関数を調べましたが、おかしな点は見当たりませんでした。 他にどこらへんが怪しいと思いますか?
182 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 14:49:22 ] mallocやfree周辺
183 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:00:56 ] 使ってるOSがおかしいよ
184 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:06:36 ] ヒープオーバーランだろ
185 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:09:28 ] >>181 プログラムのどこかで、メモリの確保した範囲外に書き込みをして、ヒープを破壊しまったんだ プログラムのどの部分がどこに影響を与えるとかほとんど予測できないから、 問題が出なくなるまで怪しい場所をひとつずつコメントアウトして原因を絞っていくしかない
186 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:18:37 ] 初心者は文字列用のバッファが怪しい 終端NULLが良くオーバーランしてる
187 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:22:52 ] ヌル文字はNULと書くようにしようぜ
188 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:23:45 ] >>181 >>181 の頭が怪しい
189 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:20:32 ] APIスレに来てmallocとかfreeとか言ってるのが気に入らない HeapAlloc使えよ とかいう冗談はさておきWin32API関係ない。C初心者スレいってソースすべてうpすれば早く片付くかもね
190 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:34:58 ] >>185 ありがとう。めんどくさそうだけど頑張ります。 >>186 参考にしてみます。ありがとうございます。
191 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 17:17:43 ] >>171 のFindResource()のほうから調べながら試していたんですが (BITMAPFILEHEADER)LockResource() (BITMAPINFO)LockResource() とヘッダとインフォのメモリへのポインタを取得して インフォからCreateDIBSection()でHBITMAPを作成する所まではできたんですが DIBSectionのほうで使用するメモリに 読み込んだリソースの方のメモリをコピーする所で躓きました LockResource()でピクセル列の先頭ポインタを取得するために どういうキャストをすれば良いのかが分からないので困っています 思いつくことを試しながらCopyMemory()しましたがどれも強制終了してしまいます
192 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 17:38:41 ] windows XP VC++ 2003 SetWindowRgnでウィンドウスタイルが変わらないようにするには どうすればいいですか? SetWindowRgnしなければXPスタイルなのに、関数を呼ぶと コマンドプロンプトと同様のスタイル(クラシック?)になります ウィンドウはVC++2003のWin32プロジェクトで新規作成した 雛形そのままです
193 名前:デフォルトの名無しさん [2007/11/17(土) 18:11:14 ] ANSIビルドのプログラムで、ウィンドウ内に作成したエディットコントロールに ユーザーによって入力されたテキストを取得して、それをUNICODE形式のファイルに保存しようとしています。 処理の流れとして、エディットコントロール内のテキストの長さ(バイト単位)を取得して → 動的にメモリ確保 → WideChatToMultiByteでUNICODE文字列に変換 → WriteFile でファイルの先頭2バイトにBOMを書き込み → 変換後の文字列をWriteFile ファイルに書き込む こういう風にしています。 ただ、エディットコントロール内のテキストの長さを取得する段階でつまづいてしまって。。 なんだか、2バイト文字が正確に数えられていないようなんです。 エディットコントロール内のテキストが、「こんにちはwindows」のようになっていた場合。 この文字列「こんにちはwindows」のサイズ(バイト数)を正確に掴むためにはどうすればいいんでしょうか? ちなみにMFCはわかりません。
194 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 18:23:31 ] GetWindowTextLength(のA)でいけるぞ。 comctl32.dllバージョン6使っていたらUTF-16単位での文字数になるかもしれないが、 そのときには、そもそもNT系のはずで、W系APIを直接使って UNICODE文字列を取得してしまえばいい。
195 名前:193 [2007/11/17(土) 18:51:26 ] lstrlen()でも同じ症状になるんですが、 例えば ANSIビルド版のプログラムでは lstrlen(TEXT("hello") = 5 lstrlen(TEXT("こんにちは")) = 10 ですが UNICODE版では lstrlen(TEXT("hello") = 10 lstrlen(TEXT("こんにちは")) = 10 となります。 確認してみましたが、GetWindowTextLengthでも同じ結果でした。 バイト数は分かりますが、文字数が分からないに思うんですが・・ 確かにメモリ確保にはバイト数だけ分かればいいんですが、そもそもGetWindowTextLengthって文字列の長さ(=文字数) を取得する関数という認識で間違いないですよね? UNICODE版は、文字数とバイト数(文字数×2)に何の不思議も無いんですが ANSI版は、文字数とバイト数がバラバラというか。。 ダブルバイト文字とシングルバイト文字が一緒くたでわかりにくいというか・・
196 名前:193 [2007/11/17(土) 18:56:10 ] lstrlen(TEXT("hello") = 5 lstrlen(TEXT("こんにちは")) = 5 でした。 うぉー混乱する000 文字列を取得する関数って、 ANSI版だと、文字列のバイト数 UNICODE版だと、文字列の文字数 になってる??みたいですgあ・・
197 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:02:06 ] ユーザーが手入力するならたいした文字数じゃないだろうから、 単純にバイト数の倍確保しておけばいいんじゃね?
198 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:07:28 ] キーボードやマウスのボタンを押した時にはウインドウメッセージが出ますが、 ゲームパッドのボタンを押した時にはWMは出ているのでしょうか? 出ていればそのメッセージを教えて頂きたく思います。 60fpsのゲームループの中にゲームパッド情報取得の「〜->GetDeviceState〜」を書くと まれにエラーが出てしまうため、他の方法を模索しています。
199 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:10:23 ] >>198 あるわけない
200 名前:193 [2007/11/17(土) 19:18:51 ] >>197 うーん。そうなんだけどねぇ。 あとMultiByteToWideCharの最後の引数は文字数を指定しろってなってるから、 これが原因なのかどうか分からないけど、UNICODEファイルとして保存したとき 最後にゴミがつくんです。 一応メモリ確保はGlobalAlloc(GPTR, dwSize)とやってますんで、0で初期化されてるはずなんだけど。。 どこがおかしいのかが分からないという。。。
201 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:58:33 ] >>191 FindResourceの方は半ば冗談だったのだけどな…… LockResourceで先頭のアドレスが取れるのだから、後はそれを手繰っていくだけ。 中身は通常のビットマップのファイルとほとんど一緒。 ただし、BITMAPFILEHEADER部分が省かれているので、その点には注意。