トップページ⇒tech
1001コメント311KB

Win32API 質問箱 Build5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限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
0243デフォルトの名無しさんNGNG
で見当はずれだったら自分の伝達能力を棚に上げてまた暴れるんだろーなー
0244DELLNGNG
>243
必死だな(藁
0245デフォルトの名無しさんNGNG
>>242
うわああああ
dumpbinも知らん
mlも使えない
スーパーDQNだぁぁぁぁ

HNのとおりデリられるべき香具師だな
0246デフォルトの名無しさんNGNG
GetDIBitsとSetDIBitsの第一引数で指定する
HDCについて教えてください。

hDC = GetDC( hWnd );
hDCMem = CreateCompatibleDC( hDC );
hBmp = CreateCompatibleBitmap( hDC, 64, 64 );
SelectObject( hDCMem, (HGDIOBJ)hBmp );

上のコードの後に、
GetDIBits( hDC, hBmp, … );
としても、
GetDIBits( hDCMem, hBmp, … );
としてもうまく動きます。これはどういうことなのでしょう?
HDCならなんでもいいのでしょうか?
(ちなみに、NULLだとうまく動きませんでした)
0247デフォルトの名無しさんNGNG
>>246
どういうことも何も、
hDCMemはCreateCompatibleDCで作ったんだから、
hDCと互換性があるに決まってる。

試したことないけど、
やっぱ、プリンタのHDCとか使ったら駄目じゃない?
0248246NGNG
>>247
動作に互換性があるのはわかるのですが、
>SelectObject( hDCMem, (HGDIOBJ)hBmp );
としているわけですから、
GetDIBits( hDC, hBmp, … );
でうまくいくのが不思議に思いまして。

GetDIBItsやSetDIBitsの場合、デバイスコンテキストに
設定した値(SelectObjectで指定したオブジェクトなど)は
全く影響なしということでいいのでしょうか?
0249247NGNG
>>248
http://www.microsoft.com/japan/msdn/library/ja/jpgdi/html/_win32_getdibits.asp
によると、
「hbmp パラメータが示すビットマップが
デバイスコンテキストで選択されている場合、
この関数を呼び出さないでください」とあるんだが。

疑問の解消にはならないかも知れないが、
そういうことはしてはいけないらしい(逃
0250デフォルトの名無しさんNGNG
>>246さーん
CreateDIBSection() と同じで、DIB_RGB_COLORS である限りは HDC は
まったく参照されないんじゃなかったっけ? (HDC は NULL でいい)
0251デフォルトの名無しさんNGNG
すみません教えてください。
リストボックスに、文字を追加して行きたいと思い下記のようなコードを打ちました

SendDlgItemMessage( hWnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)Buff );

たしかに、文字はリストボックスに追加されたのですが、どんどん追加していくと
スクロールバーができ、入力している文字がリストボックスから見えない位置に
いってしまいます。
最後に出力した文字が、常に見える状態にするにはどうすればよいのでしょうか?
MFCだと、SetCurSel( m_ctl.GetCount()-1 );
でいいみたいなんですが、apiだとどうして良いのか、分かりません・・


0252デフォルトの名無しさんNGNG
>>251
そこまでわかっているならGoogleで
SendDlgItemMessage SetCurSel
で見つかる予感 ->
ttp://n76cd-01p05.ppp11.odn.ad.jp/old/a6050.html

これでいいんじゃないでしょうか。
0253デフォルトの名無しさんNGNG
VisualC++6 Pro SP5でCreateJobObjectがつかいたいのだけど
error C2065: 'CreateJobObject' : 定義されていない識別子です。
っていわれちゃう。
なんでだよヽ(`Д´)ノウワァァァァン

#include <windows.h>
#include <winbase.h>
#pragma comment(lib,"kernel32.lib")


int main(int argc, char* argv[])
{
        HANDLE hJob = (HANDLE)CreateJobObject(NULL, "testjob");


        return 0;
}
0254デフォルトの名無しさんNGNG
>>253
CreateJobObject は Windows 2000 以降の API だけど、
ちゃんとそれに対応した新しい Platform SDK 使ってるかね。
0255デフォルトの名無しさんNGNG
>>253

ヘルプに
>対応情報
> Windows NT: バージョン 5.0 以降を使います。
って書いてあるよね。

実行環境のWindowsのバージョンに依存するときは、
_WIN32_WINDOWSや_WIN32_WINNTというマクロが必要だよ。
↑
をヘルプで引いてごらん。


#define _WIN32_WINNT 0x0500
とか、
>Visual C++ 6.0: To specify compiler options,
>go to the Projects menu and click Settings,
>then select the C/C++ tab.
とか、することになってるよね。
0256デフォルトの名無しさんNGNG
>>249
>「hbmp パラメータが示すビットマップが
>デバイスコンテキストで選択されている場合、
>この関数を呼び出さないでください」とあるんだが。

あ、本当だ。見落としてました。(^^;

>>250
>CreateDIBSection() と同じで、DIB_RGB_COLORS である限りは HDC は
>まったく参照されないんじゃなかったっけ? (HDC は NULL でいい)

なるほど、HDCはパレットの情報を得るのに使っているんですね。
調べてみると、SetDIBitsのところにも、NULLでいいと書いてありました。
ところが、実際にNULLを指定すると、なぜかエラー(戻り値=0)が
返ってきます。他のパラメータが間違っているのかな???

GetDIBits・SetDIBitsの前後を調べてみることにします。
とりあえず、ありがとうございました。>>247 >>249 >>250
0257デフォルトの名無しさんNGNG
>>250
よく読め
>>246はNULLだとダメだったとちゃんと言ってるぞ
GDI関数で第一引数にHDCを取るものは
どのドライバを呼び出すか決めるためにHDCを使うんだから
この場合ディスプレイドライバが作ったHDCならなんでもいいけど
NULLはダメ
0258256NGNG
訂正:
>調べてみると、SetDIBitsのところにも、NULLでいいと書いてありました。

正確には、「無視されます」とあり、
「NULLでもいい」と書かれてあったわけではありませんでした。
失礼。
0259デフォルトの名無しさんNGNG
今までMFCを使っていました。
Win32APIだけで組めばプログラムのファイルサイズがかなり小さくなると
思ったのですが、実際にダイアログリソースを表示するだけの簡単なプログラムを
作ってみるとMFCで共通DLLを使ったものよりも大きくなってしまいました。
 MFC(共通DLL使用)→28KB
 Win32API→44KB
こんな具合です。
もうちょっと(せめてMFC版よりも)サイズを小さくするにはどうしたらよいのでしょうか?
0260デフォルトの名無しさんNGNG
>>259
必要な処理をDLLに持っていって本体はWinMain()のみにする。
0261デフォルトの名無しさんNGNG
MSVCRT.DLLを使うようにする。
0262デフォルトの名無しさんNGNG
>>259
サイズの比較になってねーぞ
 MFC(共通DLL使用)→28KB + sizeof MFC42.DLL
0263デフォルトの名無しさんNGNG

#include "stdafx.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
keybd_event(VK_SNAPSHOT,0,0,0);
return 0;
}
昨日も聞いたんだけどサー,これでデスクトップのショットが取れないのはなぜ?
アクティブウィンドウしか取れない. alt 押してないのに.
証拠画面もうぷするか?
0264デフォルトの名無しさんNGNG
>>263
そんなことせんでもGetDC(0)したのをBitBltすれば良かろう。

つぅか誰にそのキーイベント送ってるのさ?
0265デフォルトの名無しさんNGNG
>>259
upx --best --crp-ms=100000 filename
とかどうよ?
0266デフォルトの名無しさんNGNG
>そんなことせんでもGetDC(0)したのをBitBltすれば良かろう

その通りなんですけど,キーコードがちゃんと送れてないのがげせない.
>誰にそのキーイベント送ってるのさ
OSにです.ペイントで貼り付けると一部しか取れてないんです.
そのときのアクティブだけってことは
 alt + Pscrn が送られてることになる.
げせねぇ
0267 NGNG
>>266
keybd_eventのヘルプの下の方は読んだか?
0268デフォルトの名無しさんNGNG
>>262
そんなこと言い出したらwin32apiだけだってdll使うっつーの
0269 NGNG
>>268
アフォですか? 比較するならmsvcrt.dllを使ったものと
比較すべきと言っているんだろ。
0270デフォルトの名無しさんNGNG
>>263
keybd_event(VK_SNAPSHOT,1,0,0);
keybd_event(VK_SNAPSHOT,1KEYEVENT_KEYUP,0);
0271270NGNG
2行目の1の後に,が抜けた。
0272デフォルトの名無しさんNGNG
LIBCTINY.LIBを使ってる人いる?
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/hood0101.asp

簡単にサイズを小さくできるっていうライブラリ。
0273keybd_eventNGNG
了解

おさわがせしました
0274251NGNG
>>252さん
解決しました、ありがとう御座います。
0275サービスしてねNGNG
管理ツールでサービスの開始停止をしてるけど、これってプログラム上ではどうしればよいのですか?
レジストリの項目でServiceってのがあったので値を見てみたのですが特に変わってなかったです。
0276デフォルトの名無しさんNGNG
>>275
OpenSCManager, OpenService, ControlService, QueryServiceStatus
あたり。
0277サービスしてねNGNG
>>276
Hit’sです!ありがとうございます!
0278デフォルトの名無しさんNGNG
>>259
アセンブラで書け
8kBぐらいにはなるだろ
0279デフォルトの名無しさんNGNG
>>272の方がmsvcrt.dll使うより小さいしアセンブラよりずっと簡単。
なんせリンクするだけだから。
楽して小さくするならLIBCTINY。これ常識。
0280デフォルトの名無しさんNGNG
なんでそんなにサイズを気にするんだろ。
FDにぎっしりつめるつもりなのかしら。
0281デフォルトの名無しさんNGNG
>>280
高サイズはウイルスにとって致命傷ですから。
0282デフォルトの名無しさんNGNG
>>281
そっちか(^_^;)
0283デフォルトの名無しさんNGNG
PmenuH = LoadMenu((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), "IDR_PopMenu");

でメニューハンドルの取得に失敗するんですが理由がわかりません。
どなたか教えてください。
0284デフォルトの名無しさんNGNG
>>279
MFC使うより小さくなるんか?
0285デフォルトの名無しさんNGNG
>>283
MAKEINTRESOURCE(IDR_PopMenu)でやってみたら?
0286デフォルトの名無しさんNGNG
RegDeleteKey関数で
サブキーを持つキーを一度で削除しようとしたところ
できませんでした。
ヘルプを見るとNT/2000では
サブキーを持つきーを指定することはできないと書いてありました。

2000でサブキーごとキーを削除するには
どうすればいいでしょうか?
サブキーを検索していってひとつずつ
削除するのが賢いやり方ですか?
それとも他に代用できる関数があるのでしょうか?
よろしくお願いします。
0287デフォルトの名無しさんNGNG
>>284
もちろんモノによるが、なる。
0288初心者です!NGNG
 WINDOWS2000を使ってるのですが、DOSでアセンブラ言語を実行しようとするとずっと実行中になってしまい処理が終わりません。きちんとリンクまではできてるはずなのですが・・・
時々コマンドを実行しようとすると、VDDの形式が無効ですってエラーメッセージが出るのですがなんか関係あるのでしょうか?
原因がまったくわかりません!誰か教えてください!
0289デフォルトの名無しさんNGNG
>>286
>サブキーを検索していってひとつずつ
>削除するのが賢いやり方ですか?
いや、愚かなやり方です。
毎回そんなことを考えずに済むように
しておくのが賢いやり方です。
どうすべきか、わかりますね?
0290286NGNG
>289
わかりません。
もうすこし具体的に言ってもらえませんか?

>毎回そんなことを考えずに
自分でサブキーを検索して消していく
関数を作っておけということですか?
0291289NGNG
>>290
特定のやり方を押し付けたくありませんが
反問されている内容については
方向性はあっていると思います。
0292デフォルトの名無しさんNGNG
自分で作るサブキー名がわかってるなら
消すキーの中にサブキーをデータとして入れちゃえ
とか言ってみるテスト
0293286NGNG
レスありがとうございました。
結論としてはWin2kでサブキーごとキーを削除するには
サブキーを検索していってひとつずつ
削除する、という流れで、
代用できる関数は用意されていないので
自作すべし。
ということで落ち着きました。
ありがとうございました。
0294292NGNG
>サブキーをデータとして
サブキー名をデータとして

テスト失敗
0295283NGNG
>>285
すいません。やってみたのですが、「IDR_PopMenu 定義されていない識別子」ですと出てきてしまいます。
ちゃんとリソースにはあるのですが・・・
0296デフォルトの名無しさんNGNG
>>295
実はリソースのヘッダをインクルードしてないとか...
外してる可能性大
0297283NGNG
やってしまいました。( ̄□ ̄;)!!!
285さん296さんありがとうございました。
お騒がせしました。m(_ _)m
0298デフォルトの名無しさんNGNG
現在自端末にDHCPから設定されているIPアドレスを
ipconfig /release で開放。
ipconfig /renew で再取得
をしたく、ipconfigと同様なAPIを、検索で頑張って探してみたのですが
結局わかりませんでした。
WindowsCEならあるようなのですが。。。

どなたかご存知の方、教えてください。
0299デフォルトの名無しさんNGNG
>2000でサブキー削除
SHDeleteKey?
0300286NGNG
>>299さん
ありがとうございます、
大当たりです。
試してみましたが無事一発で消えました。
実は自分でSHDeleteKey関数と
同じようなの自作してる途中でしたw
ありがとうございました。

教訓
サブキーごとレジストリのキーを削除する場合は
SHDeleteKey関数を使用する。
0301 NGNG
>>259
以下のコードをa.cとa.rcというファイル名で保存して、
rc a.rc, cl a.c a.res でコンパイルすれば2048バイトになる。
9x系で動作しなくていいなら、cl /O2 a.c a.res /link /align:16
で1056バイトになる。

#include <windows.h>
#define IDD_DIALOG 1
#ifdef RC_INVOKED
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)
IDD_DIALOG DIALOGEX 0, 0, 87, 79
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 9, "MS UI Gothic", 400, 0, 0x80
BEGIN
 DEFPUSHBUTTON "OK",IDOK,27,53,50,14,NOT WS_TABSTOP
END
#else
BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
 switch (uMsg){
 case WM_INITDIALOG:
  return 1;
 case WM_COMMAND:
  if (wParam == MAKEWPARAM(IDOK, BN_CLICKED))
   EndDialog(hWnd, IDOK);
  return TRUE;
 default:
  return FALSE;
 }
}
void Startup(){
 DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);
 ExitProcess(0);
}
#pragma comment(linker, "/subsystem:windows /entry:Startup /merge:.rdata=.text")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#endif
0302デフォルトの名無しさんNGNG
>>300
教訓は2chでのレスは鵜呑みにしないってこった
0303デフォルトの名無しさんNGNG
>>301
キタ━━━━━━━(゚∀゚)━━━━━━━ !!!!!
0304デフォルトの名無しさんNGNG
>>300
ただしIE3だか4だかが入ってないWin95では動作しない罠
Win95をサポート範囲外にするならどうでもいいかも
0305286NGNG
>304
IE4.0以降の環境が必要みたいです。
ご報告。
0306デフォルトの名無しさんNGNG
質問元の>>286で2000って言ってるんだから問題ない罠
0307デフォルトの名無しさんNGNG
mfc**.dllやMSVCRT.dllのバージョンとこれらのDLLがインストールされる
タイミング(VSのSP○でインストールされるとかWindows98では標準でインストールされてるとか)
を知るにはMSDNのどこを見ればよいのでしょうか?
またはそれらが書いてあるサイトはあるでしょうか?
MSDNやgoogleで探してみたんだけど見つかりませんでした。
0308デフォルトの名無しさんNGNG
一番あやしいのはofficeだろうけど情報はまとまってないと思った。

でもここ3年ぐらいはDLL問題を聞かないなあ。
みんなstatic linkにしちゃったのかな。
0309デフォルトの名無しさんNGNG
Oracleでバックアップリカバリのテストをしようと思い、
強制的にファイルをぶっ壊す事が出来ないかと思ってます。
普通にエディタとかでファイルを開いて内容を変更して
保存しようとしても、他のプロセスが使用中とか
いわれちゃうんですが、APIでどうにかなったりしませんか?
#実運用時に突然DBが壊れた状況を作り出したいのです
0310デフォルトの名無しさんNGNG
>>301
あなた神ですよね。
0311デフォルトの名無しさん NGNG
Winアプリからデータベースにアクセスするにはどうすればいいのでしょうか?
何かモジュールやライブラリがいるのでしょうか?
MFCでAppWizardを使うやり方はなんとなくわかったのですが、SDKでやる方法
がわかりません。どなたか教えてください。
0312デフォルトの名無しさんNGNG
>>311
使用するデータベースと、接続法法によるけど。ADO 使うなら msdao15.dll あたり
を #import して使う。
0313 NGNG
>>309
\\.\PhysicalDriveNをRaw I/Oすればできそうな気もするが、
それより安いハードディスクを買ってきて物理的にぶっ壊す
ほうが安上がりかも。
0314デフォルトの名無しさんNGNG
実体のあるファイル別ディスクに入れといてケーブル抜くだけでいいじゃんよー
0315デフォルトの名無しさんNGNG
PrintDlgを使って印刷しようとしてるのですが、
SDKで複数ページ印刷は難しいんですかね?
と言うか、総ページ数の取得ってできないものなんですか?
0316デフォルトの名無しさんNGNG
ウインドウのサイズを変更できないようにするにはどうすればいいのでしょうか?
0317質問NGNG
複数の音(wav)を同時発声するにはどうしたらよいでしょうか。
PlaySound()ではムリなようだから
なにかほかのAPIがあれば教えていただきたいんですけど。
WinMEで。←絶対条件
0318デフォルトの名無しさんNGNG
direct sound?
MEが絶対条件とか言ってるようだと何も知らないみたいね・・・
0319デフォルトの名無しさんNGNG
物理的に壊すとアプリ(この場合oracle)じゃなくてシステム的にエラーが
起こってしまうんちゃうか。
システム的には正常で、アプリからは壊れているように見えることが
試験には必要なんでないの。
0320298NGNG
誰からもなしですね。。。残念です。
systemかjavaでやることにします。

質問の仕方まずかったのかなぁ。
0321デフォルトの名無しさんNGNG
ウインドウ領域を取得したいのですが
画面一番下にあるタスクバーの領域がとれません

 CWnd *pDeskTop = CWnd::GetDesktopWindow();
 CRect m_rect;
 pDeskTop->GetWindowRect(&m_rect);


タスクバーの部分も含めて取るにはどうすればいいですか
0322 NGNG
>>321
GetSystemMetrics(SM_CXSCREEN)
GetSystemMetrics(SM_CYSCREEN)
0323デフォルトの名無しさんNGNG
デスクトップウィンドウってタスクバー領域も含んでたような
0324デフォルトの名無しさんNGNG
>>323
>>322で完璧な答えが出ているのにお前がしゃべる必要があるのか?
0325デフォルトの名無しさんNGNG
質問です。

ビープ音を鳴らしたいのですが(スピーカーから出すのじゃなく)どうすればいいのですか?
0326デフォルトの名無しさんNGNG
>ビープ音を鳴らしたいのですが(スピーカーから出すのじゃなく)
じゃあ一体どこから・・・。
0327デフォルトの名無しさんNGNG
EnumFontFamiliesExでフォント列挙してるのですが、フォント名の頭に @ が付いてる
フォントをフィルタリングするにはどうすればよいのでしょうか?
フォント名文字列の先頭に @ が付いてるかどうかを調べるしかないですか?
フラグでもあるのかなーと思って質問してみますた。
0328デフォルトの名無しさんNGNG
カーソル位置でカーソル形状を変えたいんですが、どうやるか教えてください。

WM_MOUSEMOVEの処理で、カーソル位置の情報を調べて、LoadCursorで変更し
ようと思ってます。
カーソル位置が、キャレットであるとか、ビットマップであるとか調べる方法が
わからないです。
0329デフォルトの名無しさんNGNG
>>325
Beep()なAPIでどうだ? 漏れは使ったこと無いが。

>>326
マザーから鳴るのを知らないのか?
(厳密にはマザーじゃないかも知れんが。)
とんだ坊やだな。
0330デフォルトの名無しさんNGNG
>>329
マザーボードに搭載されてる「スピーカ」からな。
とんだ赤ん坊だね。
0331デフォルトの名無しさんNGNG
>>330
M/Bに搭載されているブザーじゃねーのか?
ブザーとスピーカじゃ物が違うのだが、知ってるか?
0332デフォルトの名無しさんNGNG
ブザーの中に入ってるものがスピ−カー
0333デフォルトの名無しさんNGNG
つぅか電気的に作成した音を出すのは全部スピーカだろう。
0334デフォルトの名無しさんNGNG
きっとマザーが勝手に振動して音が鳴るんだ
0335デフォルトの名無しさんNGNG
>>334
それってスピーカでは?
0336デフォルトの名無しさんNGNG
この中で一番困った人は誰
1.「スピーカー以外」と指定した質問者である>>325
2.つっこんだ>>326
3.よく知らないのにとりあえずマザー説を唱えて煽った>>329
4.おもしろがってる俺
0337デフォルトの名無しさんNGNG
>>335
スピーカーの原理ではあるがスピーカー機器ではないね。
だいたいそんなAPIがあるのか。
03382.NGNG
>>336
2.の時点では軽く困ったけどみんなのおかげで今は楽勝です。w
0339デフォルトの名無しさんNGNG
>>333
認識甘い。
君は車のクラクションがスピーカだと主張しているわけか。(藁
0340デフォルトの名無しさんNGNG
ブザーとスピーカー、音の発生方法が若干違う。
ブザーは振動物に固体を当てて発音している。

それはともかく、Beep()ってのがあるのは確かだな。
0341デフォルトの名無しさんNGNG
どうでもいいレスでスレがのびるのが一番困った。
0342デフォルトの名無しさんNGNG
>振動物に固体を当てて
■ このスレッドは過去ログ倉庫に格納されています