1 :
デフォルトの名無しさん :
2007/01/14(日) 02:20:01 スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
ヽ / /⌒\
/ヽヽ|/⌒\ii|\
/ /ヾゞ///\\|
|/ |;;;;;;|/ハ \|
|;;;;//⌒ヽ
|;/( ^ω^)
>>1 おっおっおっ乙枯ー
. |{ ∪ ∪
|;;ヾ.,____,ノ
|;;; |
|;;;;;|
|;;;;;|
乙
msdn2はなんであんなに重たいの?
みんな使ってるからじゃない
えーっ!! 俺のmsdn2ローカルにあるんだが
msの鯖缶きたこれ
970です。
すいません、環境を書くの忘れてました。VC6.0でMFCは使ってません。
Win32APIのみで作成しています。あと、質問内容の書き方も悪かったので、
下に改めて書き直します。
1.自作プログラムからIE1を起動(CreateProcessでHTMLファイルを
IE1の引数として起動させてます。自作プログラムとIE1は別プロセス)
2.IE1に読み込まれたHTMLファイル内のjavascriptのwindow.openで
新たにIEのウィンドウ(IE2)を開く(IE1とIE2は同一プロセス)
この状態で、自作プログラムからIE2の状態を監視して,IE2がアイドル状態に
なるまで,自作プログラムの処理を待機させたいのです。
>>971 氏の方法はIE1内でwindow.openではなくてCreateObjectを使うってことでしょうか?
長文で申し訳ないですが、よろしくおねがいします。
>>12 IE1とIE2って同居できたっけ?
つか、今時、Win95使ってんのか?
もう11年も前のOSだぞ。
だがそれもいい
>>13 いや,便宜上区別するためにIE1とIE2と書いているのです。IEのバージョンは6です。
IEの詳細設定から別プロセスで起動するって項目が無くなって、新しいウィンドウが
元のウィンドウから生成されるとき、スレッドを生成して立ち上がるようになりましたよね?
その新しいウィンドウの状態をどうやって取得すればよいのか分からなくて、質問させて
いただきました。
その開くページは自前のページ? 自前のページならそのHTMLの unload イベント(だったっけ? 最近、弄ってないから正確に覚えてない)で小細工すればどうにかなると 思うけど、そうじゃないならちょっと難しいかもね。 外部からスレッドを監視するにしても新しく作成されたスレッドが 自分が監視するべきスレッドであるかどうかなんて区別のしようがないし。
Acrobatのページサムネール表示、あるいはPowerPointのスライド一覧表示のように、 イメージのリストを表示し、かつ、その順番をマウスのドラッグで調整したいと思ってます。 ドラッグ中、イメージが挿入される場所にカーソルの様な縦線が出てきて欲しいなと思ってます。 詳しいお兄様方、既存の実装例やコントロールのコードのサンプルなど御存知でしたら御教示下され スレ違いならごめんなさい。
20 :
デフォルトの名無しさん :2007/01/15(月) 01:11:33
若いの オラが村では派遣の問題を口にしちゃなんねーだ お前さんはまだわけぇから言いたいこともあるべぇ だべな、派遣問題を口にするとムキになって怒る者がおるでよぉ 問題の指摘は駄目だっぺぇ 派遣のことは口にしちゃなんねぇ この村みたいな糞田舎で悲惨な生活するためにはよぉ 北朝鮮と一緒でよ、駄目のものを駄目と言ってはなんねえだべさ
>>18 そのソフトは知らんが、簡単に言うとタイマー系APIを自前の処理に
置き換えるのが基本。
APIを置き換える手段はAPIフックとか、ラッパーDLL等。
ターゲットが決まっているならラッパーDLLが楽かな。
とりあえず、そういうことがしたいならAdvanced Windowsを買うように。
YO!YO!ですYO!、YO!YO!ですYO!
25 :
デフォルトの名無しさん :2007/01/15(月) 03:19:20
自分では素晴らしい新APIを作ったつもりが実際はただのラッパという馬鹿はよくいる
27 :
デフォルトの名無しさん :2007/01/15(月) 08:30:34
こんなことしたいんでけど、実現できる win32_api知ってたらおしえてくらはい(m_m) (1) ActiveDirectoryドメインへ参加しているPCに対して あるローカルユーザAでログオンする。 (2) ローカルユーザAがログオンしたデスクトップ上で、 あるドメイン用ユーザのドメインログオン を模倣する処理を走らせて、ドメイン用ユーザに 対してキャッシュログオンが可能な状態にする。 =>要はドメインユーザに対して、 =>最初からキャッシュログオンが可能な状態にしたいってことです。
それどこのキーロガー?
30 :
デフォルトの名無しさん :2007/01/15(月) 17:41:12
PPM画像を読み込んで表示するのとRGBデータそれぞれの配列を用意して格納する方法を教えてください。
Win2K以降のAPIでも構わないのですが、 プロセスIDのみが判ってる状態からそのプロセスのフルパスを得るにはどうすればいいんでしょうか? OpenProcessしてもそっからなに使っていいかわかりません 本来の目的は指定されたパスの実行ファイルが起動中であるか否かを調べたいだけなので、 そういう状況では失敗するAPIを使って判別できればそれはそれでOKですが
PPM形式は以下の順にデータを並べるだけです. 1.文字列"P3".PPM形式を表すための「マジックナンバー」です. 2.区切り文字.スペースまたはタブまたは改行です. 3.画像の幅.10進数のテキストで出力します. 4.区切り文字 5.画像の高さ.10進数のテキスト. 6.区切り文字 7.R,G,B値の最大値.10進数のテキスト. 8.区切り文字 9.画像データ.R,G,Bの順に10進数のテキストで並べます.もちろん値と値の 間には区切り文字が必要. また,1行が70文字を越えてはいけません. なお,"#"で始まる行はコメントとして扱われます. PPMにはバイナリ形式もあります. マジックナンバーを"P3"の代わりに"P6"にします. 画像データは10進数のテキストの代わりにバイナリデータ(8bit)を 並べます. もちろん区切り文字は必要ありません. バイナリデータは8bitなので,R,G,Bの値の最大値は255までしかとれません (テキスト形式だとこの制約はありません).
>>31 CreateToolhelp32Snapshotでモジュールの一覧取れるよ。
プロセスIDから知りたいなら、OpenProcess→EnumProcessModules→GetModuleFileNameEx
指定したファイルが開かれている(編集中)かどうかを調べるにはどんな方法がありますか? 開発環境はVB6.0で、WIN XPか2000で動作すればよいです。よろしくお願いします。
>>33-35 ありがとうございます
CreateToolhelp32Snapshotでプロセス列挙してたので
>>31 でPIDは判る(非フルパスも判る)、
という状態たったのでEnumProcessModules→GetModuleFileNameExでいけそうです
GetProcessFileNameとはいかないまでも意外と直接的な方法がないんですね
39 :
デフォルトの名無しさん :2007/01/15(月) 20:33:20
SendInputというAPIを使うため、INPUT構造体を定義したいのですが コンパイルで定義されていない識別子ですとなります。 APIを試すためコンソールで組んでいます。 #include <windows.h> #include <winuser.h> #include <stdio.h> int main(void){ int x,y; char pos[128]; INPUT input = {INPUT_MOUSE, 0, 0, 0, MOUSEEVENTF_LEFTDOWN, 0, 0}; gets(pos); x = atoi(pos); gets(pos); y = atoi(pos); SetCursorPos(x, y); printf("x = %d, y = %d", x, y); getch(); } SendInputはInputの定義がうまくいかないのでまだ書いていません。 MSDNを見る限りではwinuser.hをインクルードするだけでいいと思うのですが。 間違っている箇所があれば教えていただけますか?
他のプロセスのボタンを押すにはどうすればいい?
BM_CLICK
>>39 #define _WIN32_WINNT 0x0500
>>39 #if (_WIN32_WINNT > 0x0400)
になってるけど、まさかこれが原因じゃないよな
とりあえず winuser.h に INPUT があるか確かめてみれば
ちなみに windows.h をインクルードすれば winuser.h はいらない
46 :
39 :2007/01/15(月) 22:08:18
できました。ありがとうございました。
52 :
17 :2007/01/16(火) 04:32:44
プログラムの本体があるディレクトリを取得するにはどうすれば? GetCommandLine関数から摘出する以外に無い?
いや
>>55 激しく既出。
GetModuleFileName
正直いってこのスレの住人はうんざりしてるので
1スレ分くらいは読んだ方がもめなくて良い。
SDK初心者です基本的な質問ですがよろしくオナガイシマス MessageBoxの第二引数はLPCSTRなので int型の数字を表示する場合、キャストしないといけないのですが 仕方を教えてもらえませんか
>>58 SDK初心者じゃなくてプログラミング初心者じゃね?
単純なキャストじゃダメ。 sprintfとか。
C++ならboost::lexical_castというキャストがある、というのはだめか?
>>59 やっぱりこのマンドクサイ方法しかないのかな
TCHAR buff[8];
_stprintf_s(buff, TEXT("%d"), Index);
MessageBox(NULL, buff, TEXT("数字"), MB_OK);
>>60 ぜひ教えて下さい、↑の書き方にほとほと飽きてキマスタ
.NETなら
Convert::ToString(L"Uint 1");
とかで出来るのに
スマソ58=62です
今後、ExtractIconの様に引数によっては戻り値が異なる関数を利用する場合は、 PtrToUlongを利用すべき? 例) UINT nIconCount = (UINT)PtrToUlong(::ExtractIcon(::AfxGetInstanceHandle(), _T("Shell32.dll"), (UINT)-1);
>>62 無理しないで自分に合った言語を選べばいいよ
>>62 あのなぁ。
それを関数なりマクロなりにすりゃいいんだよ。
同じことを書いてると思ったら括り出すチャンス。
>>65 無理したくないけど、させられるんです、ネィティブWindowsのコードって
むずかし〜わけわかんねー型変換とか、ワイド文字だマルチバイトだって
制約多いしC言語の宿命みたいなもんだが・・・・・
API風に言うとwsprintfだろ普通
>>62 #include <string>
#include <boost/lexical_cast.hpp>
#include <windows.h>
typedef std::basic_string<TCHAR> tstring;
int main()
{
int x = 12345;
MessageBox(0, boost::lexical_cast<tstring>(x).c_str(), TEXT(""), MB_OK);
}
iostreamに読み書きできるものならなんでも変換できることになっている。と言っても実質文字列と数値型くらいにしか使う機会がない気もするが。
ttp://www.kmonos.net/alang/boost/classes/lexical_cast.html >>64 ToUlongなんだから、ULONG型で戻り値を受けようよ。
>>68 wsprintfは1024バイトが上限。
_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_lを使うのがおっとこまえ
>>62 少しは頭を使えよ。
C++でMFC/ATL使ってるなら
CString Format(LPCSTR fmt, ...)
{
CString str;
va_list args;
va_start(args, fmt);
str.FormatV(fmt, args);
va_end(args);
return str;
}
みたいな関数でも作って
MessageBox(NULL, Format("%d", Index), _T("数字"), MB_OK);
とかやればいいだろ。
Cなら、同様にstdarg.hのマクロと_sntprintf()でも使って
MessageBox()自体のラッパでも書くんだな。
>>69 58です
サンクス
Cも中途半端にいきなり.NETとかやってたんでC++弱いんだよねマジで
>>73 そういう問題じゃないな。君の頭が回らないだけ。
>>74 58だが
頭は回らないが、ティムポは良く動きますがなにか
また違う誰かが、どっかで
>>58 の様な質問するから
そん時は
>>73 が誇らしく回答すればいいんじゃね?
このスレじゃないと思うけど。
つか言語をまず指定するべきだろ
Cだと
>>69 は使えないわけだし
#include <windows.h> #define tostr(arg) (TEXT(#arg)) int main() { MessageBox(NULL, tostr(519), tostr(11), MB_OK); } ほらかんぺきだ
#include<w...> int main(void) { MessageBox(NULL, TEXT("123..."), TEXT("12222222222222222222222222222"), MB_OK); return ...; } 完璧だろ
80 :
69 :2007/01/16(火) 23:50:36
>>77 60でC++ならと書いたところ、62で良しと言われたので69を書いた。
プログラムの基礎が分かってないんだな 「型」というものが何か分かってれば 直接的に操れる分、それほど複雑でもないと思えるはず
83 :
82 :2007/01/17(水) 00:14:37
誤爆ゴメン
俺らに型を語るなんて10年早い
俺らに語を型るなんて10年早い
Windowsアプリケーションを起動するとき、 main関数、WinMain関数に達するまではどういう手順をふんでいるの? ベタにアプリケーションのアドレスを0から解読して実行してるだけ? それとも、ファイルヘッダの部分が存在して、 そこに示すアドレスからジャンプー>main関数、WinMain関数に行く訳? また、アプリケーションのエントリポイントは、 固定値で、OSが勝手に判断しているわけ? だれか、main関数、WinMain関数以前の処理を教えてくれませんか? もしくは、詳しく説明しているサイト、 関連するMSDNページを知っていれば教えていただきたいです。
こんなとこで聞くな
>>86 >それとも、ファイルヘッダの部分が存在して、そこに示すアドレスからジャンプ
このとおり。
>また、アプリケーションのエントリポイントは、固定値で、OSが勝手に判断しているわけ?
違う。 リンカでエントリを明示的に指示している。
通常暗黙のエントリポイントを指していて、ランタイムの初期化や グローバル/static オブジェクトの生成等
の処理を行った後に main や WinMain を呼び出している。
したがって、暗黙のエントリポイントは標準で連結されるであろうライブラリの何処か
>だれか、main関数、WinMain関数以前の処理を教えてくれませんか?
コンパイラ次第なので、スタートアップルーチンのソースがあるか次第。
VC6(インストール時に選択されてれば) は CRT/SRC/*.* にある。
91 :
86 :2007/01/17(水) 09:23:36
すみません、データ共有について質問させてください ファイル構成 common.h typedef std::set<wchar_t*> wcset; #pragma data_seg(".shared") wcset* data = new wcset(); #pragma data_seg() main.cpp common.hをインクルード WinMainのあるほう dll.cpp common.hをインクルード DllMainのあるほう この状態でmain.cppでdataにデータを追加しても dll.cppのほうではデータが追加されません (main.cppのほうでは追加されます) defファイルもちゃんと定義しています (#pragma comment(linker, "/section:.shared,rws")なども試しました) どこがおかしいのでしょうか
>>92 DLLがプロセスに読み込まれる度にnewで新たなオブジェクトが作られている予感。
また、setを初めとしたC++のコンテナは、要素を格納するメモリを内部で独自に確保しているから、
コンテナそのものを共有させても要素まで共有されない。
allocatorを共有すればいいんじゃね?
95 :
92 :2007/01/17(水) 22:27:12
>>93 ありがとうございます
なるほど、コンテナは避けたほうがよさそうですね
とりあえずwchar_t*配列に書き直して実行してみたのですがダメで
そもそも根本的な勘違いをしている気がしてきました
data_segは、DLLを呼び出すコードとDLL間でデータを共有するというよりは
DLLを呼び出すコードが複数あった場合に
DLLが別々のコードから呼び出された時も
同じデータを持つ機構って感じがするのですがどうでしょうか
なのでmainでデータ追加というのが
そもそも間違っているような気がしてきました
>>94 自分には無理そうです、すみません
アロケータは難しいイメージがあって
さらに共有となるとどうやっていいのかさっぱりイメージが・・・
96 :
92 :2007/01/17(水) 22:50:39
コードを書いて確認してみました int型変数をカウントアップするだけのexport関数を書いて dll.cpp側でカウントアップし アプリを複数起動したらカウントがちゃんと増えました data_segは、dll.cppとmain.cppで、 グローバル変数のように使えるのかと思ってたんですが データ共有ってそういうのではないっぽいですね とりあえず、データの受け渡しをする関数を 書いたら何とかなりそうなので、それで頑張ってみることにします
うろ覚えだけどdata_seg使う場合は、変数に初期化子付けないと 共有にならないんじゃなかったかな。
98 :
92 :2007/01/17(水) 23:29:09
>>97 どうも、そうみたいですね
つけないと.bssセクションに置かれるとあります
一応自分が試したコードでは全て初期化して試してるけど
MSDNよく読んだら静的な初期化じゃないとダメらしく
上みたいにnewするのもNGの模様
>>94 というより、共有メモリを確保するアロケータを使えというほうが、まだ適切。
>>95 wchar_t*の各要素も共有メモリ上に確保しないとだめだぞ。
100 :
95 :2007/01/18(木) 00:05:35
"C:\エロ動画.zip" にうpしました! というようなもんだな。 データへのポインタは共有されているが、他のプロセスではそのポインタが意味をなさない。
だって独立したメモリだもん
common.h typedef std::set<wchar_t*> wcset; #pragma data_seg(".shared") wcset* data = NULL; #pragma data_seg() にしておいて DLLMainで data = new wcset(); じゃないかな
new wcset(); の時点で、その new したプロセスのみしかポインタの値が有効にならんでしょー
#pragma data_seg(".shared") wcset data_instance; wcset* data = &data_instance; #pragma data_seg()
> wcset data_instance; プロセスの数だけコンストラクタが動くんじゃないか?
アクセサを自分で定義するなら
>>103 でも正解のような気がする
#pragma data_seg(".shared") wcset* data = NULL; #pragma data_seg() こいつをどちらか一方 もう片方は extern wcset* data; 後はどっかで data = new wcset();
data_seg に リンクカウンタ用意して DllMain の DLL_PROCESS_ATTACH で リンクカウントUP & 初回なら new DLL_PROCESS_DETACH で リンクカウントDOWN & 最終回なら delete ってな感じか
DLL_PROCESS_DETACH で リンクカウントDOWN & 最終回なら delete してる間に別のプロセスが DLL_PROCESS_ATTACH で リンクカウントUP & 初回なら new してたら最悪のパターン ミューテックスでも使うか? ・・・なんの話だっけ??
なんだかよくわからないけど #pragma data_seg(".shared") char d[sizeof(wcset)] = {0}; wcset* data = NULL; #pragma data_seg() で、どっかでplacement newじゃだめ?
113 :
112 :2007/01/18(木) 14:46:43
すまん コンテナ内のメモリの確保が問題なんだな アロケータ書くとかしないとだめか
どっちにしろ同期処理は必須だからMutexとか使わないといけないし、 #pragma data_seg(".shared")だけで解決できる問題じゃないと思うけど。
定義しているものしか共有できないから諦めろ
難しい話をしているねぇ〜 まぁお茶でも飲もうぜ。
new をオーバーライドすれば良かろうもん
そんなにオブジェクトを共有したければ、アウトプロセスCOMサーバを作ればいいだろうに。
>>118 IUnknown::AddRef();
IUnknown::Release();
ってやつね。
敷居が高そー
120 :
92 :2007/01/19(金) 19:17:12
なんかすごい難しそうなことになってるなー
あれから試行錯誤した結果、もう共有は諦めて
mainからWM_COPYDATAを使ってなんとかしようと思ってます
ところで、上の96も、さらに間違っていたようで
ttp://www.codeproject.com/dll/hooks.asp 英語力が微妙なせいで間違っているかもしれないけど
main.cppと、main.cppとは別のdll.cppを呼び出したプロセスと
「偶然に」同じページにあったら共有できて
ページが違えば共有できない、っぽい
どちらにしろ、そんな偶然をあてにするコードは書くべきではないだろうけど。
(´Д`)もう投げ出したい
/\___/\ / ⌒ ⌒ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < 投げ出せばいいじゃん | ト‐=‐ァ' .::::| \_________ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
大きなデータの共有はCreateFileMappingじゃないの
それはそうだけど、議題は内部にポインタを持つデータ構造の共有 STLだからアロケータ書かないとダメ
ループしてるぞw
ポインタを持たなければいい
Cの世界に戻って考えたほうが、結局幸せになれる予感。 ポインタの代わりにオフセットで保持する位は、たいした事無いだろ。
Cではポインタは普通に使うだろ 配列を使ってポインタやフリーリストを自分で管理するような仕事は、 むしろCのように便利にポインタが使えない言語でよくやったんじゃないか?
僕ハッカー
馬鹿バッカー
まだやってんの?
131 :
デフォルトの名無しさん :2007/01/20(土) 13:07:58
【ネガティブ派遣根性チェック】 3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。 □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われている □自社に仕事を持ち帰れるように言われるとムカつく □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにする □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなく自分のプライベートについても指示して欲しい □自分の月額金額を知らない □派遣先社員より自分の生涯収入が低いのは当然だ □派遣先に尻尾を振り、いつまでも派遣を続けることが大切だ
ポインタがいいよと君がいったから一月二十日はメモリ破壊日
バカバッカー
Vistaの場合、ExplorerのSysListView32から 各ファイルのITEMIDLISTを取得するってどうやるんでしょう? 以前のOSの場合、LVITEMのlParamに(非公式ながら)入ってたんですが……
前スレでウィンドウのイネーブル/ディスエーブルについて質問したものですが、 どうもすみません。色々勘違いしてました。 当初やりたかった事は、 GUIアプリAが、ユーザーの操作により、GUIアプリBをCreateProcessします。 その時、アプリBが終了するまでアプリAの操作を禁止したいのです。 そして、アプリBがユーザーによって閉じられた時に アプリAがフォアグラウンドになるようにしたいのです。 アプリBのメインウィンドウのオーナーを、 アプリAのメインウィンドウにすれば実現できるようです。 でも今回の場合、アプリBは私が書いたものではないのです。 アプリBのオーナーを指定する事はできません。 アプリAは私が書きます。 なのでアプリAのコードのみでウィンドウownと同じ事をしたかった訳ですが・・・
<<Aのコード>> 自分自身をEnableWindow(FALSE) CreateProcess(B) メッセージループを回しながらBの終了を待つ。 Bが終了したら自分自身をEnableWindow(TRUE)&SetForegroundWindow という風にしたら、一応近い感じにはなったのですが、 Bを操作中に、いったん無関係のアプリCに切り替えて またBに戻すと、AはCの裏に来ています。 ここですでに嫌な予感がしたのですが、 この状態でBを終了すると、Aがフォアグラウンドにならずに Cがフォアグラウンドで、Aはタスクバー上でピコピコしているだけです。 なんとかownと同じようにできないでしょうか・・・
WaitForMultipleObjects MsgWaitForMultipleObjects WaitForSingleObjects ただし、強制終了するときなんかのことを考えると WaitForSingleObjectsはオススメできない > イネーブル/ディスエーブル せめて有効/無効って書いてくれ 一瞬何のことかと思った いやまあ、今回は関係ないんだけどね
日本語じゃなくてもいいから せめてEnable/Disableって書いてくれ
前スレの124か ? > メッセージループを回しながらBの終了を待つ。 どのように変更したの。相変わらず、WaitForをつかっているの。 それと、AとBのウィンドウスタイルはWS_OVERLAPPEDかWS_POPUPか教えてくれ。 現段階の情報だけだと、 GetForegroudWindow()にAttachThreadInput()してからSetForgroundWindow()か。 ちらつくけど。
アプリB起動時にAttachThreadInputしておく、かなあ。 でも、終了時に別のプロセスがフォアグラウンドになってオジャン、な予感もする。
>でも今回の場合、アプリBは私が書いたものではないのです。 >アプリBのオーナーを指定する事はできません。 実は出来るんだなそれが
俺ならアプリBにメッセージフック仕込んでWM_DESTROYのところで処理させるかな。 141の方法だとアプリBが終了したときに、Cがフォアグラウンドでもフォーカスを 奪ってしまうからお薦めできない。
でもcuiは単純にはメッセージフック出来ないからそれもまためどい
146 :
デフォルトの名無しさん :2007/01/21(日) 13:49:36
atoiなどの数値変換のwin32版ってありますか?
StrToInt
そこまではたどり着いたのですが、strings.hとやらをincludeしても使えないんです MSDNも英語だし
どこにもstring.hなどと書いてないのだが Header shlwapi.h Import library shlwapi.lib
おお、出来ました。 MSDNの検索でトピックタイトルにSTRINGS.Hってのがあって その中にStrToIntがあったのでこれをincludeするのかと思ってました
shlwapi.dllはIE4に付属だがそれでもいいのか?
それは問題ないです。IE4以上が入ってればつかえるんですよね? あと_tcstolというのも憶えました。
153 :
デフォルトの名無しさん :2007/01/21(日) 19:18:51
CryptoAPIを使用したいのですが、CertCreateCertificateContextを使用するの次のエラーが出ます。
「未解決の外部シンボル __imp__CertCreateCertificateContext@20 が(以下略)」
Crypt32.libはちゃんとリンクさせてあります。
次のAのようにしたところ、エラーが消えました
@プラットフォームSDK付属のCrypt32.libをリンク(SDKは2007/01/19に最新版をダウンロード)
AVisual Studio 2003に付属のCrypt32.libをリンク
また、「未解決のシンボル…」エラーが出る類似の例として、以下のページを見つけました。
http://forums.belution.com/ja/vc/000/241/58.shtml このページの例では、VC++6.0付属のCrypt32.libをリンクしたことが原因だったそうです。
そこで質問です。
プラットフォームSDKについてくるCrypt32.libは古いVC++付属のものなのでしょうか?
154 :
153 :2007/01/21(日) 19:20:25
>153だと誤解がありそうなので訂正。 @エラーが出る プラットフォームSDK付属のCrypt32.libをリンク(SDKは2007/01/19に最新版をダウンロード) Aエラーが出ない Visual Studio 2003に付属のCrypt32.libをリンク
>>152 _tcstolはWin32APIでないぞ。
それでよいなら、atoiには_ttoiが対応する。
やっぱStrToIntにします
そもそも今使ってる環境くらい書けよ
VC6 WinXpでMFC未使用です
Win32APIじゃ無いけどMS独自の拡張だし、別にいいじゃん
>>153 両方手に入るなら自分で調べてみろよ
コマンドプロンプトで
FC /B ファイル名1 ファイル名2
でバイナリ比較できるから
>160 VC++6.0のCrypt32.libが手に入らなかったりします。
CryptoAPIの他の関数は問題なくリンクできるのか?
>>153 dumpbin -EXPORTS crypt32.libしてみそ。
まぁPlatformSDKのlibディレクトリはたまに変なものが入ってたりするのは
確かかだが。
気になるんなら
以前なぜかlibcp.lib(どうも古いバージョンのC++ランタイム)が
入っていてハマったことがあるよ俺は。
DwmExtendFrameIntoClientArea/DwmEnableBlurBehindWindow わかんねーーーーー
>>164 じゃないけどさ、
別なウインドウが乗っかってるウインドウのGlass化ってどうやるの?
例としては、「ガジェットの追加」の画面とか。
あれToolBarWindow32が乗ってるんだよね
167 :
デフォルトの名無しさん :2007/01/22(月) 00:05:27
>162 他の関数については試してないです。これから試してみます。 >163 ありがとうございます。調べてみます。
作成したソフトウェアに必要な画像や音楽のデータをソースコード内に組み込んで ソフトウェアを起動するときには画像や音楽のデータを不要にしたいんですけどどうしたらいいですか
リソースに入れてLoadResourceで
リソースはソースコード内に組み込んだと言えるのか…
意を汲んでやれよw
音楽データ等を 実行ファイル内に持つということは… すんげーでかい実行ファイルになっちゃうんだが、問題おこさないのだろうか? # リソースにしろ data_seg 直置きにしろ…
>>175 MIDIデータのようなものならサイズはゴミみたいなもんでしょう
要するにコンパイルしてできあがった実行ファイルだけで 画像を表示したり音を鳴らせるようにしたいんです 画像については1ピクセル毎のRGB値を調べて変数に格納してやってその数値を見ることで 元の画像を不要にできるんじゃないかと思ってるんですがこういうことに詳しい人いたら教えてください そういうことができるソフトがすでにあったりしませんか
>>178 お前のレスは全く無意味だな
分からんなら黙っとけよ
180 :
デフォルトの名無しさん :2007/01/22(月) 16:59:10
>>177 こんなアホ久しぶりに見た
最高にわろたwww
>>177 リソースを「どうしても」使いたくないのなら
グローバルかstaticのchar[]配列として格納しておいて
CreateDIBSection()
> 1ピクセル毎のRGB値 ビットマップもそうだろ 車輪の最発明したいんか?
>>183 biComplession かけたこと無いが… 一応圧縮可能なんじゃね? <DIB
別になってるってことは、ロードしてからの作業はもうできてるんだろうし、 ビットマップファイルを、 0x00,0x00,・・・・・・・・のソースに変換しとけばいいべw
ああすいません
>>170 の方法でやれそうです
>>178 が自分のレスを100回読めとレスしたからぶち切れました
スレ汚し失礼しました。適切なアドバイスありがとうございました
切れる前にマルチを責められてる事に気がつけ
188 :
デフォルトの名無しさん :2007/01/22(月) 17:14:02
>>186 死ねや
ぼくの質問が流されただろうがハゲ
食事中だボケ
ハズレ A=食事中にしかできない
すみません、このスレできくように言われたので、お願いします。 入力された文字列がファイルパスとして正しいか、を調べたいです。 単に指定された文字列のファイルが開けなかったから不正、ではなく、 Windows のパスとして不正な文字列 <>: 等、 エクスプローラで指定するとエラーになるケースを判別したいです。 すみませんが、皆さんのお知恵を貸してください。
印刷用に作成したメタファイルをそのまま指定された送付先に FAXで自動送信するプログラムを開発しています。 メタファイル自体は難なく作成できたのですが、 その先のFAX送信の方法が分からず困っています。 ぐぐって見たところfaxcomというcomコンポーネントがヒットしたのですが、 メタファイルが使用できませんでした。(ビットマップやTIFFに変換しても駄目) PrintDlg等でFAXを選択して印刷すると送信はできそうなのですが 送付先の指定ができず、印刷時に送付先を指定するダイアログが表示されてしまいます。 何かいい方法は無いのでしょうか?ぐぐるヒントでもいいので教えてください。
>>199 さん
ご教授、ありがとうございました。
Windowsサービスを作成中なのですが そのなかでGetCurrentDirectory()で実行しているサービスの フォルダが取得できると思ったのですが WindowsのSystem32フォルダを取得してしまいます。 自分自身のフォルダを取得するにはどのようなAPIを 使えばよいでしょうか? よろしくお願いいたします。
GetModuleFileNameから切り出してみたら?
HWNDから、そのアプリケーションのHINSTANCEを取得したいのですが、 そういう関数があったら、教えてください
GetWindowLong
64bitを考慮するなら GetWindowLongPtr か…
>>208 ありがとうございます。
こういうのってどうやって調べるんですか。
GetInstanceとか、予測しても無理っぽいし。
ソースとか本とかで掴んでくしかないのかな。
フルパスからファイル名を除くディレクトリまでを 切り出すにはどうしたらいいでしょうか? ファイル名を切り出すAPIはあったのですが(GetFileTitle)
>>212 MSDN見てたら、結構いけそうな気がした。
てきとーに読んでみると結構おもしろいね。
216 :
200 :2007/01/23(火) 20:55:46
遅レス失礼
>>201 参考にさせてもらいます。ありがとうございました。
はじめまして。 インターネット上のJPEGファイルをダウンロード(HTTP)し、ウィンドウに表示する プログラムを作成しています。 InternetOpenでファイルを読み込んだあとの処理に悩んでいます。 いったんhoge.jpgなどと書き出して、JPEGLIBで読み込むかOleLoadPicture で読み込む方法は思いつくのですが、もっと効率よく メモリ上のJPEG画像を表示する方法はありますか?
>>208-210 そのラッパが<windowsx.h>にGetWindowInstanceとして存在するよ。
IEやFirefoxなどはどうやって表示しているのでしょうか、自前?
>>220 いや、レンダリングエンジンを塚テル。
それをYOUもつかっちゃいなよー
JPEGならGDI+で扱えるな
ちょっとPostMessageについて質問させてください。 Internet ExplorerでPDFを表示させると、ブラウザの中でAcrobatが起動して PDFが表示されますよね。その状態でInternet Explorerを終了させても Acrobatのプロセスが残り続けるので、外部から終了させようと思い、 下の手順でやってみたんですが、終了できません。 char szClassName[64]; memset( &szClassName, NULL, 64 ); GetClassName( hwnd, szClassName, 64 ); if( strcmp( szClassName, "AdobeAcrobat") == 0 ){ PostMessage( hwnd, WM_CLOSE, 0, 0 ); } この方法は使えないのでしょうか?TerminateProcessは使わないで 終了させたいのです。環境はVCでMFC不使用、Acrobatのバージョンは7です。
>>224 あー、すまん試してたんだな。
それはそもそもウィンドウハンドルを取得できてるのか?
FindWindowとかで。でもstrcmpで比較してる辺り取得してるっぽいな
じゃあ、対象はアイコンか?
まぁ、WM_CLOSEがpostできたとして 終了してくれる保証なんてないんだけどな。
保存して終了させますか?とかのウィンドウが出たりするやつはうざいな
228の作るアプリは使いたくないな
>>228 多少解るぜ俺も
大抵バイナリエディタでちょっと弄れば消せるからいいんだけど
>>207 Windowsのハンドルと、モジュールのハンドルには直接的な関連性がないためできない。
まずはWindowsの基礎を勉強してこい。
WM_CLOSEをポストしてタイムアウトしたら素直にTerminateProcessでいいかと。 そもそも終了時にユーザーの入力待ちに入る可能性のアプリはどうしようもないし、個々のアプリの仕様に合わせてを入力をエミュレートするなんてのは泥臭い
233 :
224 :2007/01/24(水) 07:19:46
>>226 EnumWindowsのコールバックに登録してやってます。
ウィンドウハンドラは取得できています。
>>227 ,232
TerminateProcessでやるとゴミが残りそうで心配なのです。
思いつく中で一番綺麗に終了させる方法がWM_CLOSEだったのですが、
やはりTerminateProcessで強制終了させるのが確実な方法になるみたいですね。
でも、あきらめきれないので他の方法も考えてみます。
>>233 >232をよく読め。死亡要求メッセージを送った後、死んでくれなければ殺すということだ。
>>234 >233をよく読め。TerminateProcessでやるとゴミが残りそうで心配なのですということだ。
>>235 >234をよく読め。取り敢えずWM_CLOSEで死ねばTerminateProcessを使わないで済むだろ。
WM_CLOSEってコンソールアプリケーションにも有効ですか? っていうか有効みたいなんですけど、ウィンドウがないのに なぜ?
SYSTEMメニュー持ってて閉じるが有効ならば デフォルトのWindowProcなら閉じる
>>238 窓ならあるだろ、ConsoleWindowClassのいわゆるDOS窓が。
そいつがウィンドウメッセージを受け付けている。
そいつにWM_CLOSEを送りつけると、コンソールアプリには結果的に
CTRL_CLOSE_EVENTが送られる。
デフォルトではそれで直ちに終了するが、
SetConsoleCtrlHandler()を用いて、そうしたイベントを捕捉することもできる。
「保存しますか?」等をブロックするのに WM_QUERYENDSESSION を Post してから WM_CLOSE を Post するのはどうだろうか?
Postしちゃらめぇぇぇ Send ですたわ
窓の閉じ方なんて、MSDNに普通に載っているだろ
OSはTerminateProcessでプロセスが保持してるオブジェクトを全て破棄する。だからゴミは残らない 残るとすれば殺されるプロセスがするべき後始末がされないことで、ファイルとかレジストリとかDBに消されるべきものが残ることがある
だからそのゴミをいってるのだろう
正常終了する保証がないならゴミがでるのを心配してもしょうがないわな
247 :
224 :2007/01/24(水) 23:15:04
>>273 情報サンスクコ。そもそもの始まりはそのFAQからなんです。
5分とか10分とか放置すれば消えるってあるんですが、消えなくて困ってて。
終了したプロセスのくせに何十MBもメモリ食ってるのが納得いかなくて、
ガリガリとソース書いてるんです。
で、ウィンドウハンドルは一応取れているので、SendMessageTimeoutで
タイムアウト設定して、WM_CLOSEを投げるようにしたんだけど、終了するときと
終了しないときがあってさらに困ってる状態。
WM_COMMANDとSC_CLOSEでも上手くいくときといかないときがある。
WM_DESTROYを投げると確実に終了してくれるのだが、WM_DESTROYって
外から投げるようなメッセージではないと考えてて。AcrobatをSPY++で見ると、
WM_CLOSEが投げられてて終了してるので、さらに困ってる。
あ,長文こめん。
SetProcessWorkingSetSizeが使えないかな、とふと思った。
質問ですが IEのツール→インターネットオプション→LANの設定→プロクシサーバのチェックの ON/OFFは何処の関数を使えば制御できるのでしょうか?
もしかしてVistaってIShellExecuteHook サポートされてない? HKEY_CLASSES_ROOT\Interfaceにも該当IDがないんだが
251 :
250 :2007/01/25(木) 01:27:18
ああ、レジストリは関係なかった。。。 だけどShellExecuteHookが効かないよぅ
ウィンドウの中にエディットコントロールがあって、 そのエディットコントロールにユーザーの操作でフォーカスが当たった場合、 WM_FOCUSイベントって ウィンドウ -> エディットコントロールの順番に来るか それともエディットコントロールにしか来ませんか? 後者の場合、ウィンドウ側がコントロールがWM_FOCUS受け取ったことを 察知する一番良い方法はなんでしょう?
>>252 >察知する一番良い方法は
EN_SETFOCUSとか。
254 :
デフォルトの名無しさん :2007/01/25(木) 04:02:58
Win2000,XP等で、特定フォルダやファイルへのアクセス時を禁止するアプリを作りたいと思っています。
そこで、ファイルがオープンされる前にそのことを検出でき、かつそれを拒否するための方法が知りたいのですが、
何かヒントとなるキーワードを教えていただけないでしょうか。
現状を説明しますと、
まずディレクトリを監視しようと考え、FindFirstChangeNotification や ReadDirectoryChangesW にたどり着いたのですが、
これはディレクトリエントリの更新を検出するだけで、ファイルがオープンされたりすることを直接的に検出できるわけでは
なさそうだと感じました(もし検出できても、そのアクションを拒否できなそうです)。
次にたどり着いたのは、フィルタドライバなる言葉です。
もしかしたらこれでイケるのかなと思ったのですが、ちょっと難しそうな方法だと感じていまして、もっと手軽な方法は
無いものかと思っています(無いのであればこの方向で突き進むのですが・・・)
なので、その辺のアドバイスというか、何かコメントしていただけると大いに助かります。
例えば、これの開発環境(IFSキット?)というのは、有料なのでしょうか。ココを見ると、無料っぽくはないですが・・・
ttp://www.microsoft.com/japan/whdc/DevTools/IFSKit/default.mspx そして、これだけ買えばOKなのでしょうか?(できればあまりお金をかけたくないです)
もしかしたら何かの書籍付属のCDについてくるようなものだったりするのでしょうか?
ところで、Sysinternal の FileMon みたいなものは、どんな API でファイルアクセスを検出しているのでしょうか?
聞きたいことてんこ盛りになってしまってすみませんが、よろしくお願いします。
256 :
254 :2007/01/25(木) 05:15:13
>>255 それ(CreateFile)だと目的を実現できないです。
実はファイルサーバでいくつかのディレクトリを共有していて、そこに数台のクライアントマシンでアクセスに行きます。
ところがファイルサーバの都合、ディレクトリごとのアクセス権を設定できず、全部のクライアントが全部の共有ディレクトリを
参照できてしまいます。
そこで、各クライアントに、「自分向けの共有ディレクトリ」だけを参照するような細工をしようと考えました。
つまり、各クライアントでファイルサーバ上のディレクトリへのアクセスを監視し、自分用以外のディレクトリのファイル操作を
拒否するようにしよう、と考えたわけです。
いや、そもそも環境を見直せという意見もあるでしょうが、何分いろいろ事情がありまして・・・
ウィルス監視ソフトなんかは、ファイルアクセス時にウィルスの有無をチェックして、ウィルス入りだったらアクセスを拒否
させますよね。
そんな仕組みを作ってみたいです(ウィルスのチェックじゃなくて、パスのチェックですが)。
# ちなみにそのURL、ちょうど今読んでたところです。おもしろいですね。
君のスキルじゃ無理だろうけど SSDT でもやっぱりシステムを直さないと根本的な問題は解決できない。 物事はシンプルな方法で解決すべきだよ。
258 :
254 :2007/01/25(木) 06:57:05
>>257 それはあんまり手を出したくない部分です。いや、出せといっても出ないのですが。
むしろそれはフィルタドライバを書くよりも厄介というか、推薦されない気がするのですが、
SSDT をいじらないと実現できなそうでしょうか?
フィルタドライバじゃダメなんでしょうか?
お手軽なフックAPI 探しはあきらめモードなので、フィルタドライバを書く覚悟を決めていた
ところなんですが、それでもダメだと萎えそうです。
もしや、ネットワーク越しのファイルアクセスにはフィルタドライバは使えないなんてことが
あったりしますか?
環境直しについては、そう指摘いただくことはよく理解できるのですが、既に「いろいろな事情」を
言い訳にするまでもなく、本末転倒ながら「とにかく作ってみたい」という気分になってしまいました。
ですので、その方向でよろしくお願いします・・・
小細工するより、ディレクトリにアクセス権を設定できるサーバに 変えた方がいいと思うが。
仮にフィルタドライバ開発したとして、 各クライアントにそれインスコして回るのかw
>>261 だよな。 最終的にブロッキングかけるのはクライアント側になるしね。
ディレクトリで管理してればインスコするのは簡単だがユーザーにパーミッションをかけて制限するほうがもっと簡単
264 :
254 :2007/01/25(木) 14:08:12
>>261 そのつもりです。
>>258 で書いたとおり、いまや作ることが目的なので、管理の手間についてはどうでもいいです。
趣味の問題といいますか。
いまのところ、
・これを端的に実現するための API はあるのか (無さそうだと思う)
・フィルタドライバじゃ実現できないのか (イケそうだと思う)
・SSDT をいじらないとダメなのか (そこまでは必要ないんじゃないかと思う)
という疑問と、自分なりの回答を持っていまして、それについてのコメントがほしいです。
すみませんが管理手法についてはカンベンしてください。
できるかどうかはわからんが、 シェルエクステンション使って、explorerに表示されなくするとかの方が目的に近くね?
ウィンドウに対する複数の操作(更新や移動、サイズ変更など)を一度に反映させるためのAPIがあったと思ったのですが、誰かお分かりになりますか? API呼び出し→複数の処理実行→API呼び出しで反映 という感じだったと思うのですが・・・(´・ω・`)
>>266 SetWindowPos() と UpdateWinodw() ?
268 :
266 :2007/01/25(木) 15:26:31
いやそれらを呼び出す前に画面に反映させるのを禁止するAPIと、それらを呼び出したあとにすべての処理を反映させるAPIのことです。 おなじAPIで引数の違いだけだったかもしれませんが。
>>265 explorerに限定するならいいかもしれんがPowerShellとか使われたらあかんでしょ。
BeginDeferWindowsPos DeferWindowPos EndDeferWindowPos
271 :
266 :2007/01/25(木) 15:43:24
>>270 キタ━ヽ(ヽ(゚ヽ(゚∀ヽ(゚∀゚ヽ(゚∀゚)ノ゚∀゚)ノ∀゚)ノ゚)ノ)ノ━!!!!
>>264 その手のマルウェアはカーネルモードのAPI云々ってのが普通みたいだし
過疎ってるけどDDKスレに行ってみたら?
と、情報量のないレスをしてみる
システム構築失敗しちゃって費用をかけずに修正しようとてんぱっているんだろ。 土下座の練習したほうがいいんじゃね?
>>254 クライアント側に細工していいなら、CreateFile他にAPIフックしてアクセスされたくないディレクトリ
内の物だったらFALSE返すようにすれば?
逆にクライアント側に仕掛ける限り、クライアントのユーザーに解除できない方法は無いような気がするが。
いずれにしてもここまでの書き込みを読む限り、
>>254 には無理そうだな。
SSDTって何だ?というおれもまだまだヒヨッコか・・・
SSDT = Scottish Six Days Trial
>>264 >・フィルタドライバじゃ実現できないのか (イケそうだと思う)
イケなそうだと思う。
ファイル共有ってサービスとして実装されているのであって、フィルタ入れられるようなドライバスタックは無いんじゃない?
ネットワークドライバにフィルタをかませてもどのファイルのアクセスかなんてパケット解析しないと判らんだろうし。
オレも254には無理だと思う。
>>272 WDM(デバドラ)スレも見てるんで、おかしなやつを誘導しないようお願いします。
SSDTの書き換えはVistaで使えなくなると聞いた。
Vistaで〜が使えなくなる……って、どこみたらいいの?
質問なのですが ある特定のアプリケーションが確保しているメモリに他のアプリケーションからアクセスしてメモリの内容を書き換えてしまう事はできるのでしょうか? もしできるのであればアクセスさせないようにする、もしくはアクセスを検出するにはどうすればいいのでしょうか? できればこれをまったく別の第三者的なアプリケーションにさせたいと思っています。どうか知恵を貸して下さい。
何故MSの資料を読まない?
283 :
254 :2007/01/26(金) 08:40:33
>>265 それだと直接パスを指定してのファイルアクセスとかはダメそうです。
>>272 DDKスレも見てみました。
前からドライバというものを作ってみたかったので、何はともあれ本を買ってみることにしました。
というわけで本屋に入り浸ってきましたが、お目当ての本は無かったので、また別の本屋に行ってきます。
>>273 そんな大げさな話じゃないです。
自分ちで使おうと思ってます。
>>274 いや、自分じゃないです。
でも、パスワードがかけられるフォルダって面白いかもしれないですね。
ついでにトライしてみるかもです。
でもユーザにパスワードを促している間は元のファイルアクセス API が止まっちゃうわけですから、
よくないことが起こりそうですね。
>>275 API 自体をフックしてしまうのは邪悪かなと思います。
クライアントでユーザーががんばって仕掛けを解除してしまっても、それはそれで構いません。
>>277 イケなそうですか。自分もそこが少し気になっていたところです。
でも、ネットワークドライバの上に、共有サービスのためのファイルシステムドライバのようなものが存在していたり
しないんですかね?
この方法は置いといても、ウィルス監視ソフトってどうやってファイルアクセスを横取りしてるんでしょうか。
>>283 >それだと直接パスを指定してのファイルアクセスとかはダメそうです。
クライアントに突っ込む時点で、
そのサービスをとめられたら終わるんだから、気にする必要があるとも思えんが
そこまで気にするなら、やっぱりサーバーで対応するしかないだろ
>>281 VirtualProtectじゃだめ?
>>283 >この方法は置いといても、ウィルス監視ソフトってどうやってファイルアクセスを横取りしてるんでしょうか。
kernelからでしょ。だからデバドラって話になる。勉強しなおしてこい。
すみません。基本的なことで申し訳ないのですが質問があります。 FindWindowで取得した、既存のウィンドウのハンドルは CloseHandleするべき対象なのでしょうか?
CloseHandleをMSDNで調べるといい
CloseHandleすると当該ハンドルのカーネルオブジェクトが その時点で強制的に破棄される そんなふうに思っていた時期が俺にもありました
290 :
287 :2007/01/26(金) 12:15:23
CloseHandleが閉じることの出来るハンドルにウィンドウは無い。 FindWindowの解説に、取得したハンドルを閉じろとは書いてない。 そもそもウィンドウハンドルを閉じるAPIは無い。 >MSDNを見た限りでは、ハンドルカウントが増えていくため どこにそんなこと書いてあるの?
∩___∩ | ノ ヽ ! / ● ● | こいつすげえアホ | ( _●_) ミ 彡、 |∪| / .\ / __ ヽノ / \ ...\ (___) / .│ ..│ │ │ / ヽ l..lUUU .U
∩___∩ (ヽ | ノ ヽ /) (((i ) / (゜) (゜) | ( i))) /∠彡 ( _●_) |_ゝ \ ( ___、 |∪| ,__ ) | ヽノ /´ | /
∩___∩ | ノ ヽ ! / ● ● | こいつすげえアホ | ( _●_) ミ 彡、 |∪| / .\ / __ ヽノ / \ ...\ (___) / .│ ..│ │ │ / ヽ l..lUUU .U
295 :
坂田 :2007/01/26(金) 12:59:20
ちなみに、ウィンドウハンドルはウィンドウマネージャが管理しているので、 アプリケーションからClose操作できるもんじゃない
296 :
287 :2007/01/26(金) 13:21:57
>>295 すみません。すごい誤解をしていました。
ありがとうございました。
>>281 WriteProcessMemoryで書き換えが可能。
これを防止できる一般的な方法は今のところ無いかな。
nProtect GameGuardのようにこれを防ぐシステムもあるが
結構簡単に破られているのが現状。
WinFSはまだかね?
WriteProcessMemoryにはプロセスハンドルが必要。 だからプロセスハンドルに対する権限をできる限りなくすように頑張ればいいような気がする。 CreateProcessから操られたらだめだろうけどね。
遅延IOとか仮想CPUとか西暦1940年代のテクノロジーがいまに復活すげえ
IDirect3DDevice7の仮想関数テーブルを書き換えてフックをしようとしています。 このテーブルはread onlyだったため、VirtualProtectで属性を変更しようとしましたが、 XPSP2でERROR_ACCESS_DENIEDで失敗します(2KSP4では普通に成功)。 ぐぐって見たところ、IATの書き換えの話ですがPAGE_EXECUTE_READWRITE なら大丈夫という話があったので試しましたが効果なし。 何か原因に思い当たる方はいませんか?
まずエスパー以外にもわかるように書くんだな
言ってることはわかるが解法はわからんね ハンドルはあるんだから権限とか関係なさそうだしなぁ ってかvtableを書き換えるって発想はなかったわ
俺もvtbl書き換えてるけど、XPでも普通に動いてるな。 VirtualProtectでPAGE_EXECUTE_READWRITEにしてから書き換えてる。 むしろ305がどこで失敗しているのか疑問。
APIのドキュメントは新しいのに限るからVISTAのSDKをインストールした。 日本語ドキュメントなんか誤訳がおおいから論外だな。
関連付けされてない画像ファイルを「写真の印刷ウィザード」で開くには どうすればよいのでしょうか? 関連付けではDropTargetでphotowiz.dllを起こすようになってますが。。。
リストの行を縞々になるように交互に色を変えようとしています。 LISTVIEWをサブクラス化してWM_NOTIFY内で NM_CUSTOMDRAWを捕まえてるんですが、 CDRF_NOTIFYSUBITEMDRAWを返しても CDDS_ITEMPREPAINTまでしか送られてきません。 CDDS_ITEMPREPAINT|CDDS_SUBITEMが送られてくる条件は スタイル指定など他にすることがあるのでしょうか?
314 :
デフォルトの名無しさん :2007/01/28(日) 05:03:23
質問時はあげようぜ?
LISTVIEW 背景色 カスタム でぐぐったら一発でみつかったけど
それだと縞々にならないんです
あきらかに
>>315 がいうと思われるサンプルで描画できてる
だいたいCDDS_ITEMPREPAINT|CDDS_SUBITEMは各セルに対する描画要求じゃなかったか?
行単位ならあとは自分で縞にするだけじゃねえのか?
ウィンドウのサイズを固定したいんですけどどうしたらいいですか
WM_GETMINMAXINFO
WS_THICKFRAME
std::cout << "cout\n"; ::CloseHandle(::GetStdHandle(STD_OUTPUT_HANDLE)); std::cout << "cout\n"; // 表示されない コンソールアプリのときコメントのように表示されないのですが、 これはGetStdHandleの戻り値は通常開放する必要はないということで間違ってないですか?
そういうこと。 万が一閉じる必要があったとしても、ハンドルはみんなプロセス終了時にWindowsが閉じてくれる。
325 :
デフォルトの名無しさん :2007/01/28(日) 14:23:44
ここで質問してるバカってPlatformSDKのドキュメントを読まないのか?
326 :
デフォルトの名無しさん :2007/01/28(日) 15:15:12
>>325 むずいから読まんし、インストールもしとらん、
そこで、猫たんとここですよ
327 :
デフォルトの名無しさん :2007/01/28(日) 15:38:07
猫を読んでるのにMFCでダイアログベースのアプリしか作れない奴。 しかも自分でクラスを書けない奴。 哀れだな。
PlatformSDKしかないのか… と必死で読んでたけど、 最近猫の存在に気づいたけど、 もうPSDKに慣れたけど、 もう必要ねーww
逆にMFCでアプリが作れません
330 :
デフォルトの名無しさん :2007/01/28(日) 15:57:57
>>327 漏れのにはMFC付いてないよ、いいな、そんなの付いているの使ってる香具師
だから、ここと猫たん。
もれは、クラスはおろか、プログラムもろくに書けんよ
クラス書けるんだったら、喪前がフリーのMFC互換のクラスライブラリ作って公開してくれよ
インストールぐらいはしてやるから
なんかひとりアツい漢がいる
会社が保存したファイルを強制的に暗号化するtool入れようとしてるのですが これってCreateFile をフックしてるのかなぁ?
NTFSの暗号化だったりして
>>313 です。リストビューをサブクラス化してWM_NOTIFYはヘッダー部分が、
リストビューの親のWM_NOTIFYでアイテム部分が飛んできているようです。
少し検索しましたがこの方法以外で行っているものは無いようです。
リストビューをサブクラスにしてサブクラス内でアイテム部分の背景色を変える方法ってないですか?
PGPdiskとかはドライバじゃないの。
>>334 つまらないことで時間を無駄にしないように
質問する前に簡単なサンプルで確認すべきということだな
>>334 WM_PAINT来たら自分で描画とか?
そもそもリストビューのカスタムドローはサブクラス化なんてする必要ないんだが
リストビュー サブクラス でぐぐったらほとんど答と思われるのがみつかるけど 背景色が頭から離れなくて目にはいらないのだろうか?
>>337 親を動的に変更したいのでできればリストビュー内で完結したいんです
>>338 もう一度探してみます
>>340 こういうのも64-bitVistaからは出来なくなるんだよな?
デバイスドライバまで組まないだろ。 ファイルシステムフィルタドライバだろう。
GetDlgItemで取得したハンドルを関数に投げて GetClientRectやると何故かハンドルが無効のエラー(1400)が出るんだが。 GetDlgItemで取得したハンドルを使って直後にGetClientRectやると成功する なぜだあああああああああああ
345 :
デフォルトの名無しさん :2007/01/28(日) 21:50:16
ヒント: static
>>344 その関数を示してくれないとどうしようもないです。
347 :
344 :2007/01/28(日) 22:01:11
こんな感じ。結構省いてるけど 関数に投げられた時点でハンドルが無効になっとる hTabCtrlの値は0x03030303だった気がする。 値は関係ないよな・・。 static HWND hTabCtrl; /* タブコントロールハンドル */ hTabCtrl = GetDlgItem(hDlg, IDC_TAB); SetSheetPos(hDlg, hTabCtrl, &hTabSheet[0], i); VOID SetSheetPos(HWND hDlg, HWND hTabCtrl, HWND *hTabSheet, SHORT index) { RECT rc; /* サイズ取得様 */ LPPOINT pt; /* LPPOINT構造体 */ /* 初期化 */ pt = (LPPOINT)&rc; /* タブクライアント領域取得 */ GetClientRect(hTabCtrl, &rc); /* タブコントロール領域計算 */ TabCtrl_AdjustRect(hTabCtrl, FALSE, &rc); /* 座標空間へマップ */ MapWindowPoints(hTabCtrl, hDlg, pt, 2); /* ウィンドウサイズ変更 */ MoveWindow(*(hTabSheet + index), rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE); return; }
348 :
344 :2007/01/28(日) 22:05:08
>>345 staticにしてるとまずいとか何かあったっけ?
>>344 >GetClientRectやると何故かハンドルが無効のエラー(1400)が出るんだが
そのエラー値はどこから出てきたの?
350 :
344 :2007/01/28(日) 22:07:59
GetLastError
351 :
344 :2007/01/28(日) 22:08:42
あれだ、staticって関数内でしか使えないから 別関数に渡したりすると値はあるけど使えないとかそんなのか!?
*(hTabSheet + index)
353 :
344 :2007/01/28(日) 22:15:00
アドレスの取られ方がちげええええええええええええ
>>350 GetClientRectは0を返してるの?
成功してるんならGetLastErrorの値に意味はないが。
355 :
344 :2007/01/28(日) 22:30:40
あー、成功してる。 でもなんでRECTの値が入らないんだろう。 リソースがまずいのか
356 :
344 :2007/01/28(日) 23:09:51
タブコントロールプロシージャの初期化で領域破壊が起こってた。
>>341 そういうツールはまっとうな会社が出すんだろうから証明書を買えばいいだけ
LoadBitmapでビットマップの画像を読み込んで、 リソースとして使えるようにしようとしてるんですが、WM_CREATE:で、 hdc1 = CreateCompatibleDC(hdc); hBmp=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,TEXT("BMP_1"); SelectObject(hdc1, hBmp); という感じで順番に画像を読み込んでいってるんですが、 この繰り返しを4つ以上くらいに増やした段階で、どういうわけか コンパイルが通らなくなるんですけどどうしたらいいですか
>>358 くりかえしもなにも、コピペされたそのソースの段階でおかしいが?
>hBmp=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,TEXT("BMP_1");
閉じ括弧たりないよ。
コンパイルが通らないならコンパイルエラーを見ればよかろう
>>359 すいません、それはコピペミスです。
コンパイルエラーは、
”問題が発生したため、Turbo Incremental Linker を終了します。
ご不便をおかけして申し訳ありません。
作業途中であった場合、その情報は失われた可能性があります。”
のウインドウが表示されます。
画像データ読み込みの処理が三つまではうまくいくのに、4つ目を追加したらだめになります。
ソースコードのコンパイル自体は通っていて、
brc32でリソース読み込みの処理が実行されたときに上のウインドウが表示されて
コンパイル手順が中断になります。
そりゃコンパイルの問題じゃなくて、リソースに4枚目のビットマップを入れたから出たエラーだろ C++のソース関係ないじゃないか。 bccのスレみると、「リソースだけのDLLを作れ」とあったが・・・
365 :
独り言 :2007/01/29(月) 16:41:17
CreateProcessWの第2引数はL""で直接書くのは駄目なんだな
そうとう頭わるそう
シグネチャみればわかる話
LoadBitmapの第2引数は、MAKEINTRESOURCE・・・ スネーク、忘れてくれ
GetFileInformationByHandle で得られるファイルIDはシステムの状態に依存せず常に同じ値なのでしょうか?
>>369 nFileIndexHighとnFileIndexLowのこと?
MSDNに詳しく書いてあるぞ。
質問です。 WM_PAINTの処理を BeginPaint〜EndPaint ではなくて ValidateRect を利用して 処理しようと考えています。 GetDC にて DC を取得するタイミングはどので行うべきなのでしょうか? WM_SIZE WM_WINDOWPOSCHANGED とかでしょうか?
いつでもいい
>>372 WM_NCCREATE 内はまずいんでない?
>>371 ほんとにそんな処理が必要なのか?
GetDC呼ぶタイミングは、いつでもおk
375 :
374 :2007/01/29(月) 18:48:36
リロードすべきだった・・・orz いつでもとは言え、常識の範囲内で頼むw ウィンドウ出来る前とか、ウィンドウ破壊したあととかは勘弁なwww
376 :
358 :2007/01/29(月) 18:55:10
うーん、うまくいかない。プログラムで使用する画像を一つにまとめて、 画像の読み込みを一回だけにしてもだめでした 容量の小さい画像が2,3回の読み込みだったらうまくいくのに。 画像を減色したりいろいろしたけど、どうもある容量を超えるとエラーが出るようになってるみたい。 画像は外部から呼び出す仕組みままにしとくか…
>>376 だから、C++Builderのリソースコンパイラの仕様なんだろ。
リソースコンパイラを代えるか小さいサイズで収まるように
するしかないんだろう。
とにかく、Win32APIは関係ないから
379 :
371 :2007/01/29(月) 19:24:39
WM_NCCREATE 以外で呼び出すといいんですね。ありがとうございます。
すごく馬鹿だと思います
うおおおVS.NETでやったらうまくいきました! 今日朝起きてからずっと12時間近くこれに悩んでました。 コンパイラの仕様だと教えてくれたかたありがとうございました。 これで先に進める。 それとBorland C++Compilerはbcc developerと共にごみ箱にポイしよう
有償の開発環境くらい買えよ
あした新宿か池袋行って買うことにします ありがとうございました
今、圧縮ソフトを作っているのですが、 処理が終わった後に自分自身を消去するプログラムって作れますか? 自己解凍形式を作りたいのですが。
>>385 MoveFileEx(プログラムファイル,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
確か、こんなんでおk。
ただし再起動が必要
388 :
385 :2007/01/29(月) 22:56:04
ありがとうございます。 再起動が必要なのですか。 ちょっと微妙ですね。
>>388 小汚い手段でもいいならバッチファイルでも使いなされ。
390 :
385 :2007/01/29(月) 23:08:34
うーん、やっぱりユーザーに削除してもらうことにします。 ありがとうございました。
再起動のいらない自己削除の方法なら何度か過去ログに出てるよ
質問です。 他プロセスが作成したMutexをクローズする処理はどのように行えばよいでしょうか? OpenMutexで取得したハンドルをCloseHandleで閉じても、自プロセスでのMutexがクロー ズされるだけで、他プロセスのMutexは閉じれません。 カーネル関係のAPIでカーネルが管理している各オブジェクトハンドルが取得できるらし いのですが…
395 :
393 :2007/01/30(火) 00:00:00
>394 DuplicateHandleですね? 試してみます。 ありがとうございました。
閉じない限りいつまでもプロセスハンドルテーブルに残り続けてハンドルリークするから。
>>397 んじゃぁ、pi.hProcessの有効範囲をWaitFor〜関数でチェックし、
そのタイミングで消しても別におk?
>>398 もちろんおk
つーかWaitFor〜使う予定なら閉じたら逆にまずいだろ
401 :
デフォルトの名無しさん :2007/01/30(火) 09:43:35
mouse_eventを使えばアクティブウィンドウにマウスカーソル移動のメッセージを送ることができますが, カーソル座標をアクティブウィンドウ内の座標系で指定するにはどうすればよいでしょう?
ClientToScreen() とか ScreenToClient() とかの話?
403 :
401 :2007/01/30(火) 10:05:08
>>402 まさに探し求めてたものずばりです
即レス感謝!
404 :
デフォルトの名無しさん :2007/01/30(火) 12:51:57
OSの入力バッファ(DirectInput、Windowsメッセージより上位)に直接登録するのって、 どんなAPIとかでやるんでしょ。 まったく想像がつかないので、ヒントとか読むべきところとかもらえないでしょうか。 もしかして、ドライバとか?
入力装置を自作
SendInput?
HIDドライバ HIDフィルタドライバ SendInput (keybd_event) また自動実行マクロか
>>405-407 ありがとう。ちみたちあいしてる。
読んでみます。
>>また自動実行マクロか
正解。ゴーストリプレイというソフトの存在を知って、すげーと思い、どうやって実装しているのか試してみようとおもった。
まずはキー入力制御から。Webアプリの自動テストとかにつかえそうだし。
業務アプリとかしかつくってない自分からするとカーネル領域への書き込みとかなんか聞くだけですげーし、
プロセス隠蔽機能/ステルス機能とか業務アプリとかでも役立ちそうだし、イイ勉強ネタだとおもったんで。
お返事、ありがとう。
業務アプリのプロセス隠蔽なんて
>>374 遅レス
ハンドラ側はリージョン更新だけで、DirectX で窓内の描画してるんじゃね?
411 :
326 :2007/01/30(火) 15:09:56
はじめましてm(__)m よろしくお願いいたします(^^ゞ リソースから画像を読み込むたびにメモリが溜まっていってしまいます DeleteObjectで解放しているのですが…、同じ画像を読み込む場合は大丈夫 なのですが、まだ読み込んでいない画像を読み込むとメモリが溜まっていって しまいます。これはしかたのないことなのでしょうか?もしよろしければ おしえていただけると幸いです。 こちらはWindows XPでVS2005を使っております なにとぞよろしくお願いしますm(__)m
412 :
デフォルトの名無しさん :2007/01/30(火) 15:44:12
ダイアログボックス上の文字列を多言語対応させるために 文字列リソースに各国語毎のストリングテーブルを作って、 表示させたい言語に応じてSetThreadLocale()してから LoadString()し、これをダイアログ上のスタティックテキストに SetWindowText()してたんだけど、2000/XPではちゃんと表示されてたのに Vistaでは言語が切り替わらなくなってる・・・ SetThreadLocale()後にGSetThreadLocale()してみると確かに ロケールIDは切り替わっているのに、ロードされる文字列は デフォルト(OSの言語)のまま・・・・・ マニフェストで管理者権限を要するにして実行しても同じ。 同じ経験された方、理由の解る方、おりませんか?
>>411 メモリリークなら、malloc()したのをfree()していないか、newしたのをdeleteしていないか。
DeleteObjectしなくて溜まるのはGDIオブジェクト。
414 :
326 :2007/01/30(火) 16:12:05
>>413 ありがとうございますm(__)m
メモリリークなのですがmalloc()もnewも使ったことがないから多分
違うと思います。HBITMAP型の変数に上書きしていっていることに
何か原因があるんでしょうか?
もうちょっと状況を詳しく いったい何を持ってメモリが溜まると判断してるのか、溜まると何が困るのか。 LoadBitmap()使ってるならそう書け
>>413 GDIオブジェクトがメモリを消費しない、みたいな言い方で誤解を招くな
それなりのサイズのHBITMAPをリークすれば、メモリも消費するべ
>>414 おい、ちゃんと上書きする前にDeleteしてるんだろうな・・・
>>414 とりあえず、タスクマネージャでGDIオブジェクトの数が増え続けてないか確認しろ
418 :
326 :2007/01/30(火) 16:22:14
>>415 すいません、LoadBitmap()を使っていてHBITMAP型の変数に上書き
するたびにタスクマネージャのメモリ使用量が増えていっているため
です。そのあとDeleteObjectで解放をしていますが次の画像を表示
するたびにメモリ使用量が1.37MBづつ増えていってしまうのです。
419 :
326 :2007/01/30(火) 16:26:36
>>417 タスクマネージャでGDIオブジェクトの数が増え続けています。
SelectObjectしたままDeleteObjectしてるとか。
うんこしたままおしっこしてるとか。
422 :
326 :2007/01/30(火) 16:31:26
>>420 それはないです、戻り値に0以外の数字を確認しました(DeleteObjectの戻り値)
423 :
326 :2007/01/30(火) 16:34:06
上書きしちゃったらDeleteObject()できないと思うんだが・・・
最終後始末のことを考えなければ DeleteObject(dc, SelectObject(dc, LoadBitmap())) 差し替えなんてこんなもんだろ?
hbmp = LoadBitmap(・・・); SelectObject(hdc, hbmp); hbmp = LoadBitmap(・・・); SelectObject(hdc, hbmp); ・ ・ ・ DeleteObject(hbmp); ↑な順番でやってるならGDIの基礎から勉強しなおしてこい。 hbmp = LoadBitmap(・・・); hbmpold = SelectObject(hdc, hbmp) SelectObject(hdc, hbmpold); DeleteObject(hbmp); こうするのが正解
それは元の質問者の HBITMAP型の変数、が出てこないから
430 :
326 :2007/01/30(火) 16:53:06
>>427 ,425
426の方の正解の方法をとってました。
が425の方法に変えてやって見ましたが、やはりタスクマネージャーの
メモリ使用率が増えていってしまいます。
432 :
デフォルトの名無しさん :2007/01/30(火) 16:55:34
LoadLibraryされた時に走る関数内(例えばDLL内アプリケーションクラスのInitInstance等)で デバイスアクセスっぽいAPI(例えばwaveOutGetNumDevs)呼ぶのって、何か問題ですか? XPだとうまくいくのに,Vistaだとうまくいかない(0が返ってくる)。。 教えて下さい。
433 :
326 :2007/01/30(火) 16:59:48
>>431 はい、画像枚数が少ない間はそれでいいんですけど
増えていった時に困るでしょう(;_:)
434 :
326 :2007/01/30(火) 17:02:03
>>429 すいません、MFCはまだ勉強できておりませんので、
しかしわざわざありがとうございますm(__)m
ウィンドウプロシジャ内で break; 付け忘れてるとかいうオチはないだろうな? case xxx: 差し替え側コード; case xxx: 生成側; break; # 昔はまったことがあるw
436 :
326 :2007/01/30(火) 17:06:53
>>436 確認しましたがそれは無いようです(^^ゞホッ
438 :
326 :2007/01/30(火) 17:18:18
>>437 それはないと言いますと、この手順で間違いがないということでしょうか?
タスクマネージャのメモリ使用量ってアレだな。 リソースがディスクからデマンドページングで読まれても 増えるんだっけか?
>>433 別に困らんが?
システムの動作に文句つけたいんならもうちょっと調べろ矢
441 :
326 :2007/01/30(火) 17:38:43
すいません。ありがとうございました
ワーキングセットサイズから物理メモリと仮想メモリを見てメモリリークを確認 ハンドル数をチェックしてハンドルリークを確認 メモリリークチェッカーでリーク箇所があるかをチェック MSのサイトからランタイムがリークするネタをチェック。同様にOSがリークするネタを同様にチェック ローディングされているモジュール一覧からIME等DLLを注入してくる系統をすべて排除 グローバルフック、CreateRemoteThread系でDLLを後から打ち込んでくるものを排除 英語版Windowsでチェック、ドライバをデフォルトのものにする
もしかしてGetDCとReleaseDCの予感
444 :
326 :2007/01/30(火) 19:20:43
>>442 ワーキングセットサイズ自体の見方がわかりません(~_~;)
最小限のコード組んで何処で増えているのか、或いは減るべきところが減っていないのか調べろ。
PrivateProfile系のAPIは、セクション名やキー名の途中に半角スペースが含まれていても 環境に依存せず正常に動作するでしょうか
環境っていったいなんの環境なのか
450 :
326 :2007/01/30(火) 21:40:31
>>445 case WM_LBUTTONDOWN:
hdc = GetDC(hWnd);
DeleteObject(SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION)));
InvalidateRect(hWnd,NULL,FALSE);
ReleaseDC(hWnd,hdc);
break;
case WM_RBUTTONDOWN:
hdc = GetDC(hWnd);
DeleteObject(SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION)));
InvalidateRect(hWnd,NULL,FALSE);
ReleaseDC(hWnd,hdc);
break;
こんな感じで組んでます。やはり画像を出した後タスクの
メモリ使用量が増えていってしまいます。
451 :
326 :2007/01/30(火) 21:46:30
>>451 のつづき
こんな感じで最小限に小さくしました。
減ったところはありません
>>451 hdc2ってなに?
SelectObject前のビットマップはどこへ?
SelectObjectの戻り値をDeleteObjectしてるわけだが、LoadImageしたhBitmapはどこでDeleteObjectしてるかと…
SelectObjectより 解説 この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。 アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。 hdc2がキャッシュだったら重要じゃないかもな
455 :
デフォルトの名無しさん :2007/01/30(火) 22:19:05
hdc2ってのがWM_PAINTで画面に描画するメモリDCなわけね。 んで新しいのをSelectObjectしたときに、前のをDeleteObjectしてる、と。 GetDC / ReleaseDC は要らないけど、害も無さそう、と。 初回はLoadImageしてないのを DeleteObject してるので、そこはマズそう。 2回目以降は別に問題ないんじゃない? hdc2 の生成と破棄のあたりを曝してみては?
僕ハッカー
457 :
326 :2007/01/30(火) 22:25:12
>>452 ,453
すいません、今組みなおしました、
case WM_LBUTTONDOWN:hdc = GetDC(hWnd);
hBitmap = SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION));
BitBlt(hdc,0,0,800,600,hdc2,0,0,SRCCOPY);
DeleteObject(SelectObject(hdc2,hBitmap));
ReleaseDC(hWnd,hdc);
break;
case WM_RBUTTONDOWN:
hdc = GetDC(hWnd);
hBitmap = SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION));
BitBlt(hdc,0,0,800,600,hdc2,0,0,SRCCOPY);
DeleteObject(SelectObject(hdc2,hBitmap));
ReleaseDC(hWnd,hdc);
break;
こんな感じに直しましたが結果は同じでした。
hdc2はメモリディバイスコンテキストです。
458 :
326 :2007/01/30(火) 22:30:07
>>455 hdc2の生成はこんな感じで↓
hdc2= CreateCompatibleDC(hdc)
破棄のときは↓
case WM_DESTROY:
DeleteDC(hdc2);
PostQuitMessage(0);
break;
こんな感じでやっております。
hdc2= CreateCompatibleDC(hdc)はWM_CREATEあたりでやってるのかな?
ちなみにWM_PAINTは?
461 :
326 :2007/01/30(火) 22:39:57
>>459 ,460
hdc2= CreateCompatibleDC(hdc)はWM_CREATEでやっております
WM_PAINTは
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,0,0,800,600,hdc2,0,0,SRCCOPY);
EndPaint(hWnd, &ps);
break;
こんな感じです。
面倒だ。全部どっかのアプロダにUpしろ。
お前のプログラムのメモリ消費より くだらんことでスレが消費される方が痛いわ
>>412 うまくいかない理由は知らないけど、
回避策として FindResourceEx でリソースから文字列をロードしたら?
これなら言語を明示的に指定てきる。
>>461 WM_CREATEのhdcはどっから生成?
hdc2= CreateCompatibleDC(hdc);
こんときのhdcは有効な値?
俺はベタで言われたとおりコピペったが? 普通に動くし
468 :
326 :2007/01/30(火) 23:43:18
>>467 すいません、動きませんでした。なんかアプリケーションを最初から
インストールしてくださいみたいなのがでて、実行できませんでした。
やっていることが滅茶苦茶だ。 リソースは必用なときに選択して、使い終わったら元に戻せ。 選択しっぱなしにしたり、管理が曖昧な状態でタイミングで削除するな。
>管理が曖昧な状態のタイミングで削除するな。
472 :
326 :2007/01/31(水) 00:08:34
>>467 すいませんなんとか動きました、
しかしこれも新しい画像を読み込むと
メモリ使用量が増えますよね。
bitmapの描画って普通はメモリDCにSelectObjectしてから BitBltとかでメモリDCからスクリーンに転送するんじゃないの?
474 :
デフォルトの名無しさん :2007/01/31(水) 00:12:55
C言語+APIでWinプログラミング始めたんですが、 デバイスコンテキストがやたら出て来るんですけど、 デバイスコンテキストがわからねー、何なのこれ?????
475 :
326 :2007/01/31(水) 00:14:39
>>469 リソースを元に戻すとはどのようにですか?
すいません、ほんと質問ばかり。
>>471 Visual Studio 8です。
>>474 グラフィック・デバイス・インターフェイスを抽象的に扱う【対象】。
例えば、
『▲に叩かれる』とした場合、
▲に相当するものが、姉,妹ならば、
『姉,妹は俺を叩くことができるコンテキスト』となる。
んで、『俺を叩くこと』を『描画する』に、
『姉』はディスプレィ,『妹』を『プリンタ』にそれぞれ変換するとだな
477 :
デフォルトの名無しさん :2007/01/31(水) 01:49:44
>>476 どうもです、超入門レベルでスマソですが、
抽象的に扱うがなんなのか?なんです。
デバイスコンテキストで描画に関する何を管理(管理という言葉が正しいか?)してるのか?なんです。
描画対象のHWNDが分かれば、HDCは不要な気がするのですが...
「抽象的に扱われるなにか」を隠蔽してエンドユーザー(API利用者)が HDCやHWNDやHANDLEという単純な「型」だけを意識すればいいようにする仕組み なにが抽象化されているかは公開されていないから考えないのがオトナ あとHWNDからHDC取れるけどプリンタとかその他の要素もHDCを介するから HWNDイコールHDCで考えるのは間違い
質問です 子ウィンドウを動かす際に、 GetWindowRect(子ウィンドウハンドル,rect); MoveWindow(子ウィンドウ,rect.left,rect.top,幅,高さ,TRUE); とすると、繰り返すことでどんどん下に下がって行きます。 GetWindowRectの座標の原点が親のウィンドウのフレームを含めた左上に対して、 MoveWindowの原点が親のウィンドウの描画領域の左上なことは分かりました。 この差を吸収するAPIはありますか? それとも事前にフレームとの差を保存しておくしかないでしょうか?
>>479 GetWindowRectが返すのはスクリーン座標だから、親のウィンドウは関係ない。
スクリーン座標からクライアント座標への変換はScreenToClient
親のハンドルでScreenToClientすることでできました ありがとうございました
482 :
デフォルトの名無しさん :2007/01/31(水) 02:52:12
test
>326 描画せずに、LoadBitmap直後にDeleteObjectしてみれ。 それで現象が変わらないなら、>439じゃねーの。
>>439 例えば、ビットマップ表示後にウィンドウを最小化して再び最大化したら、
メモリ量は解消されているのかな?
OS側でメモリの解放さぼってるだけだろ 頻繁にやっても効率わるいだけだし
とりあえず、
>>419 だそーだから、リークしてるのは確かぽくね?
そんなに気になるんならタイマーかなんかで何回も繰り返してみりゃいいじゃん HDBENCHみたいな感じで
同じビットマップだと変化しないそうだから、ビットマップリソースに限られるんじゃね で、確かにDestroyしてるっつーんなら、OSが後回しにしてるだけだべ
490 :
デフォルトの名無しさん :2007/01/31(水) 10:17:04
ShellExecuteでエクスプローラを使ってC:を開こうとして ShellExecute(NULL, NULL, "C:\\", NULL, NULL, SW_SHOWNORMAL); と書くとちゃんと、一見何の問題もなく開けるんですけど、デバッグウィンドウに 例外処理 (初回) は ***.exe (KERNEL32.DLL) にあります: 0x000006BA: (名前がありません)。 と出ます。書き方おかしいのかな? SDKのドキュメンテーションにも ShellExecute(handle, NULL, <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL); と書いてあるし間違ってはいないと思うんだけど… 第一引数を与えても出ます。何でか分かる人いますか? Visual Studio 6.0 Platform SDK February 2003 WindowsXP SP2 です。 出ても問題ないような気もするけどなんとなく気持ち悪い…
中で例外使った処理してるだけだろ。 仕様だろうから諦めるしかないんじゃね。
492 :
326 :2007/01/31(水) 15:03:43
>>484 最小化して元に戻したらメモリ使用量は結構減りました。
なんでだろ??
webからphpを利用してサーバ内でcmdプロンプトを立ち上げ、サーバのモニタ上に表示させるようにしたいと思ってるのですが、 system()でcmdを実行してもプロセス(cmd.exe)は立ち上がっているのですが、ウインドウが非表示になってしまいます。 表示で起動する方法はありますか?
>>494 ありません。他の方法を考えましょう(デスクトップと対話可能なサービスと通信するとか)。
Webサーバは何をどうやって動かしてるの?
>>495 レスありがとうございます。
デスクトップと対話可能なサービスって、例えばなにかご存知でしょうか?
環境はApache/2.0.54 (Win32) PHP/4.4.2 で、
WEBから起動し、リモートデスクトップ見た時にウインドウが立ち上がっていることを確認したいのです。
いやだからそのWebサーバはどうやって起動してんのかと サービス? サービスだったら、サービスの設定で対話可能にするチェック入れてみ 自分でサービス書いたほうが楽だとは思うが、 それよりも、Syslog を導入してそれ使うのがいいと思うよ
499 :
490 :2007/01/31(水) 15:46:15
>>491 中で例外使ってるといっても正しく呼び出してるのに何で例外になるのかと思って
何が気に食わないんだろう
何が気に食わないんだろう
サトエリかよw
502 :
デフォルトの名無しさん :2007/01/31(水) 16:50:42
ReadDirectoryChangesW を使って以下のフラグ設定をし、 IOCPを使って非同期でディレクトリの監視を行っています。 FILE_NOTIFY_CHANGE_FILE_NAME FILE_NOTIFY_CHANGE_LAST_WRITE FILE_NOTIFY_CHANGE_SIZE 処理としては以下の流れです。 1. 監視するディレクトリのとスレッド・IOCPと関連付け 2. ReadDirectoryChangesW でディレクトリの監視を開始 3. スレッドで変更を検知したら、処理を行って、 スレッド内部で再び ReadDirectoryChangesW を呼び出す 質問なのですが、監視対象のディレクトリでファイルが1つだけ変更されたとき、 「3」の部分が2回実行されてしまいます。(1階の変更で変更通知が2回来る) これはなぜなのでしょうか? また、通知が2回来たとき、1回目を無視する方法はありますか? よろしくお願いします
フラグの処理まちがってんじゃね?としか
>>499 例外というのは単なるエラーではない。
状況や結果を表す為にライブラリ等が敢えて発生させるもの。
「例外が発生した=問題がある」ではない。
ウィンドウの左上のアイコンを非表示にしたいんですけどどうしたらいいですか
透明なアイコン作っていれとけ。
>502 とりあえず変更バッファにでも保持しといて、しばらくしてから実行すれば。
システムメニュー外すとか
>>502 非同期の待機処理が誤っているんじゃ?
結果、FILE_NOTIFY_CHANGE_SIZEの完了までに、
処理が2回走ってんじゃね?
510 :
sage :2007/02/01(木) 00:27:28
タスクバーのボタンを消すのってどうすればいいのでしょ? WS_EX_APPWINDOW を消して、WS_EX_TOOLWINDOW を付けて、 CreateWindowEx() すれば、タスクバーにボタンは出ないことはわかった。 が、既に作ったウィンドウに対して GetWindowLong() & SetWindowLong() で 同じ事をしても、ボタンは消えてくれない。なぜ??? SPY++ で見る限り、style は同じなのだが。
タスクバーに通知
SetWindowLongだけでは適用されないスタイルは ShowWindowとかSetWindowPosすると適用されたりする。 非公式な動作なので保証はできないが。
>>511 ボタン出す時は、WM_USER+1280 投げればよさげ。
消すときがわからん
>>512 HIDE→SHOWしてもだめ
SWP_DRAWFRAME もだめ
WM_USER+1280ってことは、ツールバーコントロール的に、やれってこと?
VCLアプリだとShowWindow(Application.Hnadle, SW_HIDE)で
いっそのことタイトルバー消しちゃえば良いんでないの? とか言ってみる
そして自前でタイトルバーらしきものを描画するってか
表示しないウインドウの子ウインドウ
>>516-517 自前タイトルバーにドラッグ機能つけんといかんが、
その方法が手っ取り早いと思う。 問題はWinバージョンに
よってタイトルバーデザインが異なる点をどうするかだけど。
ドラッグはNCHITTESTでTITLE返せばいいだけだけど、 自前描画で解決は道が違うだろう
ITaskbarListいじっちゃうとか
私をいじって♪
Vistaのエクスプローラの、 「詳細ペイン」とか「プレビューペイン」を表示/非表示するコマンドを もしかして知ってる人いないですかね。いませんよね。
vista系のスレで聞いてみれば
消せた。 CoInitialize((LPVOID) NULL); ITaskbarList *pTL; HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void**) &pTL); pTL->HrInit(); pTL->DeleteTab(hwndTarget); // 消したいウィンドウを指定 pTL->Release(); CoUninitialize(); EXSTYLE 関係無く、消せるのね。 でも EXSTYLE ちゃんとしとかないと、非アクティブ→アクティブで、 再スキャンされて、またボタンが出てくる。 EXSTYLE だけの設定で、再スキャンさせて消してもらう方法は無いのか?
サウンドの多重再生はどうやったらできますか
むかーしMS謹製非サポートのサウンド多重再生ライブラリがダウソできた記憶が…… 今ならDirectX使え、ってことになるのかも
WDMドライバなら、カーネル側で合成してくれなかったっけっか。 それを期待できないほど古いハードウエアならご愁傷様。
>>529 おまえそれWindows95時代の話じゃないか?
wavemix懐かしす
>>510 hide なウィンドウ1個作って
そのウィンドウを親にして子ウィンドウを作っていく。
とか。
つーかそれしかない
最初からボタン出さないならTOOLWINDOWでいい 今回は途中で消したい あ、サイズ0で親作って途中でHIDEしろってことか フラグに比べると面倒だなぁ
MessageBoxってスレッドセーフなんでしょうか また、もしスレッドセーフだったとして スレッドセーフとか考えずにMessageBoxのラッパを書いたら スレッドセーフじゃなくなるものでしょうか
最初からHIDEでいいじゃん
>>536 MessageBoxに対して複数スレッドからアクセスすることなんてある?
何しようとしてるの?
C++のストリームみたいにアクセスできる メッセージボックスのラッパを書いて使ってたんです シングルスレッドでは、特に問題なかったんですが グローバルなマウスフックのプログラムを書いていて mbstream << x座標 << y座標 << std::endl; mbstream.show(); //ここでメッセージボックス表示 メッセージボックスを表示した時に 同じ座標の値が一つのメッセージボックスに大量に表示されてしまいました なので、もしかしてマルチスレッドの問題かなと思ったんですが 見当違いだったらすみません
プログラムの問題
541 :
デフォルトの名無しさん :2007/02/02(金) 11:16:56
GetPrivateProfileString で ini ファイルを読もうと思っているのですが、 セクション名のないキーの値を取得することはできないんでしょうか? 普通の ini ファイルの中身は [hoge] fuga=unko のようになっていますが、事情があって fuga=unko しか書いていないのです(変更することはできません)。 試しに DWORD result = GetPrivateProfileString("", "fuga", "", 値へのポインタ, MAX_PATH, iniファイルへのパス); と、セクションに空文字列を設定してみましたが、空文字列が取得できただけでした。 やっぱり自分でファイル開いて読むしかないでしょうか?
textで読めばいいと思うよ
やっぱそうですよね、ありがとうございました。
544 :
393 :2007/02/02(金) 12:16:06
DuplicateHandleで他プロセスのMutexをクローズできるかどうか質問した者です。 DuplicateHandleを試してみたのですが、SourceHandleを設定する際に、他プロ セスのハンドルを取得することができません。他プロセスのMutexハンドルを取得す る方法はあるのでしょうか? または、ProcessExplorerみたいに他のプロセスのハンドルを列挙してハンドルを閉 じるということはできるのでしょうか?
>>541 ファイルの中身をコピーして、頭にセクション名を付加するといいぉwww
>>539 とりあえずストリームとメッセージボックスに問題を分けてみよう。
これでどうよ。
std::basic_ostringstream<TCHAR> os;
os << x << y << std::endl;
MessageBox(0, os.str().c_str(), TEXT(""), MB_OK);
MessageBoxが止まるのは、呼び出したスレッドだけだし。 中でメッセージループは回るし。 グローバルフックなら、各アプリケーションの各スレッド全部が MessageBox出すだろそりゃ。
MessageBoxって、下にあるWindowに WM_PAINT処理があっても再描画してくれない?
>>549 くれるよ(別にMessageBoxが再描画するわけじゃないけど)。
>>547 試してみました。長文になりますがお許しください
該当部分のソースです
if(wp==WM_MBUTTONDOWN){
MOUSEHOOKSTRUCT*pm=(MOUSEHOOKSTRUCT*)lp;
std::basic_ostringstream<TCHAR> os;
os << pm->pt.x << pm->pt.y << std::endl;
MessageBox(0, os.str().c_str(), TEXT(""), MB_OK);
//MessageBox(0,L"a",L"aa",MB_OK); //上3行をこれに変えても同じ結果
}
マウス中ボタンをほんの一瞬押しただけで
メッセージボックスがわんさかでます
なお、前回からわかった点は
MessageBox(hwnd,L"",L"",MB_OK);
このようにウィンドウハンドルを指定すると
メッセージボックスは1つしかでません
このとき、入力データを.exe側にポストすると
普通にデータがきているみたいでした
一言でまとめると、ウィンドウハンドルを
指定したら同期処理されてるっぽい?
あ、名前欄入れ忘れた 551は536です
・・・・・・
>>551 全プロセスの全スレッドでそれが動いて、hWnd が有効な1つのプロセスでだけ
「メッセージボックスは1つしかでません 」ってことじゃないの?
それは別としても、グローバルフックでメッセージボックスは出さない方がいいと思うよ。
キチガイはいきなりわけわからんことやるから怖い
>>554 メッセージボックスをたくさん出したいわけではなくて
単にフォアグラウンドのスレッドのマウスの軌跡を表示させたかったんですが
ええと、これってそもそもスレッドセーフとか全然関係ないことでしょうか
>>それは別としても、グローバルフックでメッセージボックスは出さない方がいいと思うよ
次からそうすることにします
ブレークポイントとかきかないし、フック処理はデバッグ難しいですね
>>556 スレッドセーフっていうかさ、どんなライブラリをリンクしているとも知れない他所の
プロセスにコード挿入して
std::basic_ostringstream<TCHAR> os;
os << pm->pt.x << pm->pt.y << std::endl;
って大丈夫?どこのヒープからどうアロケートされることを期待してるんだ?
win32apiの関数だけでサウンドの多重再生できませんか? サウンドの多重再生を実現するためだけにDirectXを勉強したくないんですけど
背伸びし過ぎ だから不具合が出たときも検討違いのところしか 考えられなくて原因が追求できない
>>557 すみません、ライブラリのリンクがどう関係するかまではわからないんですが
DLL挿入先のプロセスのアドレス空間でアロケートされると思ってます
今は暗黙のリンクにしているので
.exeのほうで静的なコンストラクタ等が呼ばれるよりも前に
各DLLのDllMainが呼ばれて、おそらくこのタイミングで
ストリームの初期化が行われているんだと思ってます
ストリームではなくデータをどう保存するかは考え中だけど
今のところメモリマップトファイルに保存しようと思ってます
>>558 DirectX勉強する方が遥かに楽だよ
>>561 そうすか。
じゃあ画像描画の部分もdirectX使ってプログラム全部書き直すかなあ。
ああ面倒くせ挫折するかな
>>558 Vistaが出て、今後益々Windowsのマルチメディアの中核にDXが来るこのご時世に
そんなわがまま言ってるようじゃプログラマじゃないぜ
より少ない労力でより良い効果を出すのがプログラマですよ?
DllMainのDLL_PROCESS_ATTACH内でメモリリークさせた状態でFALSEを返して、 クライアント側のロードを失敗させた場合って クライアント側のプロセスにとっては事実上リークはなかったことになるんでしょうか?
>>562 何のためにDirectXがコンポーネントになってると思う?
DirectSoundを使うからと言ってDirectX Graphicsまで使う必要は無いぞ。
ochinchin.h を manko.cpp に include したはずなのに童貞が捨てられません
#ifndef WOTAKU で除外されてるからさ
>>560 デバッグメッセージは、WM_COPYDATAを使って送りつけるといい。
素朴な疑問。 SysListView32とかToolBarWindow32とかは、 64bit環境でも同じ名前なの?
>>570 同じ。64bit DLLがsystem32にあって32bit DLLがSysWOW64にあるくらいですから
573 :
デフォルトの名無しさん :2007/02/03(土) 04:37:26
CCritSecクラスをDLLのグローバルインスタンスで宣言した場合、 これは正しくCRITICAL_SECTIONを初期化できるのでしょうか? それともDllMainが処理された後でないと正しくInitializeCriticalSectionが成功しないのでしょうか?
デバッグして自分で確認すればいいじゃないか。
ごめん。おいらの勘違いだった。 どうもイベントハンドルをもったまま終了するスレッドがあって そいつのせいでおかしくなって他っぽい。 そのバグとったらクリティカルセクションで守っているコードブロックを同時にアクセスしなくなった。
576 :
デフォルトの名無しさん :2007/02/03(土) 10:51:43
ディレクトリ以下を再帰的に全部削除してくれる API ってない? DeleteDirectory じゃ空じゃないとだけだから面倒なんだよねぇ。
ShellExecuteで、rd /s (NT)かdeltree (9x)を呼んだら? まあたぶんシェル関係の関数で何かありそうな気がするけど。
自分で再帰的に削除するぐらい簡単に作れるだろ。
作らなくてもあるけど思い出せない
boost::filesystem::remove_all
SHFileOperation
583 :
582 :2007/02/03(土) 12:00:21
ごめん、かぶったか。
念のため実行して確認してたんで・・・
>>576 ということで、間違いなくできるから。
確認やエラーのダイアログはフラグで出す出さない指定できるから。
GDI+で画像拡大すると、ドット半分(2倍なら1ドット、16倍なら8ドット)左上にずれてしまうんですが ずれなくする方法はないでしょうか?
>>584 倍率の半分だけ右下にずらして描画する。
XP SP2のネットワーク共有フォルダのファイルをFindFirstFileで 列挙すると、とても遅いんですが、なんとかならないでしょうか。 フォルダに2000ファイルぐらいあると10秒以上掛かります。 Windows2000では一瞬だったのに。 ネットワークドライブ、\\ホスト\共有名\〜のUNCパスどっちも遅いです。 ただし、共有フォルダの列挙が遅いだけで、 他の通信やファイルの読み書き自体は正常な速度です。 リンク速度は100Base-TXで、PCのEthernetチップは両方ともIntelです。 SH経由なら速いかなと思いましたがExplorerからも同じぐらいの遅さでした。 ポリシーやレジストリの設定くさいんですが、何かあるでしょうか?
エクスプローラより遅いかどうかだな
ネットの設定だな。名前解決が遅いネットワークに組みあがっているんじゃない? 何にしてもお前の問題だしスレ違い。
>588のいうとおり名前解決の問題か、ログオン処理の問題か、考えられるのはそんなところか。 WNetAddConnection2でログオン処理をしてる?
590 :
デフォルトの名無しさん :2007/02/03(土) 23:54:00
いま、C+Win32APIでwinプログラムの勉強を始めたばかりなんだが、 親ウインドウのHWNDを子ウインドウで使うんでグローバル変数に保存したいんだが どこで親のHWNDを取得するのがよい? たとえば 1. 親ウインドウをCreatWindow(Ex)した時の戻り値のところ 2. 親のプロシージャのWM_CREATEメッセージのところ(でプロシージャの引数をコピー) 等など
>>590 子ウィンドウ側がGetParentで取得
592 :
デフォルトの名無しさん :2007/02/04(日) 00:00:56
>>591 早い答え、dクスです
グローバル変数に保存するのではなく、必要なときにGetParentすると言うことですね
>>558 すでにバッファにある音を再生できているなら、APIを使う必要すらないよ。
単にwavをバッファで合成してから出力するだけだし。
デバイス周りからやらなきゃならないなら、他の人が言うようにDirectSound使うのがいいかもね。
>>592 補足
GetParent()ぐらい大したオーバーヘッドにはならないし、
下手にグローバル変数やメンバ変数使うよりも
その都度取得した方が確実で読みやすいコードになる
そういえば、constがついてないグローバル変数は10年以上使ってないなw _Moduleだけは使わざるを得ないけど。
サウンドの多重再生で悩んでるものですが、 DirectSoundはC言語のみでは利用できませんか 自分が作ってきたプログラムがC言語のみで書かれてるので、 C++で書かれたDirectSoundのサンプルコードを自分のプログラムに追加できませんn 萎える
C++コンパイラなら普通に使えるだろ
>>596 dsound.hにC向けのマクロが用意されている、はず。
lpVtblから直接書いてもいいし。
599 :
596 :2007/02/04(日) 20:17:24
自作のプログラムの拡張子をcppに変えて、コンパイルエラーが出ないように修正した上で、 DirectSoundのコードを追加することにより解決しました、ありがとうございました。
Listviewのツールチップで困っています。 LVS_EX_INFOTIPを設定し、LVN_GETINFOTIPで ツールチップを表示していますが、 表示するまでにどうしても時間がかかるので、 別のスレッドに分けました。 しかし、別のスレッドで処理を終えた後、 ツールチップを表示させることができません。 TTM_UPDATETIPTEXTとTTM_TRACKACTIVATEで表示できるのですが、 以降LVN_GETINFOTIPが来ないので、さらに困ったことに。 何か良い方法はないでしょうか?
なんか標準コントロールを色々使ってみて出した結論。 完全に自作した方が楽だった。
>>599 全然解決してないよそんな対処法!
なんでそんな横着なの?
そもそも、DirectSoundはCだけで使えるしw
でも、CよりもC++のほうが書きやすいのもまた事実。
>>599 DirectSound周りだけC++にしてCのコードから呼び出す関数だけextern "C"つければいいやん
いや、そこまでC++を避けなくたっていいだろ。
607 :
600 :2007/02/05(月) 20:46:07
>>601 やっぱりそうですか。
自作となるといろいろやることが多くて、
できれば標準のものが使えればいいんですけどね〜。
ライブラリパスの追加方法 #pragma comment (linker, "/libpath:..\libdir") は見つかったんですが、同様(似たような)の方法でインクルードパスを 追加する方法ってありませんか?
GetGlyphOutlineを使用しているのですが、SystemやTerminalなどのフォントでエラーを返してしまいます。 エラーを返してしまうフォントかどうかを判別するにはどうすればいいでしょうか? 「システムフォント」や「デバイスフォント」など区別の仕方が沢山あってどうも混乱してしまいます。 デバイスフォントであればEnumFontFamExProcの引数FontTypeでDEVICE_FONTTYPEが立っているかどうかで判別できるのですが・・・ 詳しい方ご教授よろしくお願いします。
WinInetでFTP転送を行うソフトを昔作ったんだけど 今度サーバーがSSHになったら動かなくなってしまいました。 なんかこう、コンポーネントかなんか入れてちょっとした改造で 動くようになりませんかね? 絶対無理?
それは冗談で言っているのか(AA略
冗談に決まってるだろ。 実情知ったら青ざめるに尻毛100本。
613 :
610 :2007/02/05(月) 22:07:42
冗談じゃないっす…
>>612 の尻毛を抜かせてもらいます
>>609 GetGlyphOutline()ってTrueTypeだけだから
tmPitchAndFamily & TMPF_TRUETYPEでいいんじゃない
>>610 INTERNET_FLAG_SECURE
それSSL
>>610 サーバーをちょちょっといじって、ftpサーバー立てれば?
pscpとかpsftpとか使えばいいじゃん。
GetDCを2連荘で呼んだらReleaseDCも2連荘で呼ばなければなりませんか?
620 :
610 :2007/02/05(月) 22:49:38
おっと失礼、FTPでなくてHTTPでした ソース見直したらInternetReadFile使ってた 商品なので、フリーのソフトとかつけられないんです ごっそり改造だと金かかるしなー 正直にちょっと直すくらいじゃむりぽと言ってしまうのが正しいか
>>619 必要がなくなった時にReleaseDC(解放)すればいいんじゃない?
DCリソースが不足気味ならこまめに解放しないといけないが
ぬるぽ
625 :
610 :2007/02/05(月) 23:11:37
>>623 正式なのがあるんですね。買ってもらえるか打診してみます
つーかその前に、機能変わらないのに改造だけで開発費だしてもらえるかどうかが問題だけど
>>619 取得したhdcをどうしてるのかしらないけどタスクマネジャ-でGDIオブジェクト数確認したほうが良い
vectorとかにはそういうツールが蔓延してるけどな
system("pause");
HDC hdc1 = GetDC(NULL);
system("pause");
HDC hdc2 = GetDC(NULL);
system("pause");
ReleaseDC(NULL, hdc1);
system("pause");
unixのexec()みたいなことはWin32APIではできないの?
CreateProcess()の何が不満だ
>>628 プロセスIDが別になること。
子アプリをラップしたいんです。
プロセスIDが別になると、子アプリをラップするのに何の不都合が?
job使えば?
>>630 親が子プロセスIDで操作しても、孫に効かない。
634 :
デフォルトの名無しさん :2007/02/06(火) 00:58:34
プロセスじゃなくてスレッドを使ってみるとか・・・
>>632 具体的に子プロセスに対して"何"をしたいのよ?
その中身にもよるけど、Windowsじゃ難しいような気がする。
>>632 子プロセスを変更することが出来るなら、
ファイル マッピング オブジェクトに孫プロセスのプロセスIDを書きこむようにして
|プロセスの深さ|子プロセスID|孫プロセスID|...|
(操作するプロセスID) = (プロセスIDリスト) [ (プロセスの深さ) ]
ってな具合にすればいいんじゃないだろうか
ファイルマッピングとか、とにかくプロセスが複数絡むと デバッグが異様にやりづらくなるんだよなあ……
InterixのアプリってWin32からは操作できないんだっけ?
子プロセスが勝手に子プロセスを産んでも処理できる、 そのためのJobObjectじゃないのか。
ファイルマッピングオブジェクトのソースコードを書いてみたのですが、
初めて書いたのでエラー処理で足りない部分があれば教えて頂けないでしょうか?
ちなみに Win9x でテストしています。WindowsXPだと別な処理が必要になるのでしょうか?
本来はヘッダでまとめるべきリテラルがあちこちに埋め込んであるのはスルーしてくださいm(__)m
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3618.lzh a.exe を起動して enter を押す
b.exe を起動して enter を押す
a.exe 側で enter を押す
b.exe で enter を押すたびに a.exe で表示される値が変更される仕様です
641 :
640 :2007/02/06(火) 11:04:19
>>640 は MapViewOfFile が失敗した時に CloseHandle するのを忘れていました。
他に問題点があれば指摘して下さい。
643 :
642 :2007/02/06(火) 11:38:31
×元に戻ったり ○点滅したり
>>642 SetCursor 部分を削除するか、WNDCLASS の hCursor を NULL にするかでいいんじゃないかな?
WNDCLASS の hCursor が NULL 以外の時は、
システムが以前のカーソルを復元しようとするらしいので、
それが原因でちらついていると思われる。
645 :
642 :2007/02/06(火) 12:04:58
>>644 >SetCursor 部分を削除するか
元に戻そうとするメッセージをですか?
646 :
デフォルトの名無しさん :2007/02/06(火) 12:08:10
1.Windowsの再生デバイスの設定(デフォルト)を変更する方法ってありますか? (waveOutOpenでWAVE_MAPPER指定したときに、再生先が変わってほすぃ) 2.waveOutOpenでデバイス指定して、ADPCM再生する方法って? (ACM?? 手順がわからない... ソース乗ってる解説サイトとかありますかね...) よろしく...
647 :
642 :2007/02/06(火) 12:17:19
>>644 できればクラスを再定義せず変更したいので、
前者の方法を教えてください。
マウスが動いたりクリックする度にSetCursorを送るメッセージがあるのだと
思っていたのですが、違っていたらすみません。
まずはやってみようぜ…?
650 :
642 :2007/02/06(火) 12:39:21
>>648-649 申し訳ありません。本当に勘違いでした。
NULLにしたらカーソルが表示されないのかと思ってたらしいです。
ご迷惑おかけしました。
ありがとうございます。
FreeLibraryを対象になるDLL側から禁止することは無理ですか? DLL_PROCESS_DETACHでFALSE返しても結果には影響しないようだし DllMain - DLL_PROCESS_DETACH内で待機関数使ってスレッドとめることも状況的にできない ロードされた側のFreeLibrary自体をいじればなんとかなると思うけど大掛かり過ぎるし…
普通に考えて、FreeLibrary()してもデタッチされないDLLって 半分ウイルスみたいなタチの悪い代物になると思う。 FreeLibrary()をフックするしかないんじゃない? 既にアタッチされてるのが前提なら一般的なAPIフックより少しは楽。
>>652 基本的なトリックでアンロードの拒否ができればいいなーとおもったんですが
やっぱそうなりますか
即答どうもです
>>651 自分自身を LoadLibrary すりゃいいんじゃね?
>>654 どうも。
一瞬すごい これだ! と思ったけどいろいろ問題ありで怖いんで
素直にFreeLibをフク-するか、所詮自分様専用ってことであきらめるかしますわ
656 :
デフォルトの名無しさん :2007/02/06(火) 13:39:15
マ板の69式のおっさんを呼び込むスレからきました
>>495 実は方法ある
詳細についてはMSのページに長いコードがあるから割愛するけど
簡単に言えばデフォルトで裏側にウィンドウを表示しているのを表側に表示するコードを書くだけ
たったこれだけなんだけどコードはえらく長い
658 :
627 :2007/02/06(火) 14:11:38
>>635 タスクスケジューラではWindowStyleが指定できないので、
CreateProcessを被せればよいかなと思ったのですが、
そうすると今度は「タスクの終了」が孫に効かなくなるので、
なんかいい方法はないものかと。。。
>>658 CreateProcess で開いたハンドルを保持しておいて、
SetConsoleCtrlHandler 使ってプロセスが終了したときに
ExitProcess するようなコードを書けばいいと思う。
>>655 モジュールの参照カウントをあげておけばアンロードされない
自身でLoadLibraryしてもいいし、GetModuleHnadleでもいいんじゃないかと
GetModuleHandleはダメだと思うよ。
GetModuleHandleは参照カウント増やさないだろ
663 :
662 :2007/02/06(火) 18:03:28
被ったorz
664 :
627 :2007/02/06(火) 19:07:41
>>659 SetConsoleCtrlHandleはコンソールアプリでないと駄目なのでは?
[親(スクスケジューラ)]->[子(CreateProcess)]->[孫(アプリ/バッチ)]
子はコンソールアプリでないウィンドウアプリ(ウィンドウなし)
の関係を考えています。なんか無理そうですね。諦めモード。
だから、ジョブオブジェクトは何の不満があるのか
GetModuleHandleって参照カウント上げなかったっけか。失礼
ジョブの入れ子にすればいいじゃん
タスクスケジューラーってタスクをジョブオブジェクトで管理してるの? (.job に対応する job object じゃない方のジョブオブジェクト)
ラッパを生かし続けてて、タスクスケジューラの終了メッセージで 子供を殺せばいいんじゃね?
670 :
627 :2007/02/06(火) 21:10:11
>>665 すみません。ジョブオブジェクト調べてみましたが、
これでどうやってできるのか分りませんでした。
unixのプロセスグループだと、プロセスグループリーダが死ぬと、
みんな巻き添えになったような気がしますが、
ジョブオブジェクトにもそういう仕組みがあるのでしょうか?
>>669 ですね。非表示のウィンドウを使えばいいみたいです。
671 :
651 :2007/02/06(火) 21:16:28
具体的な問題をいうと、MSGBOXをIATの書き換えとDLLでフックしてるところ、
そのフック関数の最中にDLLがアンロードされてしまうと、
フック関数がぬるぽを参照することになって落ちるという状態です。
再LoadLibraryだとアンロードされないんじゃなくて
アンロードされて、新しい再配置なインスタンスになるんでアドレスが違ってしまって、
フック関数のアドレスを正しく引きつぎできない。
相当乱暴に自身へのFreeLibraryは常にFALSEを返して
FreeLibrary経由しないDLL_PROCESS_DETACHでは、
まあ、面倒くせーから状況見て待機させちゃうか、強制的にmsgboxから制御奪うかなって感じでいますが、
>>670 CreateJobObjectしてそいつにプロセスを追加してく
殺すときはTerminateJobObjectって流れ
>>671 DllMain で即 LoadLibrary して、ロードしたモジュールの方の関数でフックすれば良いよ。
ってか漏れがやったときは単に LoadLibrary でOKだったけどなぁ・・・
DETACHされたときにIATを戻してやれよ・・・
>>673 フックの種類によってはまさに置き換えたコードを実行中ということもあるので、
アンロードされないようにすることもある。
>そのフック関数の最中にDLLがアンロードされてしまうと、
>フック関数がぬるぽを参照することになって落ちるという状態です。
大半のAPIなら瞬間的に制御が帰るので気づかなかったんですが
>>674 のとおりです
>>672 できました。感動です。
DLL_PROCESS_DETACHでLoadLibraryしたときに再配置になって、
初回のアタッチのときなら再配置じゃなくてカウントあげになるみたいです
うだうだお騒がせしました
>>675 ttp://msdn2.microsoft.com/en-us/library/ms682583.aspx >The entry-point function should perform only simple initialization or termination tasks.
>It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions),
>because this may create dependency loops in the DLL load order.
>because this may create dependency loops in the DLL load order.
dependency loops in the DLL load order の問題ってのは、 例えば A.dll depends B.dll, B.dll depends C.dll, C.dll depends A.dllっていうときに、 A.dll のエントリポイントで LoadLibrary("B") とやると嵌まるよ、ということ。 今回明らかに問題ない。
>>642 > WM_MOUSEMOVE が発生するたびに呼び出すのが一般的
ってマジか? そのためのWM_SETCURSORだと思ってたのだが
GetModuleHandleExならデフォルトで参照カウント上げるし 絶対アンロード不可能にするオプションもあるな。Windows XP以降でしか使えないけど
>>642 クライアント領域に入ったらこのカーソル、みたいな感じならば
WM_SETCURSOR のハンドラで SetCursor する。
アプリで任意のタイミングで変えたいのなら、
それ+任意のタイミングで SetCursor する。
ちらつくのは多分WM_SETCURSORでの処理を忘れているため。
WM_MOUSEMOVEで常に SetCursor しているなら、
WM_SETCURSOR では単に return 0L するだけでもよい。
perlでデフォルトプリンタ名を取得したいのですが、 use Win32::API; $pr = new Win32::API('winspool.drv', 'GetDefaultPrinter', '', 'P'); print $pr->Call(); どこがおかしいですか?
use Win32::API; $GetDefaultPrinter = new Win32::API('winspool.drv', 'BOOL GetDefaultPrinter(LPTSTR, LPDWORD)'); $pszBuffer = ' ' x 200; $pcchBuffer = length($pszBuffer); $GetDefaultPrinter->Call($pszBuffer, $pcchBuffer); 試してないが。
685 :
69式オサンクローン ◆4E1yVnBRhg :2007/02/07(水) 01:18:53
ここはデバドラの質問もあり?
687 :
683 :2007/02/07(水) 02:07:23
>>684 ありがとうございます。
残念ながら、動きません。
688 :
640 :2007/02/07(水) 02:11:05
>>640 には
>>641 以外の問題なしということでOKでしょうか?
問題が出るほど大きなコードではないと思うけど・・・
689 :
683 :2007/02/07(水) 02:21:10
>>687 これでいけました。
use Win32::API;
$GetDefaultPrinter = new Win32::API('winspool.drv', 'GetDefaultPrinter', 'PP','N');
$pszBuffer = ' ' x 200;
$pcchBuffer = length($pszBuffer);
$GetDefaultPrinter->Call($pszBuffer, $pcchBuffer);
print $pszBuffer;
まだまだ、各サイトにあるWin32APIのサンプルを書き換えて プログラムの練習をしているレベルの質問者です。 CreateDialogで作ったダイアログにテキストを描画したいと思っています。 プログラムの結果を表示するためなのですが、何か参考になるサンプル プログラムがサイトか、理解の手がかりになるAPIなどを教えてください。 まだまだ、理解が浅いので描いたコードがまずいのですが、DrawTextで 描画するようなコードを書いてみたらエラーで落ちてしまいました。
CreateWindowで作るウインドウのタイトルバーをなくしたいのですが、 リージョンで表示させない以外に何か方法はありますか? タイトルバーをなくしたいのは自作のウインドウだけです。 よろしくお願いします。
Window の Style を良く見れ。
>>690 Dialogならstaticかeditを乗っけて、SetWindowTextで設定するのがいいかも
695 :
デフォルトの名無しさん :2007/02/07(水) 11:22:10
>>693 Styleの項目を一つ一つ試してみました。
勉強不足で恥ずかしい限りです。
ご助言をありがとうございました。
APIについての質問ではないのですが・・・ VC2003付属のヘルプ(Document Explorerかな)で、SDKを閲覧する際、 文章中のリンクをクリックすると、10秒程待たされるのですが、これは正常ですか? 読む気が失せてしまうので、スラスラ読みたいのですが・・・
webに検索にいかないようにした?
698 :
デフォルトの名無しさん :2007/02/07(水) 14:33:14
初歩的な質問ですみません。 リソースエディタで作ったダイアログに貼り付けてあるstaticの文字を 変更したいと思っています。 DLG_VIEW DIALOG DISCARDABLE 0, 0, 180, 300 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_VISIBLE CAPTION "" FONT 8, "MS 明朝" { CONTROL "Label101", DLG_LABEL, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 0, 0, 150, 300 } このDLG_LABELのハンドルを取るにはどうしたら良いのでしょうか? 初歩的なサイトばかりですが、色々とサンプルから探していたのですが 頭が飽和状態になって段々とわからなくなってきました。 DLG_LABELにSetWindowTextで文字を送る方法を教えてください。 お願いします。
DLG_LABEL が -1 (or 65535) になっていないことを resource.h で確認したうえで、 (-1 or 65535 ならば、衝突しないユニークな値に書き換える) SetDlgItemText( <ダイアログの hwnd>, DLG_LABEL, <変更文字> );
>>699 のSetDlgItemTextは、GetDlgItem + SetWindowText の機能だから、
一応、GetDlgItem() も参考にな
>>699-700 ありがとうございます。
無事にできました。
自分で調べたときにはGetDlgItem()+ SetWindowText までは行っていたのですが、
なぜか失敗をしていました。
ヘッダファイルが読み込まれておらず、DLG_LABELがdefineされていなかったようです。
ご助言で気づけて助かりました。
ロケットマウスで、文字列の貼り付けという機能があるのですが、この機能はEXSELやTEXT EDITORに あらかじめ設定しておいた文字列を貼り付けることが出ます。 WindowsAPIにはクリップボード関連のAPIがあるのですが、クリップボードからデータを取得など、微妙にピントがずれたAPIしか見つけられませんでした。 良い方法がありましたら教えてください。よろしくお願いします。
何をしたいの?
たとえば、事前にクリップボードに文字列を入れておき、ソフトウェアで一秒後にクリップボードに貼り付けを行うソフトを作りたいです。 クリップボードの貼り付け先は、不特定多数のアプリケーションです。
??
クリップボード「から」貼り付けじゃなくて? 日本語がわからん
クリップボードの内容をリアルタイムで更新したいのか? Synthesized Clipboard Formatsで何とかしろ。
ごめんなさい。変な日本語でした。 たとえば、事前にクリップボードに文字列を入れておき、ソフトウェアで一秒後にクリップボードの内容を 不特定多数のアプリケーションに貼り付けを行うソフトを作りたいです。 貼り付け先は、ユーザーが事前にカーソルを合わせ、待機します。
>>706 クリップボード「から」です。
すみません。
WM_PASTEでも送ってやれば?
それかも!! アドバイスありがとうございます。
>>710 まさにそれでした。
ありがとうございました。
わざわざクリップボードを使う意味がわからんけどまぁ関係ないからどうでもいいや
フォルダ選択ダイアログで、パスを取得することはできたのですが そのパスを使ってファイルの保存先を変更するときに、「¥」が一つしかついていないので パスとして認識されません どうしたらいいのでしょうか? BrowseInfo構造体 SHGetPathFromIDList など使用しました
>「¥」が一つしかついていないので うーん、何が言いたいのか分かるような分からないような・・・ C/C++の文字列リテラルのエスケープ文字を勘違いしてない?
例えば、フォルダ選択ダイアログで「D:\program\log」というパスが 取得できたとします これをそのまま保存先のパスにすると、\がエスケープ文字として認識されてしまいます なので、「D:\\program\\log」のようなパス名になるようにしたのですが・・・ 説明が下手ですいません
ホームラン級の馬鹿ですか?
× パス名になるようにしたのですが・・・ ○ パス名になるようにしたいのですが・・・
>>716 エスケープ文字がどういう代物なのか、よく考え直してください・・・
> エスケープ文字として認識されてしまいます これは気のせい
>>716 とりあえず失敗してるのは別の理由
エスケープ文字だと思い込んでるから、本当の理由を調べられない
みなさんありがとうございます 文字列中に「\」があると、それがエスケープ文字と解釈されてしまうので 文字「\」を文字列定数の中に指定したいときは「\」を2つ並べて 「\\」のように書く必要がある、という解釈は間違っているのですか? L""で囲んでみましたがダメでした
>>722 そういうソースで "" で囲まれた文字列は \ をエスケープするが
フォルダ選択ダイアログで取得した文字列は関係ない。
フォルダパスをINIファイルに保存していたのですが それを取得し、Log.txtを末尾にくっつけるところで""を用いていたのが原因でした strcatでそのまま結合したらできました ありがとうございました
pugya-
メニューをoffice風する方法を教えてください
どーせcodeguruとかcodeprojectにあるんじゃねーの
オーナードローで激しくやってんじゃない? 専用のライブラリか下手したら別言語でさっくり作ったりしてるのかも試練が
WPFとか
MSはオーナドロー大好きっ子 Win95時代のOfficeでグラデ付きタイトルバー使ってたり
.NET Framework 2.0使えば普通にできるよ Win32APIだけでやりたいならオナードローしてください
.NET Framework Cに慣れた俺にはアー 最初からNET覚えとけばよかったorz
新たにインスコするのが嫌なのでWin32api
ダイアログなどウィンドウで親に乗っているコントロールだけアルファ255で 親を透過したいのですが、どのように行えば委員でしょうか。 UpdateLayeredWindowに32ビットDIBを持たせてピクセルごとにアルファを 管理できるところまで調べたのですが、コントロールが表示されない?ので それ以上の描画が出来ません。 WM_PRINTを投げてみたりもしましたが非対応な模様。 レイヤードウィンドウの子ウィンドウをレンダリングする方法など無いのでしょうか?
コントロールをDIBに出力しない限り無理。
737 :
735 :2007/02/08(木) 21:16:02
>>736 >コントロールをDIBに出力しない限り無理。
ごもっとも。出力したいです。
自前で書けってことですか?
自前でやる場合にはテーマAPIを使うのが常道。 BeginPaint、EndPaint、GetDC、ReleaseDCをAPIフックしてオフスクリーンに 書かせてもいいかも知れない。この場合でも、文字列が描画される際に文字ある のところは背景も塗られるが、空白のところは何の描画もなしとか、その辺の 不具合があるのである程度は自前でやる必要も出てくると思う。
>>726 .NET Framework 2.0のSystem.Windows.Forms.MenuStrip
このスレでこの答えはないか。
mscoree呼んでCLRホスティングしろということですね!
C#やってみたら、アプリが劇的に簡単に作れてしまって。 今までやってたC++やWin32apiって、何だったんだろうかと。 もうたぶんこの世界に戻ることは無いだろうな。
C#でも細かいことをしようとすればWin32APIを使います
ガリガリSDKのメリットだってあるさ
ちょっと質問。 テキストエディトの入力を消去したいときってSendMessageで何のメッセージを 送ればいいんでしょうか?
746 :
745 :2007/02/08(木) 23:51:30
馬鹿か俺は・・・・ SetWindowTextの存在をすっかり忘れてたorz
713さんの言うように、もっと良い方法ありましたら、教えてください。 よろしくお願いします。
自分のバカさに1分15秒で気づいた
>>745 のお話でした。
完
される側にとっては迷惑か、ノイズだけど ひとに問題点を説明するその途中で 「あ、わかった、やっぱもういい。ありがとう」ってのはよくある
質問させて下さい。 //.. chocolate choco = Valentine(ore); と、バレンタイン関数を呼び出してみたのですが・・・ 何度やっても戻り値に NULL が返ってきます! どうしてなんですか? 教えて下さい><
751 :
デフォルトの名無しさん :2007/02/09(金) 00:25:56
>>749 あと、される側にとってははなはだ迷惑だけど
ひとつの問題点を質問した後に回答前に
解決法を見つけてしまうこともある。
「さんざん探した後なのに・・・」
>>746 の評価できる点は質問に対する解答をレスにつけてたこと。
自己解決したら何も書かない奴が結構いるからな。
CreateDialogで作ったダイアログの表示を親ウインドウの後ろにするには どうしたらよいでしょうか? 親ウインドウのハンドルをNULLにするとタスクバーのところにダイアログの 名前が出てしまいます。 SetWindowLongでタスクバーに表示しないように設定するのでしょうか? それとも、他に方法があるのでしょうか? SetWindowLongのスタイルを色々と試しているのですが、見つけることが できませんでした。
すみません、自己解決しました。 ダイアログのリソースにEXSTYLE WS_EX_TOOLWINDOWを追加して、 CreateDialogで親ウィンドウのハンドルをNULLにしました。 これで良かったのでしょうか? もし、こうするほうが安全とか、こっちのほうが良いとかありましたらお教えください。
756 :
デフォルトの名無しさん :2007/02/09(金) 12:28:44
VC++でプログラムを書いております。 非コンソールのプログラムで、 コンソールウィンドウの表示のさせ方と、 そこへの文字の出力の仕方を教えてください。 よろしくお願いします。
AllocConsole()かな
>>756 CreateProcessでcmd.exeを起動させWriteFile関数で書き込めばいい
759 :
756 :2007/02/09(金) 12:57:20
>>757 さん
>>758 さん
ありがとうございます、自分のプロセスで出したかったので
次のようにやりました。
たすかりましたー^^/
AllocConsole();
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
printf("本日は晴天なり");
ダイアログにSTATICを貼り付けてテキストを表示しようとしています。 スタイルにSS_LEFTを入れているのですが、スペースがあると 適当なところで折り返してくれるのですが、スペースがないと 折り返さずに行が途切れてしまいます。 何か対策とかはあるでしょうか?
>>760 意図的に改行したいの?
したくないの?
教えてください。 APIでlstrncmpなるものは無いのでしょうか?
無い
ありがとう
m$ は嫌いだが、クラッカーはもっと嫌い
チーズつけるとうまい
>>765 ちゃいます。ただなんとなく全てAPIで書きたかっただけですw
まあ、自作で作ってDLLにでも埋め込もうと思っていたのでちょうどよかったです
ちっちゃいバイナリーってなんだよw スーパバイザモードじゃなけりゃなにをやってもいいはずだろw
ところで、ZeroMemoryがmemsetへの#defneだということを知っているか?
へえ〜〜〜〜
>>771 ってとっても物知りなんだんあ〜〜〜〜
きっと周りの人から尊敬されてて、「きゃーステキ!」とかいわれてるんだろうなあ。
いや〜〜〜、スゴイ・スゴイ。
SendMessageのAとWってwParam,lParamに文字列設定するときのために必要だったんだな 文字列設定するわけでもないのになんでA,Wが用意されてるんだろうってずっと疑問に思ってた
っ[チラシの裏]
直接じゃなくてもLV_ITEMとか色々文字列つかうよね。 そんなことを疑問に思う人もいたってのは新鮮。
>>771 処理系依存。
ZeroMemoryというAPIは存在するし、それを何に置き換えるかは開発環境次第。
memsetすら関数ではなくストリング転送命令に置き換えられてしまう場合すらある。
>>776 Win32 API スレでは Windows SDK のヘッダまで含んで "Win32 API" と言っていいんじゃない?
mingw とか cygwin とかはモドキってことで。
存在するのは、RtlZeroMemoryじゃないか? そういや、CreateWindowは存在しないよな。
ExitWindowsも無い
EXitMicrosoft あったらすぐ買う
質問させて下さい nDesktopWidth = 画面の幅 hwnd = 最大化されてるウィンドウのハンドル GetWindowRect(hwnd, &rect); MoveWindow(hwnd, rect.left - nDesktopWidth, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE); とやっても動いてくれないのは何故でしょう?on WinXP SetWindowPos() でもダメでした 反対側 (rect.left + nDesktopWidth) には動いてくれます クラシックスタイルにすると動いてくれます
誰か日本語に翻訳頼む
WinFXは色々と変化してるらしい
>>782 MoveWindowやSetWindowPosで、ウィンドウの右端座標(スクリーン座標)が 0 未満に
なるようにウィンドウを移動しようとしても、動いてくれません。これはなぜでしょう?
ヒント:
OS は Windows XP。クラシックスタイルにすると動く。
愛情が足らんのだろう
MSに文句言ったほうがイイカモな
マルチモニタすればいいじゃない。
788 :
781 :2007/02/10(土) 10:41:17
>>784 ありがと
最大化されてなければ問題は無いのです
最大化されてると、左と上には動いてくれない
右と下には動いてくれるのに
マルチモニタにできないから仮想的に広げようとしたのだが
仮想デスクトップ使えばいいじゃん
稚拙な質問ですみません。 真っ黒に塗りつぶされたダイアログを作りたいのですが、方法がわかりません。 見つかるのはVCとかVBなどを使ったもので、直接Win32 APIをたたくものが 見つけられませんでした。 リソースを書いて設定する方法でもかまいませんので、方法があれば教えてください。
>>790 WM_CTLCOLOR で HIWORD(lParam) が CTLCOLOR_DLG だったら
GetStockObject(BLACK_BRUSH) を返すとか。
>>791 WM_CTLCOLORDLG じゃないか?
>>791 >>793 ダイアログのプロシージャで
case WM_CTLCOLORDLG:
return (long)GetStockObject(BLACK_BRUSH);
とすれば解決しました。
とても簡単な方法にたどり着けて感謝しています。
ありがとうございました。
795 :
781 :2007/02/10(土) 20:40:59
XPのバグだなこりゃ クラシックスタイルなら全然問題無く指定した通り動いてくれるし
発見したならちゃんと報告しとけよ
クラシックスタイルのバグが直ったんだろ
>788 最大化の時はデスクトップサイズ、というか、デスクトップにツールバーが追加されてから その仕様が出来た。 ツールバーを含んだ領域を獲得するAPIがあるから、そちらから数値をもらってきてみな。 または、最大化を一時的に解除してから動かせば問題ない。 昔は幾らでもサイズ変更できたんだけどね。
つーか最大化してるときにGetWindowRectしたらまともな値返ってこなかった気がするんだが
GetWindowPlacement
801 :
781 :2007/02/11(日) 14:23:12
SystemParametersInfo() getworkarea だっけ? というか、サイズはあんま関係無い気がする 最大化されてるとマイナス座標へは動いてくれない 元々画面からははみ出てて左上は(-4,-4)とかの座標なのに、それよりマイナスには行かないっぽい クラシックスタイルもWin2Kも動いてくれるのに
なにか目的があってMSDNとgoogle徘徊してたら一日終わってた なにが目的だったのかは思い出せてない かゆ うま
803 :
デフォルトの名無しさん :2007/02/11(日) 18:58:16
タイトルバーでマウスのミドルクリック押したら そのウィンドウを閉じる用なの作りたいのだけど どうすればいいの?
努力次第 その中の内容だけでと言うのなら無理だが、そこにある事をある程度理解し 必要な機能をGoogleで探して活用するなら可能。 手始めにそのサイトを覚えるのは悪くはない。 ただ、『Win32 API入門』には何箇所かソースの間違いがあった。 他のコードと見比べるなら発見できるので、勉強にはちょうど良いかもしれない。 基本的にはソースコードはそのまま使えて、動作が確認できるので 理解の手がかりにはなる。
>>804 自分のウィンドウのタイトルバーがクリックされたら閉じるようにしたいの?
ならWM_NCMBUTTONDOWNとUPを捕まえて処理するだけ。
一般のウィンドウに対してやりたいのならマウスをフックする必要がある。
>>806 後者です。
よければマウスをフックもう少し詳しくお願いします。
ググってみたんかい? 806でもない俺が言うのもなんだが、ググって簡単にひっかかったぞ。
うるせーカス
>>809 ありがとうございます。
これから読んでみようと思いますです。
812 :
804 :2007/02/12(月) 01:02:41
813 :
質問 :2007/02/12(月) 01:23:08
質問です。 長めなので3レスに分けます。 標準入力(コンソール,パイプなど)をバイナリモードで読めるだけ読んで、 即座に標準出力に出したいのですが、 ブロックせずに読めるバイト数が取得出来ず困っています。 ※ 上を実現した後ストリーム加工処理を入れるつもりです。 また、読めるバイト数が0の場合は、待機関数で待てるのが理想ですが、 ブロックしてもかまいません。 オーバーラップIOでは、ブロックはしませんが バッファが満たされるまで読めないので意味がありません。 recvやPeekNamedPipeも使用出来ませんでした。
現在はReadFileを使用しています。 ReadFileで2バイト以上読むと入力元が1バイトで止まっている場合に ブロックしてしまい、次のバイトが来るまで最初の1バイトが出力されないため、 1バイトずつ読んでWriteFileで出力しています。 パフォーマンスに関して、コンソール入力のときはまだ良いですが、 # app < size_8MB.dat > out.dat のようにファイルを通すと、500KB程度のバッファで read,writeする場合と比較して、当然ですが非常に遅いのです。 せめてWriteFileの回数を減らそうと WaitForSingleObject(hStdIn,0) で ブロックせずに読めるだけ(orバッファ埋まるまで)読んでから、 WriteFileしようと考えたのですが、GetStdHandle(STD_INPUT_HANDLE)は バッファ以外も情報を持っているらしく、WaitForSingleObjectが望んでいる動きをしません。 (読める入力が無くてもシグナルになったりします。) コンソールの場合は行単位入力,エコー有りが前提です。 (ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT)
DOSプロンプトで # (1秒おきに文字列を出力するexe名) | (今回作りたいexe名) や # (今回作りたいexe名) < 10MB程度のファイル > 出力ファイル のように使うプログラムで、「即座に出力」「それなりのパフォーマンス」を 両立させる手は何か無いでしょうか?
ちょっと長めです。 CreateToolhelp32Snapshotの TH32CS_SNAPPROCESSフラグで取得したszExeFileをリストボックスに 列挙させるいわゆるタスクマネージャ的な物を作った後。 次にそのリストボックスをマウスなどで選択し、ボタン等を押下すると そのリストボックスに選択されてる対象の【ウィンドウハンドル】を 取得したいのですが皆さんどうやってやってるんでしょうか? 俺の場合はこんな感じでやってます CreateToolhelp32Snapshotでリストボックス作成 ↓ どれでもいいから選択した後、実行ボタン押下 ↓ 選択されてる項目のをSendMessage等で取得 ↓ CreateToolhelp32SnapshotでSendMessageで取得した 項目とszExeFileが一致するかどうかを判定 ↓ 一致した場合対象のプロセスIDを取得 ↓ EnumWindowsのCALLBACK内でGetWindowThreadProcessIdを使い、 列挙したハンドルからプロセスIDを取得。 ↓ そのプロセスIDとCreateToolhelp32Snapshotで一致したプロセスIDを比較 ↓ 該当するならそのハンドルを取得する。 こんな感じに書いてます。 因みにEnumWindowsの第二引数には下記の構造体を渡しています。 typedef struct tagSAMPLE { HWND hWnd, DWORD dwProcessId } SAMPLE, *LPSAMPLE;
817 :
815 :2007/02/12(月) 01:46:08
で、何がいいたいのかというと。 もっと別で簡単なやり方が無いのかという事が知りたいのですが。 何かいい方法あれば、どうぞよろしく教えてください。
うろ覚えだけど、それか、それに似た手段を 執らなくちゃいけなかったような気がする。 プロセスIDとウィンドウハンドルって繋がりなかったよなあ確か
819 :
815 :2007/02/12(月) 02:00:18
820 :
815 :2007/02/12(月) 02:03:18
呼び出し順としては EnumProcessNameでリストボックスに列挙 TargetProcessIdで第一引数に紐付く名前を探してプロセスID取得 TargetWindowHandleでTargetProcessIdで取得したIDと同じ奴を探す という感じになってます
821 :
816 :2007/02/12(月) 02:06:37
>>812 適当なウィンドウのタイトルバーでクリックを繰り返してみて、
それをSpy++でよーく見ると分かる
(持っていないのならVectorかどっかで類似ソフトを調達してくること。
この類のものを作るときには必須)。
左ボタンを押したときに送られて来るメッセージは
確かに WM_NCLBUTTONDOWN だけど、
解放されたときは WM_LBUTTONUP になる。右ボタンも同様。
ウィンドウを動かしたりメニューを出したりするために
ウィンドウが勝手にマウスに SetCapture() するからだろう(多分)。
中ボタンなら(調べもせずに適当に書いた)
>>806 の通り
WM_NCMBUTTONUP でいいんだけどね。
いつもSetCapture() とセットで使ってたもんだから
恥ずかしながら今知ったよ。
ウィンドウハンドルを指定して、そのウィンドウがアクティブか否かって言うのを見たいんですが、そのような関数ご存知でしょうか。
「HWND フォーカスを持つ」とかでぐぐれば1分で見つかる
>813 stdinの実体に応じて、手法を使い分けるしかなくね? パイプなら、PeedNamedPipe で長さ調査、 ソケットなら、selectで読み込み可能か調査 コンソールなら、ReadFileで読んでみる(エンターキー押下で戻ってくる) UNIXなら、みんなselectで待てるんだろうが。
つ Cygwin
>>816 そもそも前提が間違っている。
全てのプロセスがウィンドウを持っているわけではない。
ウィンドウを取得したいなら、最初からウィンドウのリストを取らないと駄目。
829 :
816 :2007/02/12(月) 11:21:11
>>828 その辺はEnumWindowProcの段階で見つからなかった場合のチェック
かかるようにしてるんでハンドルを持ってるか持ってないか識別できるようにしてます
lpWinHandle->hWnd = NULL;
830 :
804 :2007/02/12(月) 13:07:37
>>822 なるほど!
確かにWM_NCRBUTTONUPではなくWM_RBUTTONUPが飛んできました。
そこでWM_RBUTTONUPに併せてSC_MAXIMIZEを行ったところフリーズ。
もしやCaptureしないといけないのかなと思い、WM_NCRBUTTONDOWNに併せてSetCapture()
そしてWM_RBUTTONUPでSC_MAXIMIZE、ReleaseCapture()することで
右クリックアップで動作させることができました。
アドバイス、本当にありがとうございました。
感謝です。
HPEN,HBRUSHに対して色を変える操作だけをしたいんですけど、 その度にCreateとDeleteを繰り返さなければいけないんでしょうか。 できれば同じオブジェクトに対して色を変えるだけの操作をしたいです。
Win2000以降なら SetDCPenColor、SetDCBrushColor Win9Xは知らない
あいあおう
ダイアログに置いた子ウィンドウ上に、更に孫となるコントロールを置いたとき、 Tabキーで他の子のコントロールと今置いた孫のコントロールを行き来できるようにするには どうするといいでしょうか?
自分でTabキー捕まえてSetFocus
>835 WM_CTLDLGだっけ、Focusをダイアログ側ですべて処理するように出来る、というのが1つの方々。 ウィンドウからウィンドウにフォーカスが移動する際に、特定のメッセージがあがるからソレを捕まえる、というのが二つめの方法。 最後のコントロールからの TAB 押下を判定して NEXTCTRする。というのが三つ目の方法。
VC GDIでゲーム作ってるんですが、止めた方が良いんでしょうか。 「好きにしろ」レベルの事でしょうか。
ゲーム次第だが、まあ好きにしろ
どこを止めてほしいのかわからん VC GDI ゲーム
MODULEENTRY32のhModuleはLoadLibraryのモジュールハンドルと一緒なんでしょうか?
>>837 IsDialogMessageでよくね?
指定した文字列を描画するときに、描画範囲を指定してDrawTextなどで 出力するときに、どれくらいの領域が必要か調べるのにはどうするのが 良いでしょうか? あまり知識がないので、文字の幅、高さ、行の幅などを取得して計算するしか 思いつかないのですが、なにか便利なAPIとかはないでしょうか?
DrawText DT_CALCRECT
RPGを作っているんですが フィールドの移動で32ピクセルを0.4秒くらいで移動するようにしたいんですが FPSを60に設定して画面の一回の書き換えで1ピクセル移動するようにすると 32ピクセル移動するのに、32/60=0.533...秒で遅すぎて、 画面の一回の書き換えで2ピクセル移動するようにすると 32ピクセル移動するのに(32/2)/60=0.266...秒で早すぎるんですが FPSが60で0.4秒くらいでキャラがフィールドをなめらかに 32ピクセル移動させるにはどうしたらいいでしょうか
こんなのはどう? 浮動小数点数のカウンタをひとつ用意する。 1フレーム毎に、0.4/60.0加算する。 移動量 = 32ピクセル * カウンタ これならFPSが変わっても大丈夫。 浮動小数点数が遅すぎて受け入れられないというのなら、 整数を多少工夫して使えばいいけれど。
>>846 求めたい移動量 = 32 * 経過時間 / 移動に要する時間
小学生か?
>>846 座標を整数ではなく少数で持つのが一番簡単。
でもBitBltのに渡す座標の引数は整数だから 座標を少数で持つと動きがカクつく 0.5ピクセル色を塗るとかできないし
少数画素位置での Blt は、AA処理のようにバックバッファ用意して 背景を n倍 StretchBlt → 整数化(座標xn) の位置に n倍 Obj を貼り付け → 全体を 1/n StretchBlt とかやるしかないのかな
>>850 世の中の2Dゲーが全てカクついて見えるんだな。
常人では追いつけないすご目をしているな。
携帯ゲーみたいな小さい液晶と比べたらはるかに条件いいんだけどね
こういうときこそ無駄に3Dエンジンを使うのだ!
>0.5ピクセル色を塗るとかできないし AA使いたいってこと?
やっぱりゲ製作板へ行くべきだろう
>>850 動体視力凄いな。
イチローでも80f/sくらいだけどお前は一体なに?
ハエか何かか?昆虫なら150f/sとかザラにいるけど地球外生命体なの?
>>857 いや、使っているディスプレイもすごいと思うぞ。
なんだろ、1ドットが見えるような超巨大スクリーンかな。
スタジアムとかにあるやつ。
今からゲームを作ろうと言うのにそんなとこでつまづいてたら一生できないぞw
細かい事気にしてると禿げるよ。
FPSが60で0.4秒で32ピクセル移動するわけだから 画面の一回の書き換えで移動するときと移動しないときができてなめらかに 表示されないと思うんですけど問題にならないですかね それにキャラを書き換るんじゃなくて、背景画像をスクロールさせてるので 画面全体を書き換えてるんですけど問題ないですかね
実際に試してみれば?
>>850 アンチエイリアシングを応用すれば、
擬似的に解像度が高く見えるんじゃない?
モーションブラーって名前で既に一般化された手法だけど。
輝度がFFFFFFのとある1pixelに、0.5x0.5pixelの輝度000000を描画したとすると、 描画対象になったかわいそうなとある点の輝度は(FFFFFF*3+000000)/4で良い。 とかいいたいの?
普通の動画でも30fpsぐらいじゃん 60fpsだったらその倍の速さだぞ
いまどきフレームレート固定はないだろ‥‥常識的に考えて
867 :
デフォルトの名無しさん :2007/02/13(火) 15:59:26
今時120fpsもないなんて終わってる
> いまどきフレームレート固定はないだろ‥‥常識的に考えて ごめんね… 640x480 60fps 固定でゴメンね…
>>861 なんで移動しないときが出て来るんだよ!
1ピクセル動く時と2ピクセル動く時があるが、動かない事は無いな。
対して手間のかかる物じゃないんだからとっとと作ればいいのに、 グダグダグダグダ グダグダグダグダ グダグダグダグダ グダグダグダグダ
子プロセスから親プロセスのハンドルを取得するAPIってありますか?
CreateToolhelp32Snapshot Process32First Process32Next
しかしその親プロセス情報って親が死んでようが生成されたときのままなんだよな ツリー構成する類のタスクマネージャで見るとたいていプロセス関係は並列になっちゃってるし プロセス間の親子関係はあんま使えない
875 :
デフォルトの名無しさん :2007/02/14(水) 09:57:32
プログラムから他のプロセスのカレントディレクトリを変更するにはどうしてらよいですか?
>>875 できません。フックその他の手法でターゲットのプロセスにコードを注入して、
そのプロセス自らがカレントディレクトリを変更するようにするしかありません。
ここの「パレットアニメ」のサンプルプログラムが動きません。
http://wisdom.sakura.ne.jp/system/winapi/win32/win126.html フリーのBorland C++コンパイラ23行目で「'void *' 型は
'tagLOGPALETTE *' 型に変換できない」エラーが出ましたので、
mallocの前に(LOGPALETTE *)をつけたらエラーはなくなりました。
しかし、256色モードにして実行をしてもサイトに説明されているように
黒い四角が左へは移動せず、その場から動きません。
何か間違いがあるのか、当方の環境が悪いのか、環境が悪いのは
コンパイラが悪いのか、ハード的な要因かなど一向に原因がつかめません。
どなたかわかる方がいましたら、ご助言をお願いします。
それから、フルカラーの場合にパレットアニメを実行するには
具体的にどうしたらよいかをご指南をいただければ助かります。
よろしくお願いします。
普通に塗り直せよ。
塗りなおしと言うとPatBltでマスク画像を用意して、XOR演算子で結合しか 当方には思いつきません。 なにか特定の色だけを一気に書き換える方法はないでしょうか?
元データをメインメモリー上に持っておいて、変えたい色を変えて塗り直せ。 思いつくとかそういう問題じゃないぞ。
>>879 1.256パレットのデバイスに依存しないビットマップを作る
2.パレット変更
3.デバイスコンテキストに転送
でいけると思う
パレットアニメの意味がない
パレットアニメっていったいどこの化石プログラマーだよ。
今は全部書き直しでおk
安直に名前だけでサンプル選んで動かしてみただけだろ 特に必要なかったらやる意味ないよ
1フレーム毎に移動量を4/3ピクセルずつ増やして 実際の描画位置の座標は小数部分切捨てで整数部分をBitBlt関数に渡すようにして 24回の画面の書き換えで32ピクセル移動する設定で作ってみたら 0.4秒で32ピクセル移動するようになりましたありがとうございました 画面がカクつくと感じた原因は画面を書き換える時間を格納する変数をDWORD型?にしてたせいみたいで これをlong double型とすることでうまくいきましたありがとうございました
long doubleってあるんだ・・・
結果的にうまくいってるように見えていても それが正しい解決方法とは限らない好例
>>886 とりあえずゲーム作るんなら秒で考えるの止めて何フレームで何をする
って考えにを身に付けた方がいいよ。
質問です。 既存のシステムが機能的に不足があるのですが、ソースはもらえないので、 スレッドを作る機能を利用して機能を拡張したいと思ってます。 スレッドはCreateThreadで指定されたSubThread関数を呼び出す形になっています。 このSubThread関数の中だけで、既存のシステムのマウスの状態を拾いたいんです。 たとえばWM_LBUTTONDOWNとかを拾う感じです。 まずはSubThread関数が呼ばれたら普通にウィンドウを作り、(非表示) この中で普通にWM_LBUTTONDOWNを拾えばいいのかと思ったんですが、 問題なく左クリックは検出できましたが、 既存のシステムのウィンドウと何か衝突してしまうようで、 無限ループのような感じでウィンドウが真っ白になり、応答なしになります。 何か他の方法とかありましたらよろしくです。
なんでデバッグしないの?
>>890 1.GetWindowLong 元のウインドウの WNDPROC を取得する
2.SetWindowLong で新しい WNDPROC に書き換える
3.新しい WNDPROC で必要な処理をした後で以前の WNDPROC を呼び出す
895 :
872 :2007/02/14(水) 19:17:57
>>892 早速やってみました。
hwnd=Takesys->get_hwnd(); // hwndを既存のシステムから受け取る
OrgProc=(WNDPROC)GetWindowLong(hwnd,GWL_WNDPROC);
// WNDPROCを受け取る
SetWindowLong(hwnd,GWL_WNDPROC,(long)NewProc); // 新しいWNDPROCを使わせる
long CALLBACK NewProc(HWND hwnd,・・・・ // 新しいWNDPROC
{
・・・・
return CallWindowProc(OrgProc,hwnd,・・・・ // 元のWNDPROCを呼び出す
}
どうもうまくいきません。
たとえばWM_NCRBUTTONDOWNは拾えるんですが、
WM_RBUTTONDOWNは拾えないようです。
ちゃんと既存のシステムで右ボタンを押して反応してます。
これはWNDPROCを通さないでマウス処理しているということでしょうか。
>>893 マウス以外も拾いたいんです。
>>896 可能性
1. 右ボタンを押して反応している部分の WNDPROC が別
2. WNDPROCを通さないでマウスイベントを処理している
3. その他
どんなソフトなのか分からないので、なんとも言えない
RADツールで作ったソフトの場合には、ボタンなどのウインドウで処理しないイベントだけが親ウインドウに渡されたりする
>>897 うーんそうですか・・・・もう少し悩んでみます。
ありがとうございました。
僕ハッカー
僕バッカー
僕ぬるぽ
俺ガッ
バカバッカー
(⌒) ピ / ̄ ̄| ∧_∧ | ||. | ━⊂(・∀・ ) \__| ======== \ | | /※※※※ゞノ,_)
LVS_EX_ALTERNATEROWCOLOR をワクテカして使ってみようとしたんだが、ヘッダにも記述がない。 挙句にそんなflagなどないだと。本当になくなっちゃったの?
よくみたらLVS_EX_にもうフラグの空きがないねorz
>>872 Cygwinのgetpidのソース見れば
CM_Request_Device_EjectでUSBデバイスをはずした後、 デバイスマネージャで!マークがつきますが、 これを抜き差しせずにまた再認識させるのにはどうしたらいいのでしょうか? SetupDiChangeStateやSetupDiCallClassInstallerでの有効・無効では無理でした。
912 :
デフォルトの名無しさん :2007/02/15(木) 16:16:18
SendInputを使えば他のmouse_eventの割り込みを受けずに連続動作が保証されると聞いたのですが, 確かに他のアプリが発行したmouse_eventの割り込みは受けないのですが ユーザ自身のマウス操作に割り込まれてしまいます。 ユーザのマウス操作にも割り込ませず完全な連続動作を保証するにはどうすればいいのでしょうか?
>>912 一体何をしたいんだ。
未署名のドライバのインストール時にでるダイアログでも回避したいのか?
VK_Aなどの仮想キーコードを利用しようとすると 定義されていない識別子です。というエラーが出るのですが、 windows.h以外に何かインクルードしなければならないヘッダがあるのでしょうか?
そもそもそのVK_Aとやらは、なんであると思ったんだ?
'A'でいい。 英字のキーコードは、ASCIIの英大文字のコードと一致している。 VK_Aなどといった英字に対するVK_?定数は文字定数の存在しないVBなどで便宜的に使用されるもの。
勘違してたから。 ・・・すまん。吊ってくる
WinUser.h
>>919 ありがとう。
中身見たらいろいろ書いてあって勉強になった。
なんでincludeの中を全文検索してみるとか、ごく簡単に出来ることをしなんだろう?
MAXのつく#defineをファイル検索する俺は病気。
"WM" でそれやったことあるが
ネットワーク上のWin9xマシンのファイル/フォルダに対して GetFileAttributesEx()すると、作成日時が取得できない!?
>>924 それは9xというよりFATのせいじゃね?
>>925 ネットワーク越しのXPのFATでは問題なく取得できるので、
やはり9xっぽいですよ
ローカルのFATのファイルの中に、作成日時が空で表示されるのがあるな。 DOSで弄った時は、作成・アクセス日時が書き込まれないのかも。
DWORD MyGetTickCout() { return (DWORD)((ULONGLONG)(*(ULONG *)0x7FFE0000) * (*(ULONG *)0x7FFE0004) / 16777216); } この0x7FFE0000にユーザモードから書き込みたいのですが いい方法が思い浮かびません。
OutputDebugStringの出力を コマンドプロンプトに表示させたいのですが どうしたらいいですか?
>>928 *(DWORD *)0x7FFE0000 = 0;
って話じゃないんだろうなあ。何が問題なのか良く分からん。
そもそもユーザーモードってなんだろか。
7ffe0000ってユーザモードで自由にアクセスできるエリアじゃなかったっけ
ここで聞いた私が馬鹿でした
>>928 の内容をエスパーを駆使して超解釈
【質問】
リアルタイムで動くゲーム(MMORPGか?)をしていますが、ゲームの動作速度を自由に変更したいです
ゲームの動作速度は API GetTickCount で取得した値に応じて動作しているようです
アドレス 0x7FFE0000 に書き込みが出来れば GetTickCount の返す値を自由に操作できます
これによってゲーム速度を変えられるのではないかと考えています
ただし、 0x7FFE0000 は読取専用となっており書込みが出来ません
どなたか 0x7FFE0000 のアドレスへ書込みを行う方法を教えて下さい
【回答】
っ API フック (jump するアドレスを書き換えろ!)
通報しました
>>934 わざわざ0x7FFE0000をreadしている理由を考えて見ましょう。
928はGetTickCountをフックしたいわけではないのでは。
>>936 自作関数ならアドレスの内容を書き換えなくても、
コピーしてから好きなように加工できるから
>>928 は目的を隠すためにそういう書き方をしてるんじゃなかろうか?
と邪推してみる
940 :
911 :2007/02/16(金) 10:42:23
DDKスレで質問してみます
>>928 は俺のエスパー能力を駆使しても分からんん。
32bitのアドレスならば、カーネルのメモリでもないし
思う存分書き込めばいいだろうし。
GetTickCountをフックしたのならば、
いくらでも自分の好きなようにすればいいだろうし。
他プロセスのメモリならば、WriteProcessMemoryするだけだし、
PAGE_READONLY等が指定されているというのならば、VirtualProtectExだろうし。
0x7ffe000〜は読み込み専用だった希ガス Ollydbgでアクセス属性を変えようとしてもエラーが出たような。
タイマーをフックしてゲームの速度を変更してしまうソフトがあるが、 ゲーム側でタイマー関係のAPIを呼ばずに0x7FFE0000を読んで 時間を取得するという対抗手段がある。 それに対応するために0x7FFE0000を書き換えたいのだろう。
はーなるほど。 NTでは、0x7FFE0000から面白い情報が入っているのか。 しかしなんでこっちを書き換えたいのかね。 これはOSが使う領域だろうに。 0x7FFE0000だと分かっているのなら、 そのアドレスを参照している部分を全部特定できるのでは。
945 :
デフォルトの名無しさん :2007/02/16(金) 17:10:23
質問です。 CでのAPIフック(他プロセス)の実現でSetWindowHookExを使ってやるのはどうすればいいのでしょうか? 現状、時プロセスにしかフックを実現できていません。 恐らくフックインストール時にインポートテーブルの書き換えをやっても呼び出しが自プロセスだからだと予想しているんですが。。。
947 :
デフォルトの名無しさん :2007/02/16(金) 18:11:13
それはCではないと思われ。 喧嘩を売るみたいで申し訳ないがググルなんて基本的な事はとうの昔にやっており、それでもわからなかったからここで質問したんだ。 俺が調べた限り【C言語】でのAPIフックのサンプルは自プロセスはあるが他プロセスに対してのアプローチのやり方は無かったはず(海外含めず) まあ、自己解決したんで概要を。 まず、DLLにアタッチしたとき共有メモリで自プロセスIDを取得する。これはターゲットプロセス以外フックを行わないため。 次にターゲットにフックをかましてアタッチされた時、プロセスIDを取得し共有メモリのIDと比較して等しくない場合インポートテーブルを書き換えAPIフック完了 携帯だから文章汚いが勘弁
948 :
946 :2007/02/16(金) 18:23:05
>>947 ごめん
ぐぐったらそれと全く同じ内容のサンプルが見つかった
949 :
デフォルトの名無しさん :2007/02/16(金) 18:32:45
マジで?それどこよ? いっとくけどKENJI氏のウェブサイトとかいわないでくれよ?w
フックするのにCとC++で何か違うの?
951 :
デフォルトの名無しさん :2007/02/16(金) 18:40:49
俺はCが前提って文頭に示して質問してるから、「何が違うの?」とか言われても逆に困るんだが。 取り敢えず帰宅するから家についてそのサンプルサイト楽しみにしてます。
なーんも変わらんな。 C++ かつラッパークラス作るあたりで、 暗黙でスタックに詰まれる this をどう始末するかで迷うだろうが。
釣りだから釣られないように
955 :
デフォルトの名無しさん :2007/02/16(金) 18:43:21
あるフォルダの内容が変更されたら(ファイルが追加されたり削除されたり) それを察知するにはどうすればいいですか
CreateFontで作ったフォントを使い終えたら元のフォントに戻す理由って何なんでしょうか。 色々調べてもそうした方が良い、そうするべき、としか書いてないので・・・
DCのSelectObject話なら戻す必要ないぞ あの辺をブラックボックスとみなす派が何が起きるかわからないと言ってるだけ malloc/free論争に近い
>>955 FindFirstChangeNotification
FindNextChangeNotification
理由聞いてたはずなのに自分に都合のいい意見なら理由はいらないんだ
961 :
945 :2007/02/16(金) 19:56:01
>>946 返信が無いな
まあ、おそらくKENJI氏のサイトなんだろうけどw
962 :
946 :2007/02/16(金) 19:59:22
>>961 そのサイトであってる
C++のコードだったがCでも書くこともできるので何の問題もない
それすらできないやつがAPIフックなんて考えないほうがいい
APIフックでググって最初の10件に、C言語で他プロセスにAPIフックを 仕込む日本語サンプルがあったんだが。
そもそもAPIフックって自プロセスのAPIフックして何が楽しいの?
親近相姦
>>malloc/free論争に近い 違う。全プロセスのGDIオブジェクトの合計はシステムで制限がされている(レジストリで指定されている)。
ビットマップとか DC に Select されたままだと DeleteObject しても 解放されないしね。
7FFE0000について今頃知った。 そうか、チート小僧だったのか。
>>966-967 そういう理由だったんですか・・・
丁寧にSelectObjectの戻り値は取っておいて戻しておくべきなんですね。
ありがとうございました。
970 :
945 :2007/02/17(土) 00:17:17
>>962 違うなー。サイトがあってる?俺は当初質問しただけで
サイト教えてとは一言もいってないんだけどな。
そもそも誰一人としてまとも(技術的)な返事が帰ってこなかった。
これじゃあ質問スレの存在意義が。。。(答えられる人がいないっていったらそれまでだけど)
ともかくなんとか自分で解決できたんだけどね。
「それすらできない」ってお前さん言ってるが、じゃあ有言実行
KENJI氏のC++コードを同じ動作をCで組んでごらん?
大変だから。解決はしたが、少なくとも知識の乏しい俺はここに
たどり着くまでにかなりの時間かかったけどな。
まあ、苦労したなりに得るものはかなり大きかったが。
それに動機(実現したいと考える)があるからものすごい努力するんであって
「それすらできない奴は考えない方がいい」という発言はおかしな話だと思わないか?。
恥を覚悟で言うがAPIフックをターゲット(単一)プロセスに実現できるように
なるまでにかかった時間は実に2ヶ月だ。今日はじめてできたんだ笑えよw
>違うなー。 まで読んだ。
>>966 ごめん「全プロセス」っていっているてことは
GDIProcessHandleQuotaやUSERProcessHandleQuotaとは別のものがリミットとして存在するってこと?
↑のやつの制限って「1つのプロセス」の制限値だよね?
よろしければ、教えてください。
>>970 質問に対する答えとしてググれとかどこそこのページを見ればいいというのは認めないのか。
あと、そんなあのようなC++のコードをCにするのが大変なら、
拡張子cppでC++のままにしておいて、
自分の書くコードはCのコードのように書くという手段では駄目か?
974 :
945 :2007/02/17(土) 00:57:08
>>973 それはもはやCとはいえない気が。
ググれとかどこそこのページを参考にとはわかるんだが
既にそのページを見て参考にしてでもわからないとなると
いったいどうすればいいんだろうという話を俺はしてたつもり。
まあなんにしろ何とか実現できたんで満足
975 :
945 :2007/02/17(土) 00:57:52
これ以上いるとウザイからこれを最後に名無しに戻る。
976 :
928 :2007/02/17(土) 01:04:20
皆様、反応ありがとうございます。
一応、GetTickCountをフックしてピンボールを早くすることくらいはできますw
kernel32.dllのGetTickCountはご存知の通り
0x7FFE0000を参照しているだけです。
>>944 OSが使う領域ということは
カーネルモードでしか書き込みできないのでしょうか。
>>976 ふむふむ、確かに
MyGetTickCountとGetTickCountが同じ結果となる。
>>974 そういうときはどこがどうわからないか具体的にはっきりと書いておいて、
後は誰か説明してくれる親切な人が現れるのを待つしかないよ。
APIフックで思い出したけど、カーネルのSeAccessCheckを フックして常にTRUEを返すようにしたら、あらゆるアクセス権を 無視して自由にアクセスできたな‥‥
(゚Д゚)
こっち見んな
982 :
966 :2007/02/17(土) 13:20:23
972さま、わたくしのかんちがいでありました。 全部で約16K個という制限は固定であります。 つけくわえると、Vistaは所持しておらず不明であります。
983 :
デフォルトの名無しさん :2007/02/17(土) 18:47:12
特定のネットワークアダプタの有効化/無効化を、 プログラムやバッチファイル等から制御する方法はあるでしょうか? netsh.exeで簡単にできるのかと思っていたんですけど無理みたいです。
,、‐ " ̄:::゙:丶、 ,r: ,' 3゙ :::::::/ハヽ:ヽ::::、:ヽ {::://:::::::// ヽ\ト、:::::::! ヾ l:::::::/ 丶 `ヾ ィ、:::| |;:r::| O` 'O ゙ハ| < ないない ヽハ :.:. :.: レ ´\ r‐--‐、,ノ r、 r、/ヾ ̄下ヘ ヽヾ 三 |:l1、_ヽ/__ .ィヽ \>ヽ/ |` } n_n| | ヘ lノ `'ソ l゚ω゚| | /´ /  ̄|. | \. ィ ___ | | | ノ l | | | | i:| |
985 :
983 :2007/02/17(土) 20:27:54
自己解決しました。 984にカチンときたので教えません。 バーカ!
986 :
983 :2007/02/17(土) 20:35:25
ほんとに使えねえクズどもだな。
次すれまだぁ?
CTRL+ALT+DELをプログラムからPCに送る方法ありませんか? keybd_eventやVNCがやってる方法では期待する動作になりませんでした。 単にタスクマネージャーを出したいわけではなく、割り込みを発生させたいのです。
wsprintfW(&Buff[0], TEXT("%s"), lpStr); cds.cbData = lstrlen(Buff) * sizeof(TCHAR) + 1; これで表示させた時、途中から文字が化けるんだが。 どうしてかわかる人いますか? UNICODEだからかな。 lpStrは固定長でWCHARで9バイトになります。 cds.cbData(COPYDATASTRUCT)に9を指定するとちゃんと表示されるんですが・・・・ APIの不具合なんですかね?
WCHARで9バイト?
先頭1バイトが長さを指定したりする方式なのかなぁ?
cds.cbData = lstrlen(Buff) * (sizeof(TCHAR) + 1); トレイラーも二バイトなんじゃないの? 標準C++ではワイドのヌルキャラクターはやっぱりワイド。
994 :
990 :2007/02/17(土) 21:35:23
>>991 !!!!!!!!!!!!!!
ありがとうございます!
メモリにあるzip形式で圧縮されたデータを解凍するのにベストな方法は? UnZip.dllだと1回ファイル作らないといけない?? 何かフリーでライブラリないかな。
>>995 ファイルに書き出しさえすれば色んな解凍ツールが使える
余計なコーディングはしないという点からはベスト!
おいらはzlib付属のminizipみて、メモリ展開するようなのをつくったけど。
APIの質問しろやああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
1000 :
1000 :2007/02/17(土) 22:37:41
自己解決しました。
>>1-999 にカチンときたので教えません。
バーカ!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。