Win32API 質問箱 Build5
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGやさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。
前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0792デフォルトの名無しさん
NGNGはい いいえのプログラヌを造りたいのですが
______
↑
之の名前がわかりません
0793デフォルトの名無しさん
NGNGそうですか。
0794デフォルトの名無しさん
NGNGガッカリだ!
0795デフォルトの名無しさん
NGNG0796デフォルトの名無しさん
NGNG0797711
NGNG子プロセスで recv しようとしたら
10093 WSANOTINITIALISED WinSockシステムが初期化されていない。
って怒られたので、WSAStartup() を追加した。
すると今度は
10038 WSAENOTSOCK 指定されたソケットが無効である。
って出るし・・・
訳わからんです(ToT)
結局、
ちゃんと SOCKET が継承されていないんだろうなぁ(´ヘ`;)ハァ
今日は帰って、頭冷やして明日やりますです。
レス下さった方、ありがとうございましたm(__)m
ではでは
0798デフォルトの名無しさん
NGNGMB_YESNO
0799771
NGNG自己レス
訂正 711→771(汗
0800デフォルトの名無しさん
NGNGべつにCreateProcessしなくても逝けるぞ
メニューの動作をエミュレート(WM_COMMAND送信)するとか、
手作業の段階をWM_KEYDOWNとかkeybd_eventとかで再現するとか。
0801デフォルトの名無しさん
NGNG0802デフォルトの名無しさん
NGNG普通に動くが。
cl -DADDR=0 -DPORT=12345 a.c -Feserver.exe wsock32.lib
cl -DADDR=0x7f000001 -DPORT=12345 a.c -Feclient.exe wsock32.lib
cl a.c -Fechild.exe wsock32.lib
#include <winsock.h>
int main(int ac, char **av) {
SOCKET s, c; char buf[128]; struct sockaddr_in sin;
PROCESS_INFORMATION pi; STARTUPINFO si = {sizeof si};
WSADATA data; WSAStartup(MAKEWORD(1, 1), &data);
#ifdef PORT
s = socket(PF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET; sin.sin_port = PORT;
sin.sin_addr.s_addr = htonl(ADDR);
#if !ADDR
bind(s, (struct sockaddr *)&sin, sizeof sin);
listen(s, 1);
c = accept(s, NULL, NULL);
recv(c, buf, 4, 0); printf("server: %.4s\n", buf);
sprintf(buf, "child %d", c);
CreateProcess(NULL, buf, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
#else /* ADDR */
connect(s, (struct sockaddr *)&sin, sizeof sin);
send(s, "0123456789", 10, 0);
#endif /* ADDR */
#else /* !PORT */
recv((SOCKET)atoi(av[1]), buf, 6, 0); printf("child: %.6s\n", buf);
#endif /* !PORT */
closesocket(s); return 0;
}
0803デフォルトの名無しさん
NGNGUINT uScanCode = MapVirtualKey( VK_INSERT, 0 );
GetKeyNameText( uScanCode << 16, keyname, sizeof(keyname)-1 );
とすると Ins ではなく Num 0 が得られ VK_NUMPAD0 との区別ができないのです。
他に VK_PRIOR, VK_NEXT, VK_END, VK_HOME, VK_LEFT,
VK_UP, VK_RIGHT, VK_DOWN, VK_DELETE などもうまくかないようです。
0804デフォルトの名無しさん
NGNGif(vk == VK_APPS ||
vk == VK_PRIOR || vk == VK_NEXT ||
vk == VK_END || vk == VK_HOME ||
vk == VK_LEFT || vk == VK_UP || vk == VK_RIGHT || vk == VK_DOWN ||
vk == VK_INSERT || vk == VK_DELETE ||
vk == VK_NUMLOCK) ext = 1 << 24;
GetKeyNameText((uScanCode << 16) | ext, keyname, sizeof(keyname)-1);
0805デフォルトの名無しさん
NGNGどうもありがとうございます。
0806デフォルトの名無しさん
NGNGTryEnterCriticalSection を使おうと思ったのですが、
そんな関数ないよって言われてしまいます。
MSDN を見ると winbase.h で宣言されていて kernel32.lib に入っているようなのですが、
windows.h をインクルードしていてもそんな関数ないと言われ、
シグネチャだけ書いてごまかしてコンパイルしても
リンク時にちゃんと kernel32.lib を引き渡していても
CCriticalSection.obj : error LNK2001: 外部シンボル ""int __cdecl TryEnterCriticalSe
ction(struct _RTL_CRITICAL_SECTION *)" (?TryEnterCriticalSection@@YAHPAU_RTL_CRI
TICAL_SECTION@@@Z)" は未解決です
math.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と言われてしまいます。
どうしてでしょうか?
0807デフォルトの名無しさん
NGNGWindows 95/98:サポートされていません。
ヘッダー:winbase.h 内で宣言
インポートライブラリ:kernel32.lib を使用
NT系であることを明示しろ。
リンクエラーはextern "C"
0808デフォルトの名無しさん
NGNGありがとうございます。
#define _WIN32_WINNT 0x0500
で逝けました。
0809質問
NGNGWin98SEでVc6sp5を利用して
画像の印刷プログラムを書いています。
プリンタを示すDCにStretchDIBitsで
300*400程度のイメージを書き込むことには成功するのですが。
色々問題が発生します。
1 デジカメで撮影した1600*1600くらいの画像を貼り付けると失敗して表示されない。
2 そこそこのサイズを2枚はると失敗して何も表示されない。
3 困ったことにエラーが帰ってこない。
そこでプリンタDCを使わないでスクリーンから生成したメタファイルを
使って同じようにDIBを貼り付けてみたところ。
同じ症状になりました。
なにか解決方法はあるのでしょうか?
0810デフォルトの名無しさん
NGNG貼り付けようとしてるDIBは正しいか?
(ファイルに保存してペイントとかで開けるか?)
StretchDIBitsでディプレイに表示することができるか?
SetStretchBltModeでHALFTONEとか指定してないか?
あと、JPEGとかPNGを書き込もうとしてるけど、
ドライバが対応してない(あるいはバグがある)とか?
0811画像分割は避けたい。
NGNGStretchDIBitsで画面表示も印刷も出来ます。
BltModeは無指定です。
データはBI_RGBのDIBで、Jpegではありません。
小さな画像なら印刷も画面表示も成功します。
ただ
300万画素程度のデジカメで撮影したデータをA4一杯に広げて印刷を
かけると失敗します。
自己レスみたいですが
画像印刷について方々を調べて廻ると、
1 印刷はStretchDIBitsを使わないと失敗する。
2 24bit無圧縮のDIBを使う事、DDBは印刷できない。
3 大きなBitmapは分割して転送する。
とあります。
多分今回の問題は転送するデータが巨大?だった為でしょう。
しかし これはあくまでプリンタードライバーを経由する
問題の為であり、印刷時に限って起こる問題と思います。
メタファイルを画面のDCから取得する場合は
その制限を受けないものと考えられますが、
実際は同じ症状になります。
うーん困った。
画像分割は処理がめんどくさすぎる。
第一成功するかどうかわからん。
0812デフォルトの名無しさん
NGNGそのプリンタでは
GetDeviceCapsでRASTERCAPSを取ったとき、
RC_STRETCHDIBがないとか(w
0813デフォルトの名無しさん
NGNG719,722辺りに書かれている症状と少し似てるね。
0814デフォルトの名無しさん
NGNG0815デフォルトの名無しさん
NGNGZオーダーのこと?
それとも、単なる座標のこと?
まぁ、どちらにしてもSetWindowPosを使う
0816
NGNG症状は同じですね。
小さな画像は正常に動作し、大きな画像は真っ白になるが
APIは全て正常値を戻す。
こちらも原因調査中です。
新たにわかったことは
1 1024*1024以上のBitmap?の転送は失敗しやすい。
2 16BitのAPIを通過する処理はリソース制限を非常に受けやすい
現在画像分割処理で調査中・・あぁー面倒だぁ。
これで失敗したら手詰まりだぁ。
0817デフォルトの名無しさん
NGNG>>816
症状の切り分けとして、
単に巨大な画像を送るとコケやすいのか
拡大して、巨大にするとコケやすいのか
を判別してみたら?
SetDIBitsToDeviceとかで、等倍でデカいのを送ってみるとか
0818817
NGNG単なるミスです。他意はありません。
0819デフォルトの名無しさん
NGNGWM_GETTEXTなどはいくらSendMessageしても届いてないようです(Spy++で確認)
よろ
0820デフォルトの名無しさん
NGNGは昔の時代にはそのまま通った気がする。
いまはNTの時代だからプロセス境界を真っ当に超える
フック+共有メモリ(FileMappingによる)あたりが妥当か。
0821デフォルトの名無しさん
NGNG0822819
NGNGども。
共有メモリを作ってそこに吐き出させようとしているのですが
メッセージ自体が届きません。
フックとおっしゃってますから、メッセージでテキストを吐かせるというアプローチ自体がちがうと言うことかな?
フックって具体的に何をフックしますか?
いろいろ聞いてスマソ
>821
COMを全く理解してない物で・・
0823デフォルトの名無しさん
NGNG0824デフォルトの名無しさん
NGNGそれは、「他のアプリケーション」のコードに
手を出せることが条件では?
「他人のアプリケーション」でも有効なのか?
0826819
NGNGその可能性も疑ったのですがSpy++で確認したところ
ターゲットに送っているハズです。
ちなみに時プロセス内に用意したエディットには正しく処理されます。
ウインドを選んでメッセージを投げる部分はプログラムになっているので
手で打ち間違えたとかそう言う可能性はなさげです
0827デフォルトの名無しさん
NGNG0828821
NGNG結論から言うと、NT4では可能(Advanced Windowsのターゲット)。ならば、2000やXP
でも可能ではなかろうか?
ミソは、user32内で、WM_GETTEXTLENGTHを最初に呼び出し、共用メモリーにその長さ
を割り当て、次にWM_GETTEXTを実行する(アプリケーション側はWM_GETTEXTLENGTH
呼ぶ必要はない)。ということろを考えると、823の予測が正しいと思われ。
そもそも、自プロセス内のHWNDしか取れないAPIを呼び出して、それを利用している
という可能性は?
0829デフォルトの名無しさん
NGNG> WM_GETTEXTなどはいくらSendMessageしても届いてないようです
WM_GETTEXTは他のプロセスでも取得できますが?
0830デフォルトの名無しさん
NGNG猫でもわかるプログラミングで紹介されてるけど、そのとおりにやってもうまくいきません。
あと、ラジオボタンのどの項目がチェックされてるかを調べるのにはどうすれば?
0831819
NGNG10回に1回くらいはWM_GETTEXTが4バイトのテキストをコピーしてくれます
でもそれらをローカルにReadProcessMemoryすると内容は'00'でした。
0832あ
NGNGもうちょっと詳しく書いたら?
うまくいかないならどう上手くいかないのかを
書くのが礼儀と思うんだが。
0833画像印刷、分割失敗
NGNG>>813
>>816
StretchDIBの処理を改良して
巨大Bitmapを100*100に分割して転送するように処理を修正しました。
結果
20枚?程転送すると急に何も転送しなくなり(APIはエラーを戻さない)
(つまり虫食いの画像が出来上がる。)
さらに転送するとhDCの他のデータも全て消えてしまいます。
(先に書き込んだ部分も含めて)
書き込み先のコンテキストはメタファイル、PrinterDC共に失敗でした。
考察
bitmapの転送はサイズが巨大でも、書き込む回数が多くてもダメと言うことです。
お願い!!
もうメタファイルは諦めるしかないかも。
頼むーー誰かヒントをください
0834デフォルトの名無しさん
NGNGhttp://www.kumei.ne.jp/c_lang/sdk/sdk_31.htm
↑ここの
Button_SetCheck(GetDlgItem(hWnd, IDC_RED), BST_CHECKED);
これで、IDC_REDがオンにセットされます。 関数では
((void)SendMessage((hwndCtl), BM_SETCHECK, (WPARAM)(int)(check), 0L));
となります。(check)のところにBST_CHECKEDまたは、BST_UNCHECKEDがきます。 これに対して、ボタンの状態を取得するには、
Button_GetCheck(hwndCtl);
関数では、
((int)(DWORD)SendMessage((hwndCtl), BM_GETCHECK, 0L, 0L));
の部分を自分のプログラムに実装したんですが、
Button_SetCheckとButton_GetCheckは定義されてないとかコンパイラ言われるし、
SendMessage使ったらコンパイルはできるけど、起動したら使ってない時と変わらないです。
助けてください
0835デフォルトの名無しさん
NGNG> でもそれらをローカルにReadProcessMemoryすると内容は'00'でした。
WM_GETTEXTは他のプロセスでも直接取得できますが?
ReadProcessMemoryは何のために?
0836デフォルトの名無しさん
NGNG> Button_SetCheckとButton_GetCheck
#include <windowsx.h>
> SendMessage使ったらコンパイルはできるけど、
> 起動したら使ってない時と変わらないです。
目的のラジオボタンのウィンドウハンドルは
間違いなく取得できてるの?
実際にはSendMessageをどのようにソースに記述したの?
0837819
NGNGホントだ・・。どうもありがとうございます。
実はゴールはエディットではなくて試しにエディットを使ってただけなので
もうしばらくReadProcessMemoryなどの使い方をチェックしてみます。
(たぶんこの方法でもうまくいくはずだしこれで動かせないと困る……)
0838デフォルトの名無しさん
NGNGBOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg) {
case WM_INITDIALOG:
((void)SendMessage(hDlg, BM_SETCHECK, (WPARAM)(int)BST_CHECKED, 0L));
break;
以下省略
0839デフォルトの名無しさん
NGNG右上のバッテン押したら終了するようにするにはどうすればいいですか?
0840836
NGNGダイアログウィンドウに送信してどうすんのよ?
というか上に書いた回答をもっとよく読め。
SendMessage(GetDlgItem(hDlg, コントロールID),
BM_SETCHECK, BST_CHECKED, 0);
または
SendDlgItemMessage(hDlg, コントロールID,
BM_SETCHECK, BST_CHECKED, 0);
または
CheckDlgButton(hDlg, コントロールID, BST_CHECKED);
0841836
NGNGラジオボタンの場合、初期化時以外は
CheckRadioButtonをおすすめする。
0842デフォルトの名無しさん
NGNGモーダルかモードレスかで答えが変わってくる。
つーか出来てないということはモードレスかな?
0843デフォルトの名無しさん
NGNG教えてください
0844デフォルトの名無しさん
NGNGだからモーダルとモードレスどっちなのよ?
0845デフォルトの名無しさん
NGNGモードレスです
0846デフォルトの名無しさん
NGNGWM_COMMANDで かつ LOWORD(wParam)がIDCANCELのメッセージか、
または WM_CLOSEメッセージを
捕まえて DestroyWindowすべし。
WM_COMMANDで処理したいなら、WM_CLOSEメッセージにはFALSEを返すべし。
0847デフォルトの名無しさん
NGNG詳細キボンヌ
0848デフォルトの名無しさん
NGNGそれくらい、includeディレクトリの中見て自分で調べろよ。全部大文字ってことは
マクロだから、見りゃわかるだろ。
0850デフォルトの名無しさん
NGNG逆切れかっこ悪い。それぐらい自分で調べられないなら、あきらめろ。
0851あ
NGNGおまえこそ知らない人に
ものを教えてもらう立場にあるというのに
なんだその口の利き方は?
まぁいい。マジレスしてやる。
>847
>848と同じだがincludeディレクトリの中身見ればわかる。
というより右クリック定義うんたらで飛べるはず。
もし、即ヘッダ見るということを思いつかないなら
まだAPIは早い。
Cでもやってるべし。
0852デフォルトの名無しさん
NGNGDWORD a;
WORD b = ( WORD ) a ;
WORD c = ( WORD )( a & 0xFFFF ) ;
LOWORDの define は c ですね。
で、何でわざわざ c のような変換をするのか分かりません。
bより c のような変換の方が安全(?)とかそういうのがあるんでしょか?
0853デフォルトの名無しさん
NGNGchar ch = -1;
WORD c = LOWORD(ch);
とやった場合であっても、c = 0xff となって欲しい。
もし、WORD b = (WORD)ch; と展開すると、b = 0xffff となる。
からじゃないかな?
識者の突っ込みキボーン。
0854デフォルトの名無しさん
NGNGWIN32環境ならばどちらでも変わらない(別に0xFFFFを付ける必要はない)
けど、仮にWORDが16ビットより大きいサイズの処理系が
あったとすれば、そこでは 0xFFFFが大きな意味を持つ。
ちなみに俺のVC++5.0はヘッダファイルが古いからか
#define LOWORD(l) ((WORD)(l))
と定義されてるよ。
>>853
どちらの場合も結果は 0xFFFFですが。
0856852
NGNGどうもです。
>仮にWORDが16ビットより大きいサイズの処理系があったとすれば
ということで納得です。
0857デフォルトの名無しさん
NGNG4バイト……
……ポインタのサイズ?
0858デフォルトの名無しさん
NGNGWordってどういう意味がある変数型なの?
あと、Doubleが付くことで意味が違ってるの?
0859デフォルトの名無しさん
NGNGASCII文字1文字分
=1バイト=8bit
DWORD
ASCII文字2文字分
=2バイト=16bit
0860デフォルトの名無しさん
NGNGWORD
ASCII文字2文字分
=2バイト=16bit
DWORD
WORD2個分
=4バイト=32bit
0861デフォルトの名無しさん
NGNGそれじゃ Character だよ。
WORD は、もともとはプロセサが普通に処理できるデータの大きさ。
C 言語言うところの int と同じ概念。
MS が使いだしたのが、8086〜80286 の頃だったので、16bit になって
今日に至る。DWORD はその倍のビット幅 (=32bit)
0862デフォルトの名無しさん
NGNGプッ
0863デフォルトの名無しさん
NGNGWORD =16bit(2byte)
DWORD=32bit(4byte)
QWORD=64bit(8byte)
が慣例だね。
> WORD は、もともとはプロセサが普通に処理できるデータの大きさ。
のようにCPUにより異なるから注意しよう!
ってここアセンブラのスレだったっけ?
0864デフォルトの名無しさん
NGNGプッ、そんなんでアセンブラしてるつもりになってるよ
0865デフォルトの名無しさん
NGNG正しくは、定義により異なる。
0866デフォルトの名無しさん
NGNGぷぷっ
0867デフォルトの名無しさん
NGNGsagesage
0868デフォルトの名無しさん
NGNGHSPでいうredraw 0とredraw 1のような感じのAPIってありませんか?
0869デフォルトの名無しさん
NGNGCreateCompatibleBitmap
etc...
0870868
NGNGそれならそれでオッケーでス。ありがとうさようなら。
もう会うことは余り無いでしょう。
0871デフォルトの名無しさん
NGNGマーフィーの法則 第23条の18より
0872デフォルトの名無しさん
NGNG0873デフォルトの名無しさん
NGNGむしろ>871のは文章じゃなくて文なわけだが
0875デフォルトの名無しさん
NGNGウケタ
0876デフォルトの名無しさん
NGNG「〜やつほど〜やつが多い」は明らかに変だが。
0877デフォルトの名無しさん
NGNGアセンブリ:アセンブリ言語。言語名。
アセンブル:アセンブリ言語を機械語コードに直すこと。
・・・と思う。
0878デフォルトの名無しさん
NGNG> アセンブラー:アセンブルするひと。
ふつーは処理系の方を指す。nasm とか gas とか。
0879デフォルトの名無しさん
NGNG0880デフォルトの名無しさん
NGNGアセンブリ言語を機械語コードに直すソフトのことだよね?
昔、「ブリをブラでブルする」と覚えた気が・・・。
0881デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1016991911/l50
0882デフォルトの名無しさん
NGNG0883デフォルトの名無しさん
NGNGSetClassLongでもまあできないこともない。
0884デフォルトの名無しさん
NGNGコンパイラはBCC5.5.1です
0885デフォルトの名無しさん
NGNG0886デフォルトの名無しさん
NGNG0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNGところで追加質問になってしまうんですけど
printfとかで64bitの整数を文字列にする事ってできないんですか?
%dだとintサイズだし、色々調べてllとか付けて見てもNGでした
0889デフォルトの名無しさん
NGNG> printfとかで64bitの整数を文字列にする事ってできないんですか?
使ってるライブラリによる。Borland は知らんが VC の MSVCRT.DLL だと
プリフィクス I64 だね。
0890デフォルトの名無しさん
NGNGヘルプによると "%Ld" らしい。
0891デフォルトの名無しさん
NGNG試しに
lpstrDefExt = "txt\0htm\0ini\0doc\0";
みたいな感じでやってみましたが駄目でした。
フックを使って lpstrDefExt を変更するという手も考えたのですが、
フックを使うとプレースバーが表示されなくなってしまうようです。
どなたかおねがいします。
0892デフォルトの名無しさん
NGNG古い OPENFILENAME の代わりに、FlagsEx が追加された新しい OPENFILENAME を使えばいいんじゃないかな(推測)。 #if (_WIN32_WINNT >= 0x0500) で囲まれてるやつ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxstructures/openfilename.asp
■ このスレッドは過去ログ倉庫に格納されています