Win32API質問箱 Build43
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/05/19(金) 11:25:09やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
0232デフォルトの名無しさん
2006/05/25(木) 21:14:070233デフォルトの名無しさん
2006/05/25(木) 21:21:42ハードウェア毎に違うんじゃないの?
ドライバ直接叩くとかしないと
0234デフォルトの名無しさん
2006/05/25(木) 21:24:07ありがとうございます。
一応思ってたことはできました。
>>231
CRTを使いたくないからです。
0235LCD派
2006/05/25(木) 21:29:580236デフォルトの名無しさん
2006/05/25(木) 21:34:36”ファイルを開く”ダイアログがあったから、ディレクトリもあるかと
思ったんですが、見つからないのでよろしくお願いします。
0237デフォルトの名無しさん
2006/05/25(木) 21:34:540238デフォルトの名無しさん
2006/05/25(木) 21:43:380239デフォルトの名無しさん
2006/05/25(木) 21:44:320240デフォルトの名無しさん
2006/05/25(木) 21:45:020241デフォルトの名無しさん
2006/05/25(木) 21:54:460242デフォルトの名無しさん
2006/05/25(木) 21:58:010243デフォルトの名無しさん
2006/05/25(木) 21:59:00インライン展開されるはずだし
0244デフォルトの名無しさん
2006/05/25(木) 21:59:43その場にインラインで展開されると思うけど。
0245デフォルトの名無しさん
2006/05/25(木) 22:07:000246デフォルトの名無しさん
2006/05/25(木) 22:12:31ZeroMemory って書いておけば、コードにも crt 由来の行はないし、
出てくるオブジェクトにも存在しなくなる。
それはともかくとして、memset とか memcpy は AMD のサイトに有る
プリフェッチ使って最適化した奴使うのが良いと漏れは思うな。
入れ替えるだけで僅かながら高速化されるからラク。
0247デフォルトの名無しさん
2006/05/25(木) 22:13:16ファイルと違って難ずくわからん。でもサンクス。
0248デフォルトの名無しさん
2006/05/25(木) 23:47:15ドライバ書くのはたぶん無理です…
0249デフォルトの名無しさん
2006/05/25(木) 23:55:330250デフォルトの名無しさん
2006/05/26(金) 00:16:44出来るとすればここから情報を拾うこととか。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/bluetooth/bluetooth/bluetooth_start_page.asp
0251デフォルトの名無しさん
2006/05/26(金) 01:23:31んで、結局Sockにたどり着くんじゃなかった?
0252デフォルトの名無しさん
2006/05/26(金) 02:04:38ですので、windows.hがかってにtchar.hをインクルードしているものだとばかり思っていました。
それで先日久しぶりにコンソールのプログラムを作ろうと思いました。
そしたらTCHARやTEXTマクロはないといわれました。
_tcharや_Tマクロはありましたけど・・・
もしかしてTCHARやTEXTマクロはウィンドウズアプリケーション固有のものなのでしょうか?
0253デフォルトの名無しさん
2006/05/26(金) 03:27:380254デフォルトの名無しさん
2006/05/26(金) 03:39:10マジレス: Cランタイムライブラリ
ネタレス: 栃木放送
好きなほうを選べ
0255デフォルトの名無しさん
2006/05/26(金) 03:45:21GetModuleHandle って、プログラムの仮想空間に配置されている
モジュールのベースアドレスを返すわけだよね?
これの例が毎回成功するってことはKernel32 って、
どのプログラムでも同じアドレスに配置されるの?
それとも根本的におれの考え方間違ってる?
0256デフォルトの名無しさん
2006/05/26(金) 03:56:540257デフォルトの名無しさん
2006/05/26(金) 04:03:13LVS_EDITLABELSのあるリストビューで二列目のデータを変えたりしたいのですが
0258デフォルトの名無しさん
2006/05/26(金) 04:19:14とりあえず
ttp://www.kab-studio.biz/Programing/Codian/MxA/09.html
で「LPTSTRとLPCTSTR」のところを読んだらいいと思う
0259デフォルトの名無しさん
2006/05/26(金) 06:00:40ググってみると
ttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/
ってリンクが色んなところから張られているんですが、
今この先には、Server 2003 SP1 Platform SDKしかないようです。
Download Centerで「core platform sdk」と検索しても
ヒットしないですし、公開終了してしまったのでしょうか・・・。
getaddrinfoを使おうと思ってWinsock2のヘッダをインクルードしても
見つからないよって言われてしまい、仕方なくMSDNに載っていた
関数の宣言をそのままコピペして使ってみたのですが、
危険な呼び出しだとか言われてしまい途方に暮れています。
公開終了してしまっているなら、
winsock2.hかws2tcpip.hにあるgetaddrinfoの宣言を
どなたかコピペしていただけませんか・・・?
0260デフォルトの名無しさん
2006/05/26(金) 06:05:37これのどこがPlatform SDKじゃないんだよ。
0261デフォルトの名無しさん
2006/05/26(金) 06:24:31ありがとうございます。
え、Win98とかに対応していないみたいだから違うのかと思ったんですが、
これでよかったんですか。
Serverとか思いっきり書いてあるので、なんか入れたらアプリが
NT系専用になってしまいそうで、不安で・・・。
getaddrinfoの宣言にWINAPIつけたら問題なく動くようになってしまったので、
とりあえずこのまま行こうと思います。
自己解決すみません。
0262デフォルトの名無しさん
2006/05/26(金) 06:38:270263デフォルトの名無しさん
2006/05/26(金) 07:08:58Platform SDKに書かれているWindowsのバージョンは対応している一番新しいものを表す。
古いWindowsのプログラムを書くのには使えないということは決してない。
流石にWin16は無理だけど。
0264デフォルトの名無しさん
2006/05/26(金) 07:31:300265デフォルトの名無しさん
2006/05/26(金) 08:00:30断り書きがあるわけだしな
0266デフォルトの名無しさん
2006/05/26(金) 08:01:01新しいのだと、
WTLやATLでコンパイルエラーが出たりするんだよね。
0267デフォルトの名無しさん
2006/05/26(金) 09:27:55MicrosoftR Windows Server 2003 R2 Platform SDK - March 2006 Edition
も出てるよ
0268257
2006/05/26(金) 13:14:10ですので
リストビューのセルの上でクリックしたときにエディットコントロールを表示し
そこに入力した値をそのセルの値にしようと考えました。
それで下記のものが作りかけのソースです。
static HWND hList, hEdit;
LVHITTESTINFO HitTest;
case NM_CLICK:
GetCursorPos(&HitTest.pt);
ScreenToClient(hList, &HitTest.pt);
ListView_SubItemHitTest(hList, &HitTest);//押したセルを取得
lvColumn.mask = LVCF_WIDTH;
SendMessage(hList,LVM_GETCOLUMN,HitTest.iSubItem,(LPARAM)&lvColumn);//列の幅を得るため(高さはどうやって取得するの?)
lvItem.iSubItem = HitTest.iSubItem;
lvItem.iItem = HitTest.iItem;
lvItem.mask = LVIF_TEXT;
SendMessage(hList, LVM_GETITEM, 0, (LPARAM)&lvItem);//選択したセルの文字列取得
SetWindowText(hEdit, lvItem.pszText);//取得した文字列をhEditに格納←一列目はちゃんと文字列が表示されるのに二列目はなぜか文字化けする
MoveWindow(hEdit, わかんない, わかんない, lvColumn.cx, わかんない);//選択したセルの上にhEditを被せる
SetFocus(hEdit);//hEditにフォーカス移動←これをしたらなぜか文字列がかわらない
break;
見てもらったら最初に目に付くと思われるMoveWindowの「わかんない」ですが
これは選択したセルの左上の座標がわからないのと、セルの高さが取得の仕方がわからないということです。
だれかこのソースにこうしたらいいと思うと指摘してもらえないでしょうか?
根本的に間違っているところがあるならそれも指摘お願いします。
0269デフォルトの名無しさん
2006/05/26(金) 13:20:02exeのベースアドレスをkernel32.dllと同じにし、再配置情報を付けなかった場合、下記のエラーが発生する。
>app.exe - システム DLL の無効な再配置
>システム DLL kernel32.dll がメモリ内で再配置されました。アプリケーションは正常に動作しません。
>再配置が起きたのは、DLL app.exe が、Windows システム DLL のために予約されているアドレス範囲を
>使用していたためです。この DLL のベンダに連絡して、新しい DLL を入手してください。
しかし64bitプロセスと32bitプロセスでは、ベースアドレスや関数アドレスも違いそうだ
0270デフォルトの名無しさん
2006/05/26(金) 13:23:12LVM_GETSUBITEMRECT
0272デフォルトの名無しさん
2006/05/26(金) 15:08:16そういうことをするには、
SendDlgItemMessageのWM_GETFONTでフォントを取得。
フォントサイズを変える。
SendDlgItemMessageのWM_SETFONTで新しいフォントを入力。
ということをしないといけないのでしょうか?
0273デフォルトの名無しさん
2006/05/26(金) 15:13:050274デフォルトの名無しさん
2006/05/26(金) 15:22:01もっといい方法があったら楽なのに・・・
0275デフォルトの名無しさん
2006/05/26(金) 15:57:330276デフォルトの名無しさん
2006/05/26(金) 17:01:11どうもありがとう。
レスの内容で検索したらいい記事が見つかった。
http://japan.internet.com/developer/20050830/26.html#appendixes
0277268
2006/05/26(金) 18:09:14自分でエディットコントロール用意する必要ない?
0278277
2006/05/26(金) 18:54:42これを見てそう思ったんだけどそんなことを言ってるのかな?
自分にはこのソースわかんないッス!!
0279名前が欲しい名無しさん
2006/05/26(金) 21:11:53winsock2のWSASocketにてWSA_FLAG_OVERLAPPEDを指定したいのですが、当方VB6につき自前で値を指定しなければなりません。
Googleで検索したのですが見つからず、とうとう根負けしてしまいました。
ご存知の方、もしくは調べるヒントなどお持ちの方がいらっしゃいましたら教えて頂けませんでしょうか?
何卒宜しくお願いします。
板違いでしたら申し訳有りません。
0280デフォルトの名無しさん
2006/05/26(金) 21:20:20調べ方としては、Platform SDKをインストールしてヘッダ見るのが確実かな。
あとは、Googleで"define WSA_FLAG_OVERLAPPED"みたいに
defineを付けて""で括って検索してみるとか。
0281名前が欲しい名無しさん
2006/05/26(金) 21:25:53""で括る・・・でしたか;
""無しでは検索かけてみたのですが。。。
Platform SDKという物も早速見てみたいと思います。
有難う御座いました!
0282デフォルトの名無しさん
2006/05/26(金) 22:25:040283デフォルトの名無しさん
2006/05/27(土) 07:06:02後はTEBとPEBですね・・・Webには断片的な情報しかないみたいです。
0284デフォルトの名無しさん
2006/05/27(土) 12:56:18http://www.kumei.ne.jp/c_lang/sdk/sdk_36.htm
自作のウィンドウプロシージャを作って、元々のウィンドウプロシージャと入れ替えるって事?
元々のウィンドウプロシージャに機能を追加する事はできないのですか?
0285デフォルトの名無しさん
2006/05/27(土) 13:02:470286デフォルトの名無しさん
2006/05/27(土) 13:03:570287デフォルトの名無しさん
2006/05/27(土) 13:11:18なんで、わざわざ別のウィンドウプロシージャを定義して入れ替えたりしてるんだろう、と思いまして、、
0288デフォルトの名無しさん
2006/05/27(土) 13:20:52元をどうにかすることができないから、サブクラス化で後付するんだ。
0289デフォルトの名無しさん
2006/05/27(土) 13:28:360290デフォルトの名無しさん
2006/05/27(土) 13:31:020291デフォルトの名無しさん
2006/05/27(土) 19:36:36それで受け取るbufサイズを出来るだけで抑えたいのですが
調べた限りGetWindowTextLengthと同等の動きをするメッセージが見当たりません。
これはもしかして最大サイズのbufを用意するしかないのでしょうか?
0292デフォルトの名無しさん
2006/05/27(土) 21:17:230293デフォルトの名無しさん
2006/05/27(土) 21:53:050294291
2006/05/27(土) 22:24:55LVM_GETITEMTEXTのマクロ、ListView_GetItemTextは
void ListView_GetItemText(
HWND hwnd, //リストビューのウィンドウハンドル
int iItem, //行
int iSubItem, //列
LPTSTR pszText, //バッファのアドレス
int cchTextMax //バッファのサイズ
);
ですよね。
つまりpszTextに指定するバッファを
自分で用意しなくてはいけない。
cchTextMaxの文字数も自分で指定しなくてはいけない。
ということではないのでしょうか?
ですので前もってバッファを用意するためには文字数を取得しなくてはいけないですよね?
どっかまちがってるのかな・・・
0295デフォルトの名無しさん
2006/05/27(土) 22:34:01pszTextが指すバッファをオーバーして書き込まないように最大文字数を指定してね、ということ。
入りきらない場合は切り詰められる。
文字数を取得する方法は無い(と思う)ので、十分な大きさのバッファを用意するか
全部取得できるまでバッファを拡張しつつループするようにする。
MFCやWTLでは後者の方法を採っている。
0296291
2006/05/27(土) 22:34:31ということは十分なバッファとサイズを指定しなくてはいけない!
そういうことだと思ったのですが・・・
0297デフォルトの名無しさん
2006/05/27(土) 22:38:56その為のバッファ長なんだから。
0298デフォルトの名無しさん
2006/05/27(土) 22:44:37ということは下記のような同じ処理を何回もするということですよね?
1.GlobalAllocで領域確保
↓
2.LVM_GETITEMTEXTで文字列取得
↓
3.領域が足りなかったら領域を開放をして1に戻ってやり直し
↓
4.取得した文字列をどっかに表示して領域の開放
という処理をするのですよね?
そういうことをしたら遅くなりませんかね?
つまりこういうことですか?
最初にこれぐらいあったら充分だろと思える領域を確保!
それから1をする・・・のかな?
0299デフォルトの名無しさん
2006/05/27(土) 22:47:350300デフォルトの名無しさん
2006/05/27(土) 22:50:09>it returns the number of characters in the pszText member of the LVITEM structure.
俺は英語苦手なんで合ってるか分からないが、あくまで取得できた文字数を返すと書かれてるように思える
0301デフォルトの名無しさん
2006/05/27(土) 22:52:36GlobalAllocを使う理由がわからんが、そういうこと。
文字列長によるが、バッファ長を2倍2倍していけばそんなに回数かからないと思う。
0302デフォルトの名無しさん
2006/05/27(土) 22:53:12OCXの登録ができなくなりますが、
それはなぜでしょうか?
OCX
void FuncA()
{
FuncB();
}
DLL
void FuncB()
{
FuncC();
}
DLL
void FuncC()
{
}
0303デフォルトの名無しさん
2006/05/27(土) 23:06:19WINAPIって領域を確保するのにmallocではなく、
GlobalAllocを使わないといけないのではないの?
それとC++ではないのでnewを使えないからというつもりだったのですが・・・
もしかしてまたなんか間違えたかなかな?
0304デフォルトの名無しさん
2006/05/27(土) 23:19:26今はGlobalAlloc/LocalAllocよりもHeapAllocのほうが推奨されている。
また、mallocやnewだって使いたければ好きに使ってよい。
0305デフォルトの名無しさん
2006/05/27(土) 23:21:03>The global functions are slower than other memory management functions and do not provide as many features.
>Therefore, new applications should use the heap functions.
>However, the global functions are still used with DDE, the clipboard functions, and OLE data objects.
0306デフォルトの名無しさん
2006/05/27(土) 23:30:26http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_globalalloc.htm
> 注意 グローバル関数は他のメモリ管理関数より低速で、提供する機能も多くありません。
> そのため、新しいアプリケーションは「heap functions」(ヒープ関数)を使うべきです。
> しかし、DDE 関数とクリップボード関数では、依然としてグローバル関数が使われています。
0307デフォルトの名無しさん
2006/05/27(土) 23:44:53逆に重要なのを消しちゃったりするから困る
まぁその部分については問題ないが
0308デフォルトの名無しさん
2006/05/27(土) 23:45:56読めなないならこれを機会に英語を勉強してもらおうと思った。
日本語版MSDNは不完全で訳がイマイチだし。
0309デフォルトの名無しさん
2006/05/27(土) 23:53:48>>305の文章読んだことありました!
翻訳サイトでちょっと読んだだけだったので
「依然としてグローバル関数・・・」のところを見て
まぁいいかぐらいにしか思ってませんでした。
DDE 関数とクリップボード関数ではだったのですか・・・
0310デフォルトの名無しさん
2006/05/28(日) 02:19:00ダイアログを表示さし、入力終えてOK押すとダイアログは消え
別に用意しておいたウィンドウにスイッチしてそのウィンドウに
結果を表示させたいのですが
まず、最初にウィンドウクラスでバックグラウンドをNULLで塗って
その登録したやつを、クリエイトウィンドウでつくってその真上に
ダイアログを表示させて......
この最初の時点でつまづいてます。
ふつうにウィンドウのメニューからダイアログを表示させる事は
できるのですが.....
オーナーウィンドウがクリエイトをメッセージした時
リソースからダイアログのハンドルを作って
ShowWindowして、描画したいオーナーウィンドウを
ダイアログがデストロイした時にオーナーをShowWindow
すれば良いのか、もうわかんなくなってしまって。
くずたれで、質問内容も中途半端なのは承知してます。
ただ、何かヒントを頂けないでしょうか。お願いします。
0311デフォルトの名無しさん
2006/05/28(日) 02:42:46>クリエイトをメッセージした
意味不明
0312デフォルトの名無しさん
2006/05/28(日) 04:01:320313デフォルトの名無しさん
2006/05/28(日) 09:57:24�@.OK押したら消えるダイアログを作成しる。
�A.ウィンドウの上に、�@を表示し動作を確認する。
�B.ウィンドウの上に、�@を�A回連続で表示するように改造してみる。
作成途中に気付くと思うが。
0314sage
2006/05/28(日) 13:02:360315デフォルトの名無しさん
2006/05/28(日) 13:21:070316デフォルトの名無しさん
2006/05/28(日) 15:39:54にてHeapAllocの説明を読んだのですが、
GlobalAllocはHeapAlloc 系だと書いていました。
>>305の文章とこの文章ではなにかがおかしく感じるのですが
とくに「グローバル関数よりヒープ関数を使ったほうがいい」ってとこでが・・・
0317デフォルトの名無しさん
2006/05/28(日) 15:57:16わかりました
とにかく一個ずつの処理を追って確認していきます。
一気に作ろうと思った、俺の頭がどうかしてました。
0318デフォルトの名無しさん
2006/05/28(日) 16:36:36Win32/64ではGlobalAllocは内部でHeapAllocを呼び出すという実装になっている。
だから直接HeapAlloc呼べばいいだろということ。
0319デフォルトの名無しさん
2006/05/28(日) 17:12:11つまり無駄な処理はなくそうってことですね!
0320デフォルトの名無しさん
2006/05/28(日) 17:18:140321デフォルトの名無しさん
2006/05/28(日) 19:13:14LPCTSTRじゃなくてLPCSTRなんだが
GetProcAddress(hDLL,_T(
0322デフォルトの名無しさん
2006/05/28(日) 19:14:28GetProcAddressって2番目の引数が
LPCTSTRじゃなくてLPCSTRなんだが
GetProcAddress(hDLL,_T("HogeHoge"));
じゃなくて
GetProcAddress(hDLL,"HogeHoge");
で呼べってこと?
0323デフォルトの名無しさん
2006/05/28(日) 19:39:320324デフォルトの名無しさん
2006/05/28(日) 19:58:130325322
2006/05/28(日) 20:04:390326デフォルトの名無しさん
2006/05/28(日) 20:13:240327デフォルトの名無しさん
2006/05/28(日) 20:20:49W版自体が無いから、自分で文字コード変換する。
0328322
2006/05/28(日) 20:24:13がんばる。
0329デフォルトの名無しさん
2006/05/28(日) 22:17:23とか考えてる自分は間違っているのでしょうか?
0330デフォルトの名無しさん
2006/05/28(日) 22:27:190331デフォルトの名無しさん
2006/05/28(日) 22:43:59結局9x系とNT系でバイナリ2つ用意しないといけないのが面倒
■ このスレッドは過去ログ倉庫に格納されています