Win32API質問箱 Build49

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
2デフォルトの名無しさん:2007/01/14(日) 02:21:37
3デフォルトの名無しさん:2007/01/14(日) 02:22:44
32 ttp://pc8.2ch.net/test/read.cgi/tech/1117271829/
31 ttp://pc8.2ch.net/test/read.cgi/tech/1114762194/
30 ttp://pc8.2ch.net/test/read.cgi/tech/1112345886/
29 ttp://pc8.2ch.net/test/read.cgi/tech/1110281860/
28 ttp://pc5.2ch.net/test/read.cgi/tech/1108199304/
27 ttp://pc5.2ch.net/test/read.cgi/tech/1106103119/
26 ttp://pc5.2ch.net/test/read.cgi/tech/1104109858/
25 ttp://pc5.2ch.net/test/read.cgi/tech/1101393155/
24 ttp://pc5.2ch.net/test/read.cgi/tech/1098967135/
23 ttp://pc5.2ch.net/test/read.cgi/tech/1095534704/
22 ttp://pc5.2ch.net/test/read.cgi/tech/1092524669/
21 ttp://pc5.2ch.net/test/read.cgi/tech/1090422324/
20 ttp://pc5.2ch.net/test/read.cgi/tech/1088140233/
19 ttp://pc5.2ch.net/test/read.cgi/tech/1084697545/
18 ttp://pc5.2ch.net/test/read.cgi/tech/1081702990/
17 ttp://pc5.2ch.net/test/read.cgi/tech/1077470361/
16 ttp://pc2.2ch.net/test/read.cgi/tech/1073830065/
15 ttp://pc2.2ch.net/test/read.cgi/tech/1069339866/
14 ttp://pc5.2ch.net/tech/kako/1065/10653/1065328397.html
13 ttp://pc5.2ch.net/tech/kako/1059/10595/1059549320.html
12 ttp://pc5.2ch.net/tech/kako/1056/10560/1056033645.html
11 ttp://pc5.2ch.net/tech/kako/1052/10526/1052651750.html
10 ttp://pc5.2ch.net/tech/kako/1047/10478/1047819779.html
9 ttp://pc5.2ch.net/tech/kako/1044/10449/1044929160.html
8 ttp://pc5.2ch.net/tech/kako/1040/10409/1040964626.html
7 ttp://pc3.2ch.net/tech/kako/1036/10366/1036654893.html
6 ttp://pc3.2ch.net/tech/kako/1032/10325/1032548635.html
5 ttp://pc3.2ch.net/tech/kako/1028/10285/1028580373.html
4 ttp://pc3.2ch.net/tech/kako/1023/10233/1023361418.html
3 ttp://pc.2ch.net/tech/kako/1017/10170/1017072275.html
2 ttp://pc.2ch.net/tech/kako/1006/10067/1006783012.html
1 ttp://pc.2ch.net/tech/kako/991/991576947.html
4デフォルトの名無しさん:2007/01/14(日) 02:24:32
5デフォルトの名無しさん:2007/01/14(日) 02:25:23
MSDN日本語版は誤訳があったり、一部欠けていたりするなど不完全なため、英語版推奨。
http://msdn.microsoft.com/library/
http://msdn2.microsoft.com/en-us/library/

おまけ;Windows SDK for Windows Vista RC1の文書。
http://windowssdk.msdn.microsoft.com/en-us/library/

MSDN ライブラリ 2006年8月版
http://www.microsoft.com/downloads/details.aspx?FamilyID=6671F8DA-B0CB-41DE-AD93-798FC71D344D&displaylang=ja


windowssdk.msdn.microsoft.comは、もうmsdn2へ転送されるようになっている。
6デフォルトの名無しさん:2007/01/14(日) 02:44:45
          ヽ / /⌒\
         /ヽヽ|/⌒\ii|\
       / /ヾゞ///\\|
       |/   |;;;;;;|/ハ \|
             |;;;;//⌒ヽ
             |;/( ^ω^) >>1おっおっおっ乙枯ー
.           |{ ∪  ∪
             |;;ヾ.,____,ノ
             |;;; |
             |;;;;;|
             |;;;;;|
7デフォルトの名無しさん:2007/01/14(日) 06:18:38
8デフォルトの名無しさん:2007/01/14(日) 10:09:01
msdn2はなんであんなに重たいの?
9デフォルトの名無しさん:2007/01/14(日) 10:36:47
みんな使ってるからじゃない
10デフォルトの名無しさん:2007/01/14(日) 15:38:34
えーっ!!
俺のmsdn2ローカルにあるんだが
11デフォルトの名無しさん:2007/01/14(日) 15:48:40
msの鯖缶きたこれ
12デフォルトの名無しさん:2007/01/14(日) 16:08:12
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を使うってことでしょうか?

長文で申し訳ないですが、よろしくおねがいします。
13デフォルトの名無しさん:2007/01/14(日) 17:27:22
>>12
IE1とIE2って同居できたっけ?
つか、今時、Win95使ってんのか?
もう11年も前のOSだぞ。
14デフォルトの名無しさん:2007/01/14(日) 17:46:38
だがそれもいい
15前スレ970:2007/01/14(日) 20:28:07
>>13
いや,便宜上区別するためにIE1とIE2と書いているのです。IEのバージョンは6です。

IEの詳細設定から別プロセスで起動するって項目が無くなって、新しいウィンドウが
元のウィンドウから生成されるとき、スレッドを生成して立ち上がるようになりましたよね?
その新しいウィンドウの状態をどうやって取得すればよいのか分からなくて、質問させて
いただきました。
16デフォルトの名無しさん:2007/01/14(日) 20:35:57
その開くページは自前のページ?
自前のページならそのHTMLの unload イベント(だったっけ?
最近、弄ってないから正確に覚えてない)で小細工すればどうにかなると
思うけど、そうじゃないならちょっと難しいかもね。
外部からスレッドを監視するにしても新しく作成されたスレッドが
自分が監視するべきスレッドであるかどうかなんて区別のしようがないし。
17デフォルトの名無しさん:2007/01/14(日) 23:37:53
Acrobatのページサムネール表示、あるいはPowerPointのスライド一覧表示のように、
イメージのリストを表示し、かつ、その順番をマウスのドラッグで調整したいと思ってます。
ドラッグ中、イメージが挿入される場所にカーソルの様な縦線が出てきて欲しいなと思ってます。

詳しいお兄様方、既存の実装例やコントロールのコードのサンプルなど御存知でしたら御教示下され
スレ違いならごめんなさい。
18デフォルトの名無しさん:2007/01/14(日) 23:42:39
Windows
VC++2005です。

Mezegisのような、加速器を作りたいと考えています。
一応、資料等を探してはみたのですが、全くありませんでした。
どなたか資料等や、必要なAPIや、サンプルコード等を教えて頂けませんでしょうか。
よろしくお願いいたします

Mezegisというのはttp://hp.vector.co.jp/authors/VA017297/のRagud Mezegisです。

http://pc10.2ch.net/test/read.cgi/tech/1153542424/l50
こちらのスレで誘導されて来ました。
19デフォルトの名無しさん:2007/01/15(月) 00:18:12
ttp://hp.vector.co.jp/authors/VA028184/qands.html#D29
こういうことではない?
20デフォルトの名無しさん:2007/01/15(月) 01:11:33
若いの オラが村では派遣の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとムキになって怒る者がおるでよぉ
問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな糞田舎で悲惨な生活するためにはよぉ
北朝鮮と一緒でよ、駄目のものを駄目と言ってはなんねえだべさ
21デフォルトの名無しさん:2007/01/15(月) 02:28:05
>>18
そのソフトは知らんが、簡単に言うとタイマー系APIを自前の処理に
置き換えるのが基本。
APIを置き換える手段はAPIフックとか、ラッパーDLL等。
ターゲットが決まっているならラッパーDLLが楽かな。

とりあえず、そういうことがしたいならAdvanced Windowsを買うように。
22デフォルトの名無しさん:2007/01/15(月) 02:37:42
ラッパーAPIってのは一歩間違えるとこういう結果になるぞ
http://pc10.2ch.net/test/read.cgi/prog/1164508336/
23デフォルトの名無しさん:2007/01/15(月) 02:56:31
YO!YO!ですYO!、YO!YO!ですYO!
24デフォルトの名無しさん:2007/01/15(月) 03:12:14
25デフォルトの名無しさん:2007/01/15(月) 03:19:20
自分では素晴らしい新APIを作ったつもりが実際はただのラッパという馬鹿はよくいる
26デフォルトの名無しさん:2007/01/15(月) 03:56:54
つまり>>25みたいな奴ってことか
27デフォルトの名無しさん:2007/01/15(月) 08:30:34
こんなことしたいんでけど、実現できる
win32_api知ってたらおしえてくらはい(m_m)
(1) ActiveDirectoryドメインへ参加しているPCに対して
  あるローカルユーザAでログオンする。
(2) ローカルユーザAがログオンしたデスクトップ上で、
  あるドメイン用ユーザのドメインログオン
  を模倣する処理を走らせて、ドメイン用ユーザに
  対してキャッシュログオンが可能な状態にする。
=>要はドメインユーザに対して、
=>最初からキャッシュログオンが可能な状態にしたいってことです。


28デフォルトの名無しさん:2007/01/15(月) 10:43:50
29デフォルトの名無しさん:2007/01/15(月) 13:51:36
それどこのキーロガー?
30デフォルトの名無しさん:2007/01/15(月) 17:41:12
PPM画像を読み込んで表示するのとRGBデータそれぞれの配列を用意して格納する方法を教えてください。
31デフォルトの名無しさん:2007/01/15(月) 17:52:54
Win2K以降のAPIでも構わないのですが、
プロセスIDのみが判ってる状態からそのプロセスのフルパスを得るにはどうすればいいんでしょうか?
OpenProcessしてもそっからなに使っていいかわかりません

本来の目的は指定されたパスの実行ファイルが起動中であるか否かを調べたいだけなので、
そういう状況では失敗するAPIを使って判別できればそれはそれでOKですが
32デフォルトの名無しさん:2007/01/15(月) 18:09:01
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までしかとれません
(テキスト形式だとこの制約はありません).
33デフォルトの名無しさん:2007/01/15(月) 18:14:30
34デフォルトの名無しさん:2007/01/15(月) 18:18:23
35デフォルトの名無しさん:2007/01/15(月) 18:27:39
>>31
CreateToolhelp32Snapshotでモジュールの一覧取れるよ。
プロセスIDから知りたいなら、OpenProcess→EnumProcessModules→GetModuleFileNameEx
36デフォルトの名無しさん:2007/01/15(月) 18:28:24
指定したファイルが開かれている(編集中)かどうかを調べるにはどんな方法がありますか?
開発環境はVB6.0で、WIN XPか2000で動作すればよいです。よろしくお願いします。
37デフォルトの名無しさん:2007/01/15(月) 18:40:20
>>33-35
ありがとうございます
CreateToolhelp32Snapshotでプロセス列挙してたので>>31でPIDは判る(非フルパスも判る)、
という状態たったのでEnumProcessModules→GetModuleFileNameExでいけそうです

GetProcessFileNameとはいかないまでも意外と直接的な方法がないんですね
38デフォルトの名無しさん:2007/01/15(月) 19:16:30
>>36
排他オープンしてみるとか
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をインクルードするだけでいいと思うのですが。
間違っている箇所があれば教えていただけますか?
40デフォルトの名無しさん:2007/01/15(月) 20:47:20
他のプロセスのボタンを押すにはどうすればいい?
41デフォルトの名無しさん:2007/01/15(月) 20:48:10
BM_CLICK
42デフォルトの名無しさん:2007/01/15(月) 20:52:26
>>39
#define _WIN32_WINNT 0x0500
43デフォルトの名無しさん:2007/01/15(月) 20:53:48
>>39
#if (_WIN32_WINNT > 0x0400)
になってるけど、まさかこれが原因じゃないよな
とりあえず winuser.h に INPUT があるか確かめてみれば
ちなみに windows.h をインクルードすれば winuser.h はいらない
44デフォルトの名無しさん:2007/01/15(月) 20:54:37
>>41
thx
45デフォルトの名無しさん:2007/01/15(月) 20:56:16
>>41
sex
4639:2007/01/15(月) 22:08:18
できました。ありがとうございました。
47デフォルトの名無しさん:2007/01/15(月) 22:13:27
>>45-46
つい続けて読んだらフイタ
48デフォルトの名無しさん:2007/01/15(月) 22:27:43
>>47
お前のせいでオレまでフイタ
49デフォルトの名無しさん:2007/01/15(月) 22:28:37
>>48
お前のせいで(ry
50デフォルトの名無しさん:2007/01/16(火) 00:04:00
>>49
お前n(ry
51デフォルトの名無しさん:2007/01/16(火) 00:09:16
>>50
おm(ry
5217:2007/01/16(火) 04:32:44
以下の方が適切かなと思いましたので移動致します。。。
http://pc10.2ch.net/test/read.cgi/tech/1164073111/
53デフォルトの名無しさん:2007/01/16(火) 19:38:07
>>52
空気嫁
54デフォルトの名無しさん:2007/01/16(火) 22:24:34
>>53
だが断る。
55デフォルトの名無しさん:2007/01/16(火) 22:26:59
プログラムの本体があるディレクトリを取得するにはどうすれば?
GetCommandLine関数から摘出する以外に無い?
56デフォルトの名無しさん:2007/01/16(火) 22:30:10
いや
57デフォルトの名無しさん:2007/01/16(火) 22:36:32
>>55
激しく既出。

GetModuleFileName

正直いってこのスレの住人はうんざりしてるので
1スレ分くらいは読んだ方がもめなくて良い。
58デフォルトの名無しさん:2007/01/16(火) 22:43:23
SDK初心者です基本的な質問ですがよろしくオナガイシマス
MessageBoxの第二引数はLPCSTRなので
int型の数字を表示する場合、キャストしないといけないのですが
仕方を教えてもらえませんか
59デフォルトの名無しさん:2007/01/16(火) 22:46:59
>>58
SDK初心者じゃなくてプログラミング初心者じゃね?
単純なキャストじゃダメ。 sprintfとか。
60デフォルトの名無しさん:2007/01/16(火) 22:55:00
C++ならboost::lexical_castというキャストがある、というのはだめか?
61デフォルトの名無しさん:2007/01/16(火) 23:01:59
>>60
「単純な」キャストではないな
62デフォルトの名無しさん:2007/01/16(火) 23:02:57
>>59
やっぱりこのマンドクサイ方法しかないのかな
TCHAR buff[8];
_stprintf_s(buff, TEXT("%d"), Index);
MessageBox(NULL, buff, TEXT("数字"), MB_OK);
>>60
ぜひ教えて下さい、↑の書き方にほとほと飽きてキマスタ
.NETなら
Convert::ToString(L"Uint 1");
とかで出来るのに
63デフォルトの名無しさん:2007/01/16(火) 23:03:46
スマソ58=62です
64デフォルトの名無しさん:2007/01/16(火) 23:03:47
今後、ExtractIconの様に引数によっては戻り値が異なる関数を利用する場合は、
PtrToUlongを利用すべき?

例)
UINT nIconCount = (UINT)PtrToUlong(::ExtractIcon(::AfxGetInstanceHandle(), _T("Shell32.dll"), (UINT)-1);
65デフォルトの名無しさん:2007/01/16(火) 23:11:51
>>62
無理しないで自分に合った言語を選べばいいよ
66デフォルトの名無しさん:2007/01/16(火) 23:14:45
>>62
あのなぁ。
それを関数なりマクロなりにすりゃいいんだよ。
同じことを書いてると思ったら括り出すチャンス。
67デフォルトの名無しさん:2007/01/16(火) 23:18:02
>>65
無理したくないけど、させられるんです、ネィティブWindowsのコードって
むずかし〜わけわかんねー型変換とか、ワイド文字だマルチバイトだって
制約多いしC言語の宿命みたいなもんだが・・・・・
68デフォルトの名無しさん:2007/01/16(火) 23:20:00
API風に言うとwsprintfだろ普通
69デフォルトの名無しさん:2007/01/16(火) 23:21:26
>>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型で戻り値を受けようよ。
70デフォルトの名無しさん:2007/01/16(火) 23:21:56
>>68
wsprintfは1024バイトが上限。
_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_lを使うのがおっとこまえ
71デフォルトの名無しさん:2007/01/16(火) 23:23:49
>>69
PtrToUintか?
サンクス
72デフォルトの名無しさん:2007/01/16(火) 23:23:51
>>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()自体のラッパでも書くんだな。
73デフォルトの名無しさん:2007/01/16(火) 23:26:26
>>69
58です
サンクス
Cも中途半端にいきなり.NETとかやってたんでC++弱いんだよねマジで
74デフォルトの名無しさん:2007/01/16(火) 23:28:56
>>73
そういう問題じゃないな。君の頭が回らないだけ。
75デフォルトの名無しさん:2007/01/16(火) 23:31:34
>>74
58だが
頭は回らないが、ティムポは良く動きますがなにか
76デフォルトの名無しさん:2007/01/16(火) 23:32:46
また違う誰かが、どっかで>>58の様な質問するから
そん時は>>73が誇らしく回答すればいいんじゃね?

このスレじゃないと思うけど。
77デフォルトの名無しさん:2007/01/16(火) 23:35:14
つか言語をまず指定するべきだろ
Cだと>>69は使えないわけだし
78デフォルトの名無しさん:2007/01/16(火) 23:43:12
#include <windows.h>
#define tostr(arg) (TEXT(#arg))
int main()
{
MessageBox(NULL, tostr(519), tostr(11), MB_OK);
}

ほらかんぺきだ
79デフォルトの名無しさん:2007/01/16(火) 23:49:45
#include<w...>

int main(void)
{
MessageBox(NULL, TEXT("123..."), TEXT("12222222222222222222222222222"), MB_OK);
return ...;
}

完璧だろ
8069:2007/01/16(火) 23:50:36
>>77
60でC++ならと書いたところ、62で良しと言われたので69を書いた。
81デフォルトの名無しさん:2007/01/16(火) 23:52:12
>>78-79
お前らのやる気の無さは完璧すぎるwwwwwwwww
82デフォルトの名無しさん:2007/01/17(水) 00:11:32
プログラムの基礎が分かってないんだな
「型」というものが何か分かってれば
直接的に操れる分、それほど複雑でもないと思えるはず
8382:2007/01/17(水) 00:14:37
誤爆ゴメン
84デフォルトの名無しさん:2007/01/17(水) 00:49:56
俺らに型を語るなんて10年早い
85デフォルトの名無しさん:2007/01/17(水) 01:09:20
俺らに語を型るなんて10年早い
86デフォルトの名無しさん:2007/01/17(水) 08:18:21
Windowsアプリケーションを起動するとき、
main関数、WinMain関数に達するまではどういう手順をふんでいるの?
ベタにアプリケーションのアドレスを0から解読して実行してるだけ?

それとも、ファイルヘッダの部分が存在して、
そこに示すアドレスからジャンプー>main関数、WinMain関数に行く訳?

また、アプリケーションのエントリポイントは、
固定値で、OSが勝手に判断しているわけ?


だれか、main関数、WinMain関数以前の処理を教えてくれませんか?
もしくは、詳しく説明しているサイト、
関連するMSDNページを知っていれば教えていただきたいです。
87デフォルトの名無しさん:2007/01/17(水) 08:50:46
こんなとこで聞くな
88デフォルトの名無しさん:2007/01/17(水) 08:54:45
89デフォルトの名無しさん:2007/01/17(水) 08:58:20
90デフォルトの名無しさん:2007/01/17(水) 09:01:59
>>86
>それとも、ファイルヘッダの部分が存在して、そこに示すアドレスからジャンプ
このとおり。

>また、アプリケーションのエントリポイントは、固定値で、OSが勝手に判断しているわけ?
違う。 リンカでエントリを明示的に指示している。

通常暗黙のエントリポイントを指していて、ランタイムの初期化や グローバル/static オブジェクトの生成等
の処理を行った後に main や WinMain を呼び出している。
したがって、暗黙のエントリポイントは標準で連結されるであろうライブラリの何処か

>だれか、main関数、WinMain関数以前の処理を教えてくれませんか?
コンパイラ次第なので、スタートアップルーチンのソースがあるか次第。
VC6(インストール時に選択されてれば) は CRT/SRC/*.* にある。
9186:2007/01/17(水) 09:23:36
>>87-90
どうもありがとうございます!
調べてみます
92デフォルトの名無しさん:2007/01/17(水) 21:20:03
すみません、データ共有について質問させてください
ファイル構成
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")なども試しました)
どこがおかしいのでしょうか
93デフォルトの名無しさん:2007/01/17(水) 21:46:45
>>92
DLLがプロセスに読み込まれる度にnewで新たなオブジェクトが作られている予感。

また、setを初めとしたC++のコンテナは、要素を格納するメモリを内部で独自に確保しているから、
コンテナそのものを共有させても要素まで共有されない。
94デフォルトの名無しさん:2007/01/17(水) 22:04:30
allocatorを共有すればいいんじゃね?
9592:2007/01/17(水) 22:27:12
>>93
ありがとうございます
なるほど、コンテナは避けたほうがよさそうですね

とりあえずwchar_t*配列に書き直して実行してみたのですがダメで
そもそも根本的な勘違いをしている気がしてきました
data_segは、DLLを呼び出すコードとDLL間でデータを共有するというよりは
DLLを呼び出すコードが複数あった場合に
DLLが別々のコードから呼び出された時も
同じデータを持つ機構って感じがするのですがどうでしょうか
なのでmainでデータ追加というのが
そもそも間違っているような気がしてきました

>>94
自分には無理そうです、すみません
アロケータは難しいイメージがあって
さらに共有となるとどうやっていいのかさっぱりイメージが・・・
9692:2007/01/17(水) 22:50:39
コードを書いて確認してみました
int型変数をカウントアップするだけのexport関数を書いて
dll.cpp側でカウントアップし
アプリを複数起動したらカウントがちゃんと増えました
data_segは、dll.cppとmain.cppで、
グローバル変数のように使えるのかと思ってたんですが
データ共有ってそういうのではないっぽいですね
とりあえず、データの受け渡しをする関数を
書いたら何とかなりそうなので、それで頑張ってみることにします
97デフォルトの名無しさん:2007/01/17(水) 23:02:48
うろ覚えだけどdata_seg使う場合は、変数に初期化子付けないと
共有にならないんじゃなかったかな。
9892:2007/01/17(水) 23:29:09
>>97
どうも、そうみたいですね
つけないと.bssセクションに置かれるとあります
一応自分が試したコードでは全て初期化して試してるけど
MSDNよく読んだら静的な初期化じゃないとダメらしく
上みたいにnewするのもNGの模様
99デフォルトの名無しさん:2007/01/17(水) 23:29:21
>>94
というより、共有メモリを確保するアロケータを使えというほうが、まだ適切。

>>95
wchar_t*の各要素も共有メモリ上に確保しないとだめだぞ。
10095:2007/01/18(木) 00:05:35
>>99
ありがとうございます
今のところ、とりあえずwchar_t[10][10]みたいなのでやろうと思ってます

共有メモリ上でポインタを実現するとなると、
使ったことないんですがメモリマップトファイルを使うのでしょうか
MSDNには、baseからのオフセットでポインタが実現できるとありました
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vccore/html/_core_how_do_i_share_data_in_my_dll_with_an_application_or_with_other_dlls.3f.asp
101デフォルトの名無しさん:2007/01/18(木) 00:06:03
"C:\エロ動画.zip" にうpしました!

というようなもんだな。
データへのポインタは共有されているが、他のプロセスではそのポインタが意味をなさない。
102デフォルトの名無しさん:2007/01/18(木) 00:19:52
だって独立したメモリだもん
103デフォルトの名無しさん:2007/01/18(木) 02:55:54

common.h
typedef std::set<wchar_t*> wcset;
#pragma data_seg(".shared")
wcset* data = NULL;
#pragma data_seg()


にしておいて

DLLMainで

data = new wcset();

じゃないかな
104デフォルトの名無しさん:2007/01/18(木) 03:47:38
new wcset();

の時点で、その new したプロセスのみしかポインタの値が有効にならんでしょー
105デフォルトの名無しさん:2007/01/18(木) 06:38:06
#pragma data_seg(".shared")
wcset data_instance;
wcset* data = &data_instance;
#pragma data_seg()
106デフォルトの名無しさん:2007/01/18(木) 08:06:12
> wcset data_instance;

プロセスの数だけコンストラクタが動くんじゃないか?
107デフォルトの名無しさん:2007/01/18(木) 09:07:56
>>104
DLLにリンクしないつもりか?
108デフォルトの名無しさん:2007/01/18(木) 09:23:47
アクセサを自分で定義するなら >>103 でも正解のような気がする
109デフォルトの名無しさん:2007/01/18(木) 09:24:53
#pragma data_seg(".shared")
wcset* data = NULL;
#pragma data_seg()

こいつをどちらか一方

もう片方は
extern wcset* data;

後はどっかで
data = new wcset();
110デフォルトの名無しさん:2007/01/18(木) 09:33:40
data_seg に リンクカウンタ用意して DllMain の
DLL_PROCESS_ATTACH で リンクカウントUP & 初回なら new
DLL_PROCESS_DETACH で リンクカウントDOWN & 最終回なら delete
ってな感じか
111デフォルトの名無しさん:2007/01/18(木) 12:39:23
DLL_PROCESS_DETACH で リンクカウントDOWN & 最終回なら delete
してる間に別のプロセスが
DLL_PROCESS_ATTACH で リンクカウントUP & 初回なら new
してたら最悪のパターン
ミューテックスでも使うか?


・・・なんの話だっけ??
112デフォルトの名無しさん:2007/01/18(木) 14:33:33
なんだかよくわからないけど

#pragma data_seg(".shared")
char d[sizeof(wcset)] = {0};
wcset* data = NULL;
#pragma data_seg()

で、どっかでplacement newじゃだめ?
113112:2007/01/18(木) 14:46:43
すまん
コンテナ内のメモリの確保が問題なんだな
アロケータ書くとかしないとだめか
114デフォルトの名無しさん:2007/01/18(木) 15:13:40
どっちにしろ同期処理は必須だからMutexとか使わないといけないし、
#pragma data_seg(".shared")だけで解決できる問題じゃないと思うけど。
115デフォルトの名無しさん:2007/01/18(木) 18:26:54
定義しているものしか共有できないから諦めろ
116デフォルトの名無しさん:2007/01/18(木) 22:08:00
難しい話をしているねぇ〜 まぁお茶でも飲もうぜ。
117デフォルトの名無しさん:2007/01/18(木) 22:52:14
new をオーバーライドすれば良かろうもん
118デフォルトの名無しさん:2007/01/18(木) 23:33:28
そんなにオブジェクトを共有したければ、アウトプロセスCOMサーバを作ればいいだろうに。
119デフォルトの名無しさん:2007/01/19(金) 08:12:31
>>118
IUnknown::AddRef();
IUnknown::Release();
ってやつね。

敷居が高そー
12092:2007/01/19(金) 19:17:12
なんかすごい難しそうなことになってるなー
あれから試行錯誤した結果、もう共有は諦めて
mainからWM_COPYDATAを使ってなんとかしようと思ってます

ところで、上の96も、さらに間違っていたようで
ttp://www.codeproject.com/dll/hooks.asp
英語力が微妙なせいで間違っているかもしれないけど
main.cppと、main.cppとは別のdll.cppを呼び出したプロセスと
「偶然に」同じページにあったら共有できて
ページが違えば共有できない、っぽい
どちらにしろ、そんな偶然をあてにするコードは書くべきではないだろうけど。
(´Д`)もう投げ出したい
121デフォルトの名無しさん:2007/01/19(金) 20:15:55
  /\___/\
/ ⌒   ⌒ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < 投げ出せばいいじゃん
|   ト‐=‐ァ'   .::::|    \_________
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
122デフォルトの名無しさん:2007/01/19(金) 22:14:05
大きなデータの共有はCreateFileMappingじゃないの
123デフォルトの名無しさん:2007/01/19(金) 22:24:31
それはそうだけど、議題は内部にポインタを持つデータ構造の共有
STLだからアロケータ書かないとダメ
124デフォルトの名無しさん:2007/01/19(金) 23:00:56
ループしてるぞw
125デフォルトの名無しさん:2007/01/19(金) 23:24:17
ポインタを持たなければいい
126デフォルトの名無しさん:2007/01/20(土) 00:36:45
Cの世界に戻って考えたほうが、結局幸せになれる予感。
ポインタの代わりにオフセットで保持する位は、たいした事無いだろ。
127デフォルトの名無しさん:2007/01/20(土) 00:55:54
Cではポインタは普通に使うだろ
配列を使ってポインタやフリーリストを自分で管理するような仕事は、
むしろCのように便利にポインタが使えない言語でよくやったんじゃないか?
128デフォルトの名無しさん:2007/01/20(土) 00:59:50
僕ハッカー
129デフォルトの名無しさん:2007/01/20(土) 01:13:38
馬鹿バッカー
130デフォルトの名無しさん:2007/01/20(土) 09:19:57
まだやってんの?
131デフォルトの名無しさん:2007/01/20(土) 13:07:58
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われている
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにする
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも派遣を続けることが大切だ
132デフォルトの名無しさん:2007/01/20(土) 13:22:23
ポインタがいいよと君がいったから一月二十日はメモリ破壊日
133デフォルトの名無しさん:2007/01/20(土) 16:57:35
バカバッカー
134デフォルトの名無しさん:2007/01/20(土) 21:44:39
135デフォルトの名無しさん:2007/01/20(土) 21:59:34
>>134
続きをbzip2でクレ
136デフォルトの名無しさん:2007/01/21(日) 00:27:19
Vistaの場合、ExplorerのSysListView32から
各ファイルのITEMIDLISTを取得するってどうやるんでしょう?

以前のOSの場合、LVITEMのlParamに(非公式ながら)入ってたんですが……
137デフォルトの名無しさん:2007/01/21(日) 06:22:11

前スレでウィンドウのイネーブル/ディスエーブルについて質問したものですが、
どうもすみません。色々勘違いしてました。

当初やりたかった事は、
GUIアプリAが、ユーザーの操作により、GUIアプリBをCreateProcessします。
その時、アプリBが終了するまでアプリAの操作を禁止したいのです。
そして、アプリBがユーザーによって閉じられた時に
アプリAがフォアグラウンドになるようにしたいのです。

アプリBのメインウィンドウのオーナーを、
アプリAのメインウィンドウにすれば実現できるようです。

でも今回の場合、アプリBは私が書いたものではないのです。
アプリBのオーナーを指定する事はできません。

アプリAは私が書きます。
なのでアプリAのコードのみでウィンドウownと同じ事をしたかった訳ですが・・・
138デフォルトの名無しさん:2007/01/21(日) 06:22:56
<<Aのコード>>
自分自身をEnableWindow(FALSE)
CreateProcess(B)
メッセージループを回しながらBの終了を待つ。
Bが終了したら自分自身をEnableWindow(TRUE)&SetForegroundWindow

という風にしたら、一応近い感じにはなったのですが、
Bを操作中に、いったん無関係のアプリCに切り替えて
またBに戻すと、AはCの裏に来ています。
ここですでに嫌な予感がしたのですが、
この状態でBを終了すると、Aがフォアグラウンドにならずに
Cがフォアグラウンドで、Aはタスクバー上でピコピコしているだけです。

なんとかownと同じようにできないでしょうか・・・
139デフォルトの名無しさん:2007/01/21(日) 08:00:34
WaitForMultipleObjects
MsgWaitForMultipleObjects
WaitForSingleObjects

ただし、強制終了するときなんかのことを考えると
WaitForSingleObjectsはオススメできない

> イネーブル/ディスエーブル
せめて有効/無効って書いてくれ
一瞬何のことかと思った
いやまあ、今回は関係ないんだけどね
140デフォルトの名無しさん:2007/01/21(日) 10:01:14
日本語じゃなくてもいいから
せめてEnable/Disableって書いてくれ
141デフォルトの名無しさん:2007/01/21(日) 11:40:06
前スレの124か ?
> メッセージループを回しながらBの終了を待つ。
どのように変更したの。相変わらず、WaitForをつかっているの。
それと、AとBのウィンドウスタイルはWS_OVERLAPPEDかWS_POPUPか教えてくれ。

現段階の情報だけだと、
GetForegroudWindow()にAttachThreadInput()してからSetForgroundWindow()か。
ちらつくけど。
142デフォルトの名無しさん:2007/01/21(日) 11:43:06
アプリB起動時にAttachThreadInputしておく、かなあ。
でも、終了時に別のプロセスがフォアグラウンドになってオジャン、な予感もする。
143デフォルトの名無しさん:2007/01/21(日) 11:47:20
>でも今回の場合、アプリBは私が書いたものではないのです。
>アプリBのオーナーを指定する事はできません。

実は出来るんだなそれが
144デフォルトの名無しさん:2007/01/21(日) 12:05:05
俺ならアプリBにメッセージフック仕込んでWM_DESTROYのところで処理させるかな。
141の方法だとアプリBが終了したときに、Cがフォアグラウンドでもフォーカスを
奪ってしまうからお薦めできない。
145デフォルトの名無しさん:2007/01/21(日) 12:32:02
でもcuiは単純にはメッセージフック出来ないからそれもまためどい
146デフォルトの名無しさん:2007/01/21(日) 13:49:36
atoiなどの数値変換のwin32版ってありますか?
147デフォルトの名無しさん:2007/01/21(日) 14:36:37
StrToInt
148デフォルトの名無しさん:2007/01/21(日) 14:51:23
そこまではたどり着いたのですが、strings.hとやらをincludeしても使えないんです
MSDNも英語だし
149デフォルトの名無しさん:2007/01/21(日) 15:09:55
どこにもstring.hなどと書いてないのだが

Header shlwapi.h
Import library shlwapi.lib
150デフォルトの名無しさん:2007/01/21(日) 15:16:36
おお、出来ました。
MSDNの検索でトピックタイトルにSTRINGS.Hってのがあって
その中にStrToIntがあったのでこれをincludeするのかと思ってました
151デフォルトの名無しさん:2007/01/21(日) 17:13:55
shlwapi.dllはIE4に付属だがそれでもいいのか?
152デフォルトの名無しさん:2007/01/21(日) 17:17:49
それは問題ないです。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++付属のものなのでしょうか?
154153:2007/01/21(日) 19:20:25
>153だと誤解がありそうなので訂正。

@エラーが出る
プラットフォームSDK付属のCrypt32.libをリンク(SDKは2007/01/19に最新版をダウンロード)

Aエラーが出ない
Visual Studio 2003に付属のCrypt32.libをリンク
155デフォルトの名無しさん:2007/01/21(日) 19:42:12
>>152
_tcstolはWin32APIでないぞ。
それでよいなら、atoiには_ttoiが対応する。
156デフォルトの名無しさん:2007/01/21(日) 19:48:39
やっぱStrToIntにします
157デフォルトの名無しさん:2007/01/21(日) 19:49:46
そもそも今使ってる環境くらい書けよ
158デフォルトの名無しさん:2007/01/21(日) 19:56:28
VC6 WinXpでMFC未使用です
159デフォルトの名無しさん:2007/01/21(日) 20:17:14
Win32APIじゃ無いけどMS独自の拡張だし、別にいいじゃん
160デフォルトの名無しさん:2007/01/21(日) 20:20:38
>>153
両方手に入るなら自分で調べてみろよ
コマンドプロンプトで
FC /B ファイル名1 ファイル名2
でバイナリ比較できるから
161デフォルトの名無しさん:2007/01/21(日) 20:48:31
>160
VC++6.0のCrypt32.libが手に入らなかったりします。
162デフォルトの名無しさん:2007/01/21(日) 20:57:18
CryptoAPIの他の関数は問題なくリンクできるのか?
163デフォルトの名無しさん:2007/01/21(日) 21:07:32
>>153
dumpbin -EXPORTS crypt32.libしてみそ。
まぁPlatformSDKのlibディレクトリはたまに変なものが入ってたりするのは
確かかだが。
気になるんなら
以前なぜかlibcp.lib(どうも古いバージョンのC++ランタイム)が
入っていてハマったことがあるよ俺は。
164デフォルトの名無しさん:2007/01/21(日) 21:25:55
DwmExtendFrameIntoClientArea/DwmEnableBlurBehindWindow
わかんねーーーーー
165デフォルトの名無しさん:2007/01/21(日) 21:53:44
166デフォルトの名無しさん:2007/01/21(日) 22:13:05
>>164じゃないけどさ、
別なウインドウが乗っかってるウインドウのGlass化ってどうやるの?
例としては、「ガジェットの追加」の画面とか。
あれToolBarWindow32が乗ってるんだよね
167デフォルトの名無しさん:2007/01/22(月) 00:05:27
>162
他の関数については試してないです。これから試してみます。

>163
ありがとうございます。調べてみます。
168デフォルトの名無しさん:2007/01/22(月) 16:00:34
作成したソフトウェアに必要な画像や音楽のデータをソースコード内に組み込んで
ソフトウェアを起動するときには画像や音楽のデータを不要にしたいんですけどどうしたらいいですか
169デフォルトの名無しさん:2007/01/22(月) 16:14:29
>>168
日本語でおk?
170デフォルトの名無しさん:2007/01/22(月) 16:15:40
リソースに入れてLoadResourceで
171デフォルトの名無しさん:2007/01/22(月) 16:19:03
リソースはソースコード内に組み込んだと言えるのか…
172デフォルトの名無しさん:2007/01/22(月) 16:22:18
意を汲んでやれよw
173デフォルトの名無しさん:2007/01/22(月) 16:39:45
174デフォルトの名無しさん:2007/01/22(月) 16:44:38
>>168は釣りなのか、バカなのか...
175デフォルトの名無しさん:2007/01/22(月) 16:45:54
音楽データ等を 実行ファイル内に持つということは…
すんげーでかい実行ファイルになっちゃうんだが、問題おこさないのだろうか?
# リソースにしろ data_seg 直置きにしろ…
176デフォルトの名無しさん:2007/01/22(月) 16:49:36
>>175
MIDIデータのようなものならサイズはゴミみたいなもんでしょう
177デフォルトの名無しさん:2007/01/22(月) 16:54:36
要するにコンパイルしてできあがった実行ファイルだけで
画像を表示したり音を鳴らせるようにしたいんです
画像については1ピクセル毎のRGB値を調べて変数に格納してやってその数値を見ることで
元の画像を不要にできるんじゃないかと思ってるんですがこういうことに詳しい人いたら教えてください
そういうことができるソフトがすでにあったりしませんか
178デフォルトの名無しさん:2007/01/22(月) 16:57:14
>>177
>>170,>>173を100回音読してください
179デフォルトの名無しさん:2007/01/22(月) 16:58:11
>>178
お前のレスは全く無意味だな
分からんなら黙っとけよ
180デフォルトの名無しさん:2007/01/22(月) 16:59:10
>>177
こんなアホ久しぶりに見た
最高にわろたwww
181デフォルトの名無しさん:2007/01/22(月) 17:01:05
>>170以外の方法はスレ違いだしなあ
182デフォルトの名無しさん:2007/01/22(月) 17:01:17
>>177
リソースを「どうしても」使いたくないのなら
グローバルかstaticのchar[]配列として格納しておいて
CreateDIBSection()
183デフォルトの名無しさん:2007/01/22(月) 17:07:44
> 1ピクセル毎のRGB値

ビットマップもそうだろ
車輪の最発明したいんか?
184デフォルトの名無しさん:2007/01/22(月) 17:10:12
>>183
biComplession かけたこと無いが… 一応圧縮可能なんじゃね? <DIB
185デフォルトの名無しさん:2007/01/22(月) 17:10:13
別になってるってことは、ロードしてからの作業はもうできてるんだろうし、
ビットマップファイルを、 0x00,0x00,・・・・・・・・のソースに変換しとけばいいべw
186デフォルトの名無しさん:2007/01/22(月) 17:11:21
ああすいません>>170の方法でやれそうです
>>178が自分のレスを100回読めとレスしたからぶち切れました
スレ汚し失礼しました。適切なアドバイスありがとうございました
187デフォルトの名無しさん:2007/01/22(月) 17:12:46
切れる前にマルチを責められてる事に気がつけ
188デフォルトの名無しさん:2007/01/22(月) 17:14:02
>>186
低脳乙であります!!
189デフォルトの名無しさん:2007/01/22(月) 17:23:39
>>186
死ねや
ぼくの質問が流されただろうがハゲ
190デフォルトの名無しさん:2007/01/22(月) 17:45:05
>>189
知るかボケお前が死ね
191マータリしる:2007/01/22(月) 18:33:25
192デフォルトの名無しさん:2007/01/22(月) 19:03:03
食事中だボケ
193デフォルトの名無しさん:2007/01/22(月) 20:10:50
>>192
食事中に2chすな
194デフォルトの名無しさん:2007/01/22(月) 20:25:03
>>193
ヒント  つ ピザ
195デフォルトの名無しさん:2007/01/22(月) 20:30:48
ハズレ
A=食事中にしかできない
196デフォルトの名無しさん:2007/01/23(火) 05:30:16
>>194-195
どっちでも、かわいそう・・・
197デフォルトの名無しさん:2007/01/23(火) 06:35:29
すみません、このスレできくように言われたので、お願いします。


入力された文字列がファイルパスとして正しいか、を調べたいです。

単に指定された文字列のファイルが開けなかったから不正、ではなく、
Windows のパスとして不正な文字列 <>: 等、
エクスプローラで指定するとエラーになるケースを判別したいです。

すみませんが、皆さんのお知恵を貸してください。
198デフォルトの名無しさん:2007/01/23(火) 06:59:45
この中にあるかもしれない
ttp://msdn2.microsoft.com/en-us/library/ms538767.aspx
199デフォルトの名無しさん:2007/01/23(火) 08:18:07
>>197
PathGetCharType
200デフォルトの名無しさん:2007/01/23(火) 11:43:47
印刷用に作成したメタファイルをそのまま指定された送付先に
FAXで自動送信するプログラムを開発しています。
メタファイル自体は難なく作成できたのですが、
その先のFAX送信の方法が分からず困っています。

ぐぐって見たところfaxcomというcomコンポーネントがヒットしたのですが、
メタファイルが使用できませんでした。(ビットマップやTIFFに変換しても駄目)
PrintDlg等でFAXを選択して印刷すると送信はできそうなのですが
送付先の指定ができず、印刷時に送付先を指定するダイアログが表示されてしまいます。

何かいい方法は無いのでしょうか?ぐぐるヒントでもいいので教えてください。
201デフォルトの名無しさん:2007/01/23(火) 12:03:13
202デフォルトの名無しさん:2007/01/23(火) 12:59:38
>>199 さん

ご教授、ありがとうございました。
203デフォルトの名無しさん:2007/01/23(火) 14:27:52
204デフォルトの名無しさん:2007/01/23(火) 18:59:39
Windowsサービスを作成中なのですが
そのなかでGetCurrentDirectory()で実行しているサービスの
フォルダが取得できると思ったのですが
WindowsのSystem32フォルダを取得してしまいます。
自分自身のフォルダを取得するにはどのようなAPIを
使えばよいでしょうか?

よろしくお願いいたします。
205デフォルトの名無しさん:2007/01/23(火) 19:09:37
GetModuleFileNameから切り出してみたら?
206デフォルトの名無しさん:2007/01/23(火) 19:16:42
>>205
ありがとうございます。調べてみます。
207デフォルトの名無しさん:2007/01/23(火) 19:45:14
HWNDから、そのアプリケーションのHINSTANCEを取得したいのですが、
そういう関数があったら、教えてください
208デフォルトの名無しさん:2007/01/23(火) 19:51:50
GetWindowLong
209デフォルトの名無しさん:2007/01/23(火) 19:53:09
64bitを考慮するなら
GetWindowLongPtr
か…
210デフォルトの名無しさん:2007/01/23(火) 20:02:57
>>208
ありがとうございます。
こういうのってどうやって調べるんですか。
GetInstanceとか、予測しても無理っぽいし。
ソースとか本とかで掴んでくしかないのかな。
211デフォルトの名無しさん:2007/01/23(火) 20:05:36
>>209
ありがとうございます。
212デフォルトの名無しさん:2007/01/23(火) 20:19:25
>>210
経験とMSDN
213デフォルトの名無しさん:2007/01/23(火) 20:22:27
フルパスからファイル名を除くディレクトリまでを
切り出すにはどうしたらいいでしょうか?
ファイル名を切り出すAPIはあったのですが(GetFileTitle)
214デフォルトの名無しさん:2007/01/23(火) 20:29:26
215デフォルトの名無しさん:2007/01/23(火) 20:33:56
>>212
MSDN見てたら、結構いけそうな気がした。
てきとーに読んでみると結構おもしろいね。
216200:2007/01/23(火) 20:55:46
遅レス失礼

>>201
参考にさせてもらいます。ありがとうございました。
217デフォルトの名無しさん:2007/01/23(火) 21:06:35
はじめまして。
インターネット上のJPEGファイルをダウンロード(HTTP)し、ウィンドウに表示する
プログラムを作成しています。
InternetOpenでファイルを読み込んだあとの処理に悩んでいます。
いったんhoge.jpgなどと書き出して、JPEGLIBで読み込むかOleLoadPicture
で読み込む方法は思いつくのですが、もっと効率よく
メモリ上のJPEG画像を表示する方法はありますか?
218デフォルトの名無しさん:2007/01/23(火) 21:17:36
>>208-210
そのラッパが<windowsx.h>にGetWindowInstanceとして存在するよ。
219デフォルトの名無しさん:2007/01/23(火) 21:25:47
>>217
libjpeg
220デフォルトの名無しさん:2007/01/23(火) 21:32:58
IEやFirefoxなどはどうやって表示しているのでしょうか、自前?
221デフォルトの名無しさん:2007/01/23(火) 21:48:05
>>220
いや、レンダリングエンジンを塚テル。
それをYOUもつかっちゃいなよー
222デフォルトの名無しさん:2007/01/23(火) 21:51:18
JPEGならGDI+で扱えるな
223デフォルトの名無しさん:2007/01/23(火) 21:56:05
>>220
ごめん、前の流れ見てなかった。
>>221は忘れて
224デフォルトの名無しさん:2007/01/24(水) 00:29:44
ちょっと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です。
225デフォルトの名無しさん:2007/01/24(水) 01:08:46
>>224
>使えないのでしょうか?
試したの?
226デフォルトの名無しさん:2007/01/24(水) 01:13:56
>>224
あー、すまん試してたんだな。

それはそもそもウィンドウハンドルを取得できてるのか?
FindWindowとかで。でもstrcmpで比較してる辺り取得してるっぽいな

じゃあ、対象はアイコンか?
227デフォルトの名無しさん:2007/01/24(水) 01:18:18
まぁ、WM_CLOSEがpostできたとして
終了してくれる保証なんてないんだけどな。
228デフォルトの名無しさん:2007/01/24(水) 02:06:31
保存して終了させますか?とかのウィンドウが出たりするやつはうざいな
229デフォルトの名無しさん:2007/01/24(水) 02:09:41
228の作るアプリは使いたくないな
230デフォルトの名無しさん:2007/01/24(水) 02:44:45
>>228
多少解るぜ俺も

大抵バイナリエディタでちょっと弄れば消せるからいいんだけど
231デフォルトの名無しさん:2007/01/24(水) 02:59:45
>>207
Windowsのハンドルと、モジュールのハンドルには直接的な関連性がないためできない。
まずはWindowsの基礎を勉強してこい。
232デフォルトの名無しさん:2007/01/24(水) 03:02:07
WM_CLOSEをポストしてタイムアウトしたら素直にTerminateProcessでいいかと。
そもそも終了時にユーザーの入力待ちに入る可能性のアプリはどうしようもないし、個々のアプリの仕様に合わせてを入力をエミュレートするなんてのは泥臭い
233224:2007/01/24(水) 07:19:46
>>226
EnumWindowsのコールバックに登録してやってます。
ウィンドウハンドラは取得できています。

>>227,232
TerminateProcessでやるとゴミが残りそうで心配なのです。
思いつく中で一番綺麗に終了させる方法がWM_CLOSEだったのですが、
やはりTerminateProcessで強制終了させるのが確実な方法になるみたいですね。
でも、あきらめきれないので他の方法も考えてみます。
234デフォルトの名無しさん:2007/01/24(水) 07:51:22
>>233
>232をよく読め。死亡要求メッセージを送った後、死んでくれなければ殺すということだ。
235デフォルトの名無しさん:2007/01/24(水) 08:03:15
>>234
>233をよく読め。TerminateProcessでやるとゴミが残りそうで心配なのですということだ。
236デフォルトの名無しさん:2007/01/24(水) 08:49:35
>>235
>234をよく読め。取り敢えずWM_CLOSEで死ねばTerminateProcessを使わないで済むだろ。
237デフォルトの名無しさん:2007/01/24(水) 08:53:09
>>224
たぶん、そんなことは聞いてないとか言われそうだが、
いちおう張っとくw

Web ブラウザを閉じても Acrobat.exe または AcroRd32.exe が終了しない
ttp://support.adobe.co.jp/faq/faq/qadoc.sv?229657+002

Adobe Readerなら8に上げりゃ済む話しなんだが・・・
238デフォルトの名無しさん:2007/01/24(水) 09:24:01
WM_CLOSEってコンソールアプリケーションにも有効ですか?
っていうか有効みたいなんですけど、ウィンドウがないのに
なぜ?
239デフォルトの名無しさん:2007/01/24(水) 09:43:59
SYSTEMメニュー持ってて閉じるが有効ならば
デフォルトのWindowProcなら閉じる
240デフォルトの名無しさん:2007/01/24(水) 10:13:53
>>238
窓ならあるだろ、ConsoleWindowClassのいわゆるDOS窓が。
そいつがウィンドウメッセージを受け付けている。

そいつにWM_CLOSEを送りつけると、コンソールアプリには結果的に
CTRL_CLOSE_EVENTが送られる。
デフォルトではそれで直ちに終了するが、
SetConsoleCtrlHandler()を用いて、そうしたイベントを捕捉することもできる。
241デフォルトの名無しさん:2007/01/24(水) 15:35:37
「保存しますか?」等をブロックするのに
WM_QUERYENDSESSION を Post してから
WM_CLOSE を Post するのはどうだろうか?
242デフォルトの名無しさん:2007/01/24(水) 15:43:08
Postしちゃらめぇぇぇ Send ですたわ
243デフォルトの名無しさん:2007/01/24(水) 16:05:14
窓の閉じ方なんて、MSDNに普通に載っているだろ
244デフォルトの名無しさん:2007/01/24(水) 20:07:15
OSはTerminateProcessでプロセスが保持してるオブジェクトを全て破棄する。だからゴミは残らない
残るとすれば殺されるプロセスがするべき後始末がされないことで、ファイルとかレジストリとかDBに消されるべきものが残ることがある
245デフォルトの名無しさん:2007/01/24(水) 21:12:58
だからそのゴミをいってるのだろう
246デフォルトの名無しさん:2007/01/24(水) 21:20:20
正常終了する保証がないならゴミがでるのを心配してもしょうがないわな
247224: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が投げられてて終了してるので、さらに困ってる。

あ,長文こめん。
248デフォルトの名無しさん:2007/01/25(木) 00:22:49
SetProcessWorkingSetSizeが使えないかな、とふと思った。
249デフォルトの名無しさん:2007/01/25(木) 00:28:19
質問ですが
IEのツール→インターネットオプション→LANの設定→プロクシサーバのチェックの
ON/OFFは何処の関数を使えば制御できるのでしょうか?
250デフォルトの名無しさん:2007/01/25(木) 00:29:15
もしかしてVistaってIShellExecuteHook サポートされてない?
HKEY_CLASSES_ROOT\Interfaceにも該当IDがないんだが
251250:2007/01/25(木) 01:27:18
ああ、レジストリは関係なかった。。。
だけどShellExecuteHookが効かないよぅ
252デフォルトの名無しさん:2007/01/25(木) 01:43:31
ウィンドウの中にエディットコントロールがあって、
そのエディットコントロールにユーザーの操作でフォーカスが当たった場合、
WM_FOCUSイベントって
ウィンドウ -> エディットコントロールの順番に来るか
それともエディットコントロールにしか来ませんか?
後者の場合、ウィンドウ側がコントロールがWM_FOCUS受け取ったことを
察知する一番良い方法はなんでしょう?
253デフォルトの名無しさん:2007/01/25(木) 02:53:37
>>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 でファイルアクセスを検出しているのでしょうか?

聞きたいことてんこ盛りになってしまってすみませんが、よろしくお願いします。
255デフォルトの名無しさん:2007/01/25(木) 04:49:43
>>254
CreateFileでdwShareModeに0を指定したら?
FileMonは知らないが、同じ会社のRegMonはカーネルを書き換えて
ローレベルAPIにフックを仕込んでいるらしい。

ファイルの存在そのものを隠したいとかいう話だと、確実にマルウェアとして
認定されるからやめておいた方がいいかと。
ttp://www.atmarkit.co.jp/fwin2k/insiderseye/20051109rootkit/rootkit_01.html
256254:2007/01/25(木) 05:15:13
>>255
それ(CreateFile)だと目的を実現できないです。

実はファイルサーバでいくつかのディレクトリを共有していて、そこに数台のクライアントマシンでアクセスに行きます。
ところがファイルサーバの都合、ディレクトリごとのアクセス権を設定できず、全部のクライアントが全部の共有ディレクトリを
参照できてしまいます。

そこで、各クライアントに、「自分向けの共有ディレクトリ」だけを参照するような細工をしようと考えました。
つまり、各クライアントでファイルサーバ上のディレクトリへのアクセスを監視し、自分用以外のディレクトリのファイル操作を
拒否するようにしよう、と考えたわけです。

いや、そもそも環境を見直せという意見もあるでしょうが、何分いろいろ事情がありまして・・・

ウィルス監視ソフトなんかは、ファイルアクセス時にウィルスの有無をチェックして、ウィルス入りだったらアクセスを拒否
させますよね。
そんな仕組みを作ってみたいです(ウィルスのチェックじゃなくて、パスのチェックですが)。

# ちなみにそのURL、ちょうど今読んでたところです。おもしろいですね。
257デフォルトの名無しさん:2007/01/25(木) 05:52:42
君のスキルじゃ無理だろうけど SSDT

でもやっぱりシステムを直さないと根本的な問題は解決できない。
物事はシンプルな方法で解決すべきだよ。
258254:2007/01/25(木) 06:57:05
>>257
それはあんまり手を出したくない部分です。いや、出せといっても出ないのですが。
むしろそれはフィルタドライバを書くよりも厄介というか、推薦されない気がするのですが、
SSDT をいじらないと実現できなそうでしょうか?
フィルタドライバじゃダメなんでしょうか?
お手軽なフックAPI 探しはあきらめモードなので、フィルタドライバを書く覚悟を決めていた
ところなんですが、それでもダメだと萎えそうです。
もしや、ネットワーク越しのファイルアクセスにはフィルタドライバは使えないなんてことが
あったりしますか?

環境直しについては、そう指摘いただくことはよく理解できるのですが、既に「いろいろな事情」を
言い訳にするまでもなく、本末転倒ながら「とにかく作ってみたい」という気分になってしまいました。
ですので、その方向でよろしくお願いします・・・
259デフォルトの名無しさん:2007/01/25(木) 07:14:34
小細工するより、ディレクトリにアクセス権を設定できるサーバに
変えた方がいいと思うが。
260デフォルトの名無しさん:2007/01/25(木) 11:14:09
>>259
まったくその通り。それが正論だ。
261デフォルトの名無しさん:2007/01/25(木) 11:17:27
仮にフィルタドライバ開発したとして、
各クライアントにそれインスコして回るのかw
262デフォルトの名無しさん:2007/01/25(木) 11:54:58
>>261
だよな。 最終的にブロッキングかけるのはクライアント側になるしね。
263デフォルトの名無しさん:2007/01/25(木) 13:30:31
ディレクトリで管理してればインスコするのは簡単だがユーザーにパーミッションをかけて制限するほうがもっと簡単
264254:2007/01/25(木) 14:08:12
>>261
そのつもりです。
>>258 で書いたとおり、いまや作ることが目的なので、管理の手間についてはどうでもいいです。
趣味の問題といいますか。
いまのところ、
 ・これを端的に実現するための API はあるのか (無さそうだと思う)
 ・フィルタドライバじゃ実現できないのか (イケそうだと思う)
 ・SSDT をいじらないとダメなのか (そこまでは必要ないんじゃないかと思う)
という疑問と、自分なりの回答を持っていまして、それについてのコメントがほしいです。
すみませんが管理手法についてはカンベンしてください。
265デフォルトの名無しさん:2007/01/25(木) 14:26:33
できるかどうかはわからんが、
シェルエクステンション使って、explorerに表示されなくするとかの方が目的に近くね?
266デフォルトの名無しさん:2007/01/25(木) 15:16:15
ウィンドウに対する複数の操作(更新や移動、サイズ変更など)を一度に反映させるためのAPIがあったと思ったのですが、誰かお分かりになりますか?
API呼び出し→複数の処理実行→API呼び出しで反映 という感じだったと思うのですが・・・(´・ω・`)
267デフォルトの名無しさん:2007/01/25(木) 15:18:19
>>266
SetWindowPos() と UpdateWinodw() ?
268266:2007/01/25(木) 15:26:31
いやそれらを呼び出す前に画面に反映させるのを禁止するAPIと、それらを呼び出したあとにすべての処理を反映させるAPIのことです。
おなじAPIで引数の違いだけだったかもしれませんが。
269デフォルトの名無しさん:2007/01/25(木) 15:28:27
>>265
explorerに限定するならいいかもしれんがPowerShellとか使われたらあかんでしょ。
270デフォルトの名無しさん:2007/01/25(木) 15:29:11
BeginDeferWindowsPos
DeferWindowPos
EndDeferWindowPos
271266:2007/01/25(木) 15:43:24
>>270 キタ━ヽ(ヽ(゚ヽ(゚∀ヽ(゚∀゚ヽ(゚∀゚)ノ゚∀゚)ノ∀゚)ノ゚)ノ)ノ━!!!!
272デフォルトの名無しさん:2007/01/25(木) 17:52:04
>>264
その手のマルウェアはカーネルモードのAPI云々ってのが普通みたいだし
過疎ってるけどDDKスレに行ってみたら?
と、情報量のないレスをしてみる
273デフォルトの名無しさん:2007/01/25(木) 18:02:37
システム構築失敗しちゃって費用をかけずに修正しようとてんぱっているんだろ。
土下座の練習したほうがいいんじゃね?
274デフォルトの名無しさん:2007/01/25(木) 18:16:33
275デフォルトの名無しさん:2007/01/25(木) 22:52:43
>>254
クライアント側に細工していいなら、CreateFile他にAPIフックしてアクセスされたくないディレクトリ
内の物だったらFALSE返すようにすれば?
逆にクライアント側に仕掛ける限り、クライアントのユーザーに解除できない方法は無いような気がするが。
いずれにしてもここまでの書き込みを読む限り、>>254には無理そうだな。

SSDTって何だ?というおれもまだまだヒヨッコか・・・
276デフォルトの名無しさん:2007/01/25(木) 23:30:18
SSDT = Scottish Six Days Trial
277デフォルトの名無しさん:2007/01/25(木) 23:40:15
>>264
>・フィルタドライバじゃ実現できないのか (イケそうだと思う)
イケなそうだと思う。
ファイル共有ってサービスとして実装されているのであって、フィルタ入れられるようなドライバスタックは無いんじゃない?
ネットワークドライバにフィルタをかませてもどのファイルのアクセスかなんてパケット解析しないと判らんだろうし。

オレも254には無理だと思う。

>>272
WDM(デバドラ)スレも見てるんで、おかしなやつを誘導しないようお願いします。
278デフォルトの名無しさん:2007/01/26(金) 01:45:32
SSDTの書き換えはVistaで使えなくなると聞いた。
279デフォルトの名無しさん:2007/01/26(金) 02:13:41
Vistaで〜が使えなくなる……って、どこみたらいいの?
280デフォルトの名無しさん:2007/01/26(金) 03:38:07
Vistaでっていうか、XPでもx64では使えないみたいだけどね。
http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx
281デフォルトの名無しさん:2007/01/26(金) 06:34:04
質問なのですが
ある特定のアプリケーションが確保しているメモリに他のアプリケーションからアクセスしてメモリの内容を書き換えてしまう事はできるのでしょうか?
もしできるのであればアクセスさせないようにする、もしくはアクセスを検出するにはどうすればいいのでしょうか?
できればこれをまったく別の第三者的なアプリケーションにさせたいと思っています。どうか知恵を貸して下さい。
282デフォルトの名無しさん:2007/01/26(金) 07:00:28
何故MSの資料を読まない?
283254:2007/01/26(金) 08:40:33
>>265
それだと直接パスを指定してのファイルアクセスとかはダメそうです。

>>272
DDKスレも見てみました。
前からドライバというものを作ってみたかったので、何はともあれ本を買ってみることにしました。
というわけで本屋に入り浸ってきましたが、お目当ての本は無かったので、また別の本屋に行ってきます。

>>273
そんな大げさな話じゃないです。
自分ちで使おうと思ってます。

>>274
いや、自分じゃないです。
でも、パスワードがかけられるフォルダって面白いかもしれないですね。
ついでにトライしてみるかもです。
でもユーザにパスワードを促している間は元のファイルアクセス API が止まっちゃうわけですから、
よくないことが起こりそうですね。

>>275
API 自体をフックしてしまうのは邪悪かなと思います。
クライアントでユーザーががんばって仕掛けを解除してしまっても、それはそれで構いません。

>>277
イケなそうですか。自分もそこが少し気になっていたところです。
でも、ネットワークドライバの上に、共有サービスのためのファイルシステムドライバのようなものが存在していたり
しないんですかね?
この方法は置いといても、ウィルス監視ソフトってどうやってファイルアクセスを横取りしてるんでしょうか。

284デフォルトの名無しさん:2007/01/26(金) 08:51:36
>>283
>それだと直接パスを指定してのファイルアクセスとかはダメそうです。
クライアントに突っ込む時点で、
そのサービスをとめられたら終わるんだから、気にする必要があるとも思えんが

そこまで気にするなら、やっぱりサーバーで対応するしかないだろ
285デフォルトの名無しさん:2007/01/26(金) 09:21:38
>>281
VirtualProtectじゃだめ?
286デフォルトの名無しさん:2007/01/26(金) 10:17:48
>>283
>この方法は置いといても、ウィルス監視ソフトってどうやってファイルアクセスを横取りしてるんでしょうか。

kernelからでしょ。だからデバドラって話になる。勉強しなおしてこい。
287デフォルトの名無しさん:2007/01/26(金) 10:48:09
すみません。基本的なことで申し訳ないのですが質問があります。

FindWindowで取得した、既存のウィンドウのハンドルは
CloseHandleするべき対象なのでしょうか?
288デフォルトの名無しさん:2007/01/26(金) 10:58:57
CloseHandleをMSDNで調べるといい
289デフォルトの名無しさん:2007/01/26(金) 11:23:50
CloseHandleすると当該ハンドルのカーネルオブジェクトが
その時点で強制的に破棄される

そんなふうに思っていた時期が俺にもありました
290287:2007/01/26(金) 12:15:23
>>288
調べました。
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpipc/html/_win32_closehandle.asp

知りたいのは、FindWindowで取得したハンドルから、対象のオブジェクトを
破棄するのではなく、一定の操作を行い、その後、オブジェクトはそのまま
存在させています。
そこで、操作のためだけに使用したハンドルは開放するべきなのでしょうか?

MSDNを見た限りでは、ハンドルカウントが増えていくため、ハンドルを都度
破棄しないと、オブジェクトが終了しようとしても、できないのではないかと
考えています。
291デフォルトの名無しさん:2007/01/26(金) 12:47:14
CloseHandleが閉じることの出来るハンドルにウィンドウは無い。
FindWindowの解説に、取得したハンドルを閉じろとは書いてない。
そもそもウィンドウハンドルを閉じるAPIは無い。

>MSDNを見た限りでは、ハンドルカウントが増えていくため
どこにそんなこと書いてあるの?
292デフォルトの名無しさん:2007/01/26(金) 12:47:22
   ∩___∩ 
   | ノ      ヽ ! 
  /  ●   ● |   こいつすげえアホ 
  |    ( _●_)  ミ 
 彡、   |∪|   / .\ 
/ __  ヽノ / \ ...\ 
(___)   /   .│ ..│ 
            │ │ 
            /  ヽ 
            l..lUUU 
            .U
293デフォルトの名無しさん:2007/01/26(金) 12:52:10
      ∩___∩
   (ヽ  | ノ      ヽ  /)
  (((i ) / (゜)  (゜) | ( i)))
 /∠彡    ( _●_)  |_ゝ \
( ___、    |∪|    ,__ )
    |     ヽノ   /´
    |        /
294デフォルトの名無しさん:2007/01/26(金) 12:58:29
   ∩___∩
   | ノ      ヽ !
  /  ●   ● |   こいつすげえアホ
  |    ( _●_)  ミ
 彡、   |∪|   / .\
/ __  ヽノ / \ ...\
(___)   /   .│ ..│
            │ │
            /  ヽ
            l..lUUU
            .U
295坂田:2007/01/26(金) 12:59:20
ちなみに、ウィンドウハンドルはウィンドウマネージャが管理しているので、
アプリケーションからClose操作できるもんじゃない
296287:2007/01/26(金) 13:21:57
>>295
すみません。すごい誤解をしていました。

ありがとうございました。
297デフォルトの名無しさん:2007/01/26(金) 15:02:16
>>281
WriteProcessMemoryで書き換えが可能。
これを防止できる一般的な方法は今のところ無いかな。

nProtect GameGuardのようにこれを防ぐシステムもあるが
結構簡単に破られているのが現状。

298デフォルトの名無しさん:2007/01/26(金) 15:19:15
>>297
破る方法キボンヌ
299デフォルトの名無しさん:2007/01/26(金) 15:27:01
WinFSはまだかね?
300デフォルトの名無しさん:2007/01/26(金) 16:32:43
>>299
しばらくはない
301デフォルトの名無しさん:2007/01/26(金) 16:50:21
>>298
内側から実行するだけ
302デフォルトの名無しさん:2007/01/26(金) 17:06:27
>>301
何を?
303デフォルトの名無しさん:2007/01/26(金) 17:17:15
WriteProcessMemoryにはプロセスハンドルが必要。
だからプロセスハンドルに対する権限をできる限りなくすように頑張ればいいような気がする。
CreateProcessから操られたらだめだろうけどね。
304デフォルトの名無しさん:2007/01/26(金) 17:51:49
遅延IOとか仮想CPUとか西暦1940年代のテクノロジーがいまに復活すげえ
305デフォルトの名無しさん:2007/01/26(金) 20:34:20
IDirect3DDevice7の仮想関数テーブルを書き換えてフックをしようとしています。
このテーブルはread onlyだったため、VirtualProtectで属性を変更しようとしましたが、
XPSP2でERROR_ACCESS_DENIEDで失敗します(2KSP4では普通に成功)。

ぐぐって見たところ、IATの書き換えの話ですがPAGE_EXECUTE_READWRITE
なら大丈夫という話があったので試しましたが効果なし。

何か原因に思い当たる方はいませんか?
306デフォルトの名無しさん:2007/01/26(金) 20:50:56
307デフォルトの名無しさん:2007/01/26(金) 21:02:26
>>305
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpmemory/html/_win32_VirtualProtect.asp
真っ先に調べてありますが、該当する情報まったくないんですが・・・
308デフォルトの名無しさん:2007/01/26(金) 21:37:47
まずエスパー以外にもわかるように書くんだな
309デフォルトの名無しさん:2007/01/26(金) 21:55:16
言ってることはわかるが解法はわからんね
ハンドルはあるんだから権限とか関係なさそうだしなぁ

ってかvtableを書き換えるって発想はなかったわ
310デフォルトの名無しさん:2007/01/26(金) 22:14:06
俺もvtbl書き換えてるけど、XPでも普通に動いてるな。
VirtualProtectでPAGE_EXECUTE_READWRITEにしてから書き換えてる。
むしろ305がどこで失敗しているのか疑問。
311デフォルトの名無しさん:2007/01/27(土) 00:16:00
APIのドキュメントは新しいのに限るからVISTAのSDKをインストールした。
日本語ドキュメントなんか誤訳がおおいから論外だな。
312デフォルトの名無しさん:2007/01/27(土) 18:34:48
関連付けされてない画像ファイルを「写真の印刷ウィザード」で開くには
どうすればよいのでしょうか?
関連付けではDropTargetでphotowiz.dllを起こすようになってますが。。。
313デフォルトの名無しさん:2007/01/27(土) 22:24:37
リストの行を縞々になるように交互に色を変えようとしています。

LISTVIEWをサブクラス化してWM_NOTIFY内で
NM_CUSTOMDRAWを捕まえてるんですが、
CDRF_NOTIFYSUBITEMDRAWを返しても
CDDS_ITEMPREPAINTまでしか送られてきません。

CDDS_ITEMPREPAINT|CDDS_SUBITEMが送られてくる条件は
スタイル指定など他にすることがあるのでしょうか?
314デフォルトの名無しさん:2007/01/28(日) 05:03:23
質問時はあげようぜ?
315デフォルトの名無しさん:2007/01/28(日) 08:51:15
LISTVIEW 背景色 カスタム
でぐぐったら一発でみつかったけど
316デフォルトの名無しさん:2007/01/28(日) 09:08:38
それだと縞々にならないんです
317デフォルトの名無しさん:2007/01/28(日) 10:07:46
あきらかに>>315がいうと思われるサンプルで描画できてる

だいたいCDDS_ITEMPREPAINT|CDDS_SUBITEMは各セルに対する描画要求じゃなかったか?
行単位ならあとは自分で縞にするだけじゃねえのか?
318デフォルトの名無しさん:2007/01/28(日) 10:16:07
ウィンドウのサイズを固定したいんですけどどうしたらいいですか
319デフォルトの名無しさん:2007/01/28(日) 10:21:32
WM_GETMINMAXINFO
320デフォルトの名無しさん:2007/01/28(日) 10:23:26
WS_THICKFRAME
321デフォルトの名無しさん:2007/01/28(日) 10:29:49
>>319
できました。
ありがとうありがとう。
322デフォルトの名無しさん:2007/01/28(日) 10:35:28
std::cout << "cout\n";
::CloseHandle(::GetStdHandle(STD_OUTPUT_HANDLE));
std::cout << "cout\n"; // 表示されない

コンソールアプリのときコメントのように表示されないのですが、
これはGetStdHandleの戻り値は通常開放する必要はないということで間違ってないですか?
323デフォルトの名無しさん:2007/01/28(日) 11:29:09
そういうこと。
万が一閉じる必要があったとしても、ハンドルはみんなプロセス終了時にWindowsが閉じてくれる。
324デフォルトの名無しさん:2007/01/28(日) 11:59:14
>>323
おぅサンクスです
325デフォルトの名無しさん:2007/01/28(日) 14:23:44
ここで質問してるバカってPlatformSDKのドキュメントを読まないのか?
326デフォルトの名無しさん:2007/01/28(日) 15:15:12
>>325
むずいから読まんし、インストールもしとらん、
そこで、猫たんとここですよ
327デフォルトの名無しさん:2007/01/28(日) 15:38:07
猫を読んでるのにMFCでダイアログベースのアプリしか作れない奴。
しかも自分でクラスを書けない奴。
哀れだな。
328デフォルトの名無しさん:2007/01/28(日) 15:45:17
PlatformSDKしかないのか…
と必死で読んでたけど、
最近猫の存在に気づいたけど、
もうPSDKに慣れたけど、
もう必要ねーww
329デフォルトの名無しさん:2007/01/28(日) 15:55:52
逆にMFCでアプリが作れません
330デフォルトの名無しさん:2007/01/28(日) 15:57:57
>>327
漏れのにはMFC付いてないよ、いいな、そんなの付いているの使ってる香具師
だから、ここと猫たん。
もれは、クラスはおろか、プログラムもろくに書けんよ
クラス書けるんだったら、喪前がフリーのMFC互換のクラスライブラリ作って公開してくれよ
インストールぐらいはしてやるから
331デフォルトの名無しさん:2007/01/28(日) 16:11:32
なんかひとりアツい漢がいる
332デフォルトの名無しさん:2007/01/28(日) 16:25:00
会社が保存したファイルを強制的に暗号化するtool入れようとしてるのですが
これってCreateFile をフックしてるのかなぁ?
333デフォルトの名無しさん:2007/01/28(日) 16:48:38
NTFSの暗号化だったりして
334デフォルトの名無しさん:2007/01/28(日) 16:52:42
>>313です。リストビューをサブクラス化してWM_NOTIFYはヘッダー部分が、
リストビューの親のWM_NOTIFYでアイテム部分が飛んできているようです。
少し検索しましたがこの方法以外で行っているものは無いようです。

リストビューをサブクラスにしてサブクラス内でアイテム部分の背景色を変える方法ってないですか?
335デフォルトの名無しさん:2007/01/28(日) 16:57:45
PGPdiskとかはドライバじゃないの。
336デフォルトの名無しさん:2007/01/28(日) 17:00:01
>>334
つまらないことで時間を無駄にしないように
質問する前に簡単なサンプルで確認すべきということだな
337デフォルトの名無しさん:2007/01/28(日) 17:00:10
>>334
WM_PAINT来たら自分で描画とか?
そもそもリストビューのカスタムドローはサブクラス化なんてする必要ないんだが
338デフォルトの名無しさん:2007/01/28(日) 17:23:36
リストビュー サブクラス
でぐぐったらほとんど答と思われるのがみつかるけど
背景色が頭から離れなくて目にはいらないのだろうか?
339デフォルトの名無しさん:2007/01/28(日) 18:02:25
>>337
親を動的に変更したいのでできればリストビュー内で完結したいんです

>>338
もう一度探してみます
340デフォルトの名無しさん:2007/01/28(日) 19:41:56
>>332
普通はデバドラ
341デフォルトの名無しさん:2007/01/28(日) 20:26:08
>>340
こういうのも64-bitVistaからは出来なくなるんだよな?
342デフォルトの名無しさん:2007/01/28(日) 20:33:08
デバイスドライバまで組まないだろ。
ファイルシステムフィルタドライバだろう。
343デフォルトの名無しさん:2007/01/28(日) 21:35:59
344デフォルトの名無しさん:2007/01/28(日) 21:40:24
GetDlgItemで取得したハンドルを関数に投げて
GetClientRectやると何故かハンドルが無効のエラー(1400)が出るんだが。

GetDlgItemで取得したハンドルを使って直後にGetClientRectやると成功する
なぜだあああああああああああ
345デフォルトの名無しさん:2007/01/28(日) 21:50:16
ヒント: static
346デフォルトの名無しさん:2007/01/28(日) 21:52:38
>>344
その関数を示してくれないとどうしようもないです。
347344: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;
}
348344:2007/01/28(日) 22:05:08
>>345
staticにしてるとまずいとか何かあったっけ?
349デフォルトの名無しさん:2007/01/28(日) 22:06:40
>>344
>GetClientRectやると何故かハンドルが無効のエラー(1400)が出るんだが
そのエラー値はどこから出てきたの?
350344:2007/01/28(日) 22:07:59
GetLastError
351344:2007/01/28(日) 22:08:42
あれだ、staticって関数内でしか使えないから
別関数に渡したりすると値はあるけど使えないとかそんなのか!?
352デフォルトの名無しさん:2007/01/28(日) 22:11:43
*(hTabSheet + index)
353344:2007/01/28(日) 22:15:00
アドレスの取られ方がちげええええええええええええ
354デフォルトの名無しさん:2007/01/28(日) 22:26:32
>>350
GetClientRectは0を返してるの?
成功してるんならGetLastErrorの値に意味はないが。
355344:2007/01/28(日) 22:30:40
あー、成功してる。
でもなんでRECTの値が入らないんだろう。

リソースがまずいのか
356344:2007/01/28(日) 23:09:51
タブコントロールプロシージャの初期化で領域破壊が起こってた。
357デフォルトの名無しさん:2007/01/28(日) 23:43:49
>>341
そういうツールはまっとうな会社が出すんだろうから証明書を買えばいいだけ
358デフォルトの名無しさん:2007/01/29(月) 12:37:16
LoadBitmapでビットマップの画像を読み込んで、
リソースとして使えるようにしようとしてるんですが、WM_CREATE:で、
hdc1 = CreateCompatibleDC(hdc);
hBmp=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,TEXT("BMP_1");
SelectObject(hdc1, hBmp);
という感じで順番に画像を読み込んでいってるんですが、
この繰り返しを4つ以上くらいに増やした段階で、どういうわけか
コンパイルが通らなくなるんですけどどうしたらいいですか
359デフォルトの名無しさん:2007/01/29(月) 12:46:23
>>358
くりかえしもなにも、コピペされたそのソースの段階でおかしいが?
>hBmp=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,TEXT("BMP_1");
閉じ括弧たりないよ。
360デフォルトの名無しさん:2007/01/29(月) 13:12:00
コンパイルが通らないならコンパイルエラーを見ればよかろう
361デフォルトの名無しさん:2007/01/29(月) 14:49:26
>>359
すいません、それはコピペミスです。
コンパイルエラーは、
”問題が発生したため、Turbo Incremental Linker を終了します。
ご不便をおかけして申し訳ありません。
作業途中であった場合、その情報は失われた可能性があります。”
のウインドウが表示されます。
画像データ読み込みの処理が三つまではうまくいくのに、4つ目を追加したらだめになります。
ソースコードのコンパイル自体は通っていて、
brc32でリソース読み込みの処理が実行されたときに上のウインドウが表示されて
コンパイル手順が中断になります。
362デフォルトの名無しさん:2007/01/29(月) 15:04:18
そりゃコンパイルの問題じゃなくて、リソースに4枚目のビットマップを入れたから出たエラーだろ
C++のソース関係ないじゃないか。

bccのスレみると、「リソースだけのDLLを作れ」とあったが・・・
363デフォルトの名無しさん:2007/01/29(月) 15:10:46
>>361
それ、コンパイルエラーって言わないw
364デフォルトの名無しさん:2007/01/29(月) 15:48:43
>>361
リンカじゃねーか!!
365独り言:2007/01/29(月) 16:41:17
CreateProcessWの第2引数はL""で直接書くのは駄目なんだな
366デフォルトの名無しさん:2007/01/29(月) 17:00:52
そうとう頭わるそう
367デフォルトの名無しさん:2007/01/29(月) 17:37:09
シグネチャみればわかる話
368デフォルトの名無しさん:2007/01/29(月) 18:09:15
LoadBitmapの第2引数は、MAKEINTRESOURCE・・・

スネーク、忘れてくれ
369デフォルトの名無しさん:2007/01/29(月) 18:19:11
GetFileInformationByHandle
で得られるファイルIDはシステムの状態に依存せず常に同じ値なのでしょうか?
370デフォルトの名無しさん:2007/01/29(月) 18:31:26
>>369
nFileIndexHighとnFileIndexLowのこと?
MSDNに詳しく書いてあるぞ。
371デフォルトの名無しさん:2007/01/29(月) 18:33:46
質問です。

WM_PAINTの処理を BeginPaint〜EndPaint ではなくて ValidateRect を利用して
処理しようと考えています。
GetDC にて DC を取得するタイミングはどので行うべきなのでしょうか?
WM_SIZE WM_WINDOWPOSCHANGED とかでしょうか?
372デフォルトの名無しさん:2007/01/29(月) 18:38:59
いつでもいい
373デフォルトの名無しさん:2007/01/29(月) 18:39:52
>>372
WM_NCCREATE 内はまずいんでない?
374デフォルトの名無しさん:2007/01/29(月) 18:45:55
>>371
ほんとにそんな処理が必要なのか?

GetDC呼ぶタイミングは、いつでもおk
375374:2007/01/29(月) 18:48:36
リロードすべきだった・・・orz

いつでもとは言え、常識の範囲内で頼むw
ウィンドウ出来る前とか、ウィンドウ破壊したあととかは勘弁なwww
376358:2007/01/29(月) 18:55:10
うーん、うまくいかない。プログラムで使用する画像を一つにまとめて、
画像の読み込みを一回だけにしてもだめでした
容量の小さい画像が2,3回の読み込みだったらうまくいくのに。
画像を減色したりいろいろしたけど、どうもある容量を超えるとエラーが出るようになってるみたい。
画像は外部から呼び出す仕組みままにしとくか…
377デフォルトの名無しさん:2007/01/29(月) 18:57:24
>>376
だから、C++Builderのリソースコンパイラの仕様なんだろ。
リソースコンパイラを代えるか小さいサイズで収まるように
するしかないんだろう。
378デフォルトの名無しさん:2007/01/29(月) 18:58:03
とにかく、Win32APIは関係ないから
379371:2007/01/29(月) 19:24:39
WM_NCCREATE 以外で呼び出すといいんですね。ありがとうございます。
380デフォルトの名無しさん:2007/01/29(月) 19:26:27
すごく馬鹿だと思います
381デフォルトの名無しさん:2007/01/29(月) 19:33:55
うおおおVS.NETでやったらうまくいきました!
今日朝起きてからずっと12時間近くこれに悩んでました。
コンパイラの仕様だと教えてくれたかたありがとうございました。
これで先に進める。
それとBorland C++Compilerはbcc developerと共にごみ箱にポイしよう
382デフォルトの名無しさん:2007/01/29(月) 20:22:23
有償の開発環境くらい買えよ
383デフォルトの名無しさん:2007/01/29(月) 20:28:34
あした新宿か池袋行って買うことにします ありがとうございました
384デフォルトの名無しさん:2007/01/29(月) 21:43:21
VistaのShellExecuteHooksで質問した>>250だけど、
なんかGoogleにやっと引っ掛かった

http://groups.google.com/group/microsoft.public.platformsdk.shell/browse_thread/thread/8b174e5f5fbe20a9/5fc035caca36b168?hl=en#5fc035caca36b168

レジストリのPoliciesに値作らないと駄目なのね。
やっぱセキュリティ上の問題か。
実質的にVistaじゃ使えないってことだな。。。。。
385デフォルトの名無しさん:2007/01/29(月) 22:40:22
今、圧縮ソフトを作っているのですが、
処理が終わった後に自分自身を消去するプログラムって作れますか?
自己解凍形式を作りたいのですが。
386デフォルトの名無しさん:2007/01/29(月) 22:49:55
>>385
MoveFileEx(プログラムファイル,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
確か、こんなんでおk。
387デフォルトの名無しさん:2007/01/29(月) 22:53:54
ただし再起動が必要
388385:2007/01/29(月) 22:56:04
ありがとうございます。
再起動が必要なのですか。
ちょっと微妙ですね。
389デフォルトの名無しさん:2007/01/29(月) 23:01:15
>>388
小汚い手段でもいいならバッチファイルでも使いなされ。
390385:2007/01/29(月) 23:08:34
うーん、やっぱりユーザーに削除してもらうことにします。
ありがとうございました。
391デフォルトの名無しさん:2007/01/29(月) 23:29:04
再起動のいらない自己削除の方法なら何度か過去ログに出てるよ
392デフォルトの名無しさん:2007/01/29(月) 23:30:06
>>385
プロセスは重いからスレッド
393デフォルトの名無しさん:2007/01/29(月) 23:38:13
質問です。

他プロセスが作成したMutexをクローズする処理はどのように行えばよいでしょうか?
OpenMutexで取得したハンドルをCloseHandleで閉じても、自プロセスでのMutexがクロー
ズされるだけで、他プロセスのMutexは閉じれません。

カーネル関係のAPIでカーネルが管理している各オブジェクトハンドルが取得できるらし
いのですが…
394デフォルトの名無しさん:2007/01/29(月) 23:39:50
>>393
DuplicateHandle
395393:2007/01/30(火) 00:00:00
>394
DuplicateHandleですね? 試してみます。
ありがとうございました。
396デフォルトの名無しさん:2007/01/30(火) 00:04:46
http://support.microsoft.com/kb/190351/ja

ここのサンプルで、CreateProcess後に、
CloseHandle(pi.hThread)をしている理由がわからん。

必要ないとしても、何で?
397デフォルトの名無しさん:2007/01/30(火) 00:12:13
閉じない限りいつまでもプロセスハンドルテーブルに残り続けてハンドルリークするから。
398デフォルトの名無しさん:2007/01/30(火) 00:16:18
>>397
んじゃぁ、pi.hProcessの有効範囲をWaitFor〜関数でチェックし、
そのタイミングで消しても別におk?
399デフォルトの名無しさん:2007/01/30(火) 00:22:41
>>398
もちろんおk
つーかWaitFor〜使う予定なら閉じたら逆にまずいだろ
400デフォルトの名無しさん:2007/01/30(火) 00:23:59
>>399
了解。
ありがとお
401デフォルトの名無しさん:2007/01/30(火) 09:43:35
mouse_eventを使えばアクティブウィンドウにマウスカーソル移動のメッセージを送ることができますが,
カーソル座標をアクティブウィンドウ内の座標系で指定するにはどうすればよいでしょう?
402デフォルトの名無しさん:2007/01/30(火) 10:00:43
ClientToScreen() とか ScreenToClient() とかの話?
403401:2007/01/30(火) 10:05:08
>>402
まさに探し求めてたものずばりです
即レス感謝!
404デフォルトの名無しさん:2007/01/30(火) 12:51:57
OSの入力バッファ(DirectInput、Windowsメッセージより上位)に直接登録するのって、
どんなAPIとかでやるんでしょ。
まったく想像がつかないので、ヒントとか読むべきところとかもらえないでしょうか。
もしかして、ドライバとか?
405デフォルトの名無しさん:2007/01/30(火) 12:56:26
入力装置を自作
406デフォルトの名無しさん:2007/01/30(火) 12:57:02
SendInput?
407デフォルトの名無しさん:2007/01/30(火) 13:01:40
HIDドライバ
HIDフィルタドライバ
SendInput (keybd_event)

また自動実行マクロか
408デフォルトの名無しさん:2007/01/30(火) 13:25:51
>>405-407
ありがとう。ちみたちあいしてる。
読んでみます。

>>また自動実行マクロか
正解。ゴーストリプレイというソフトの存在を知って、すげーと思い、どうやって実装しているのか試してみようとおもった。
まずはキー入力制御から。Webアプリの自動テストとかにつかえそうだし。
業務アプリとかしかつくってない自分からするとカーネル領域への書き込みとかなんか聞くだけですげーし、
プロセス隠蔽機能/ステルス機能とか業務アプリとかでも役立ちそうだし、イイ勉強ネタだとおもったんで。
お返事、ありがとう。
409デフォルトの名無しさん:2007/01/30(火) 13:31:51
業務アプリのプロセス隠蔽なんて
410デフォルトの名無しさん:2007/01/30(火) 13:37:33
>>374
遅レス
ハンドラ側はリージョン更新だけで、DirectX で窓内の描画してるんじゃね?
411326: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の言語)のまま・・・・・
マニフェストで管理者権限を要するにして実行しても同じ。
同じ経験された方、理由の解る方、おりませんか?
413デフォルトの名無しさん:2007/01/30(火) 15:52:02
>>411
メモリリークなら、malloc()したのをfree()していないか、newしたのをdeleteしていないか。
DeleteObjectしなくて溜まるのはGDIオブジェクト。
414326:2007/01/30(火) 16:12:05
>>413
ありがとうございますm(__)m
メモリリークなのですがmalloc()もnewも使ったことがないから多分
違うと思います。HBITMAP型の変数に上書きしていっていることに
何か原因があるんでしょうか?
415デフォルトの名無しさん:2007/01/30(火) 16:17:03
もうちょっと状況を詳しく
いったい何を持ってメモリが溜まると判断してるのか、溜まると何が困るのか。
LoadBitmap()使ってるならそう書け
416デフォルトの名無しさん:2007/01/30(火) 16:18:49
>>413
GDIオブジェクトがメモリを消費しない、みたいな言い方で誤解を招くな
それなりのサイズのHBITMAPをリークすれば、メモリも消費するべ

>>414
おい、ちゃんと上書きする前にDeleteしてるんだろうな・・・
417デフォルトの名無しさん:2007/01/30(火) 16:20:39
>>414
とりあえず、タスクマネージャでGDIオブジェクトの数が増え続けてないか確認しろ
418326:2007/01/30(火) 16:22:14
>>415
すいません、LoadBitmap()を使っていてHBITMAP型の変数に上書き
するたびにタスクマネージャのメモリ使用量が増えていっているため
です。そのあとDeleteObjectで解放をしていますが次の画像を表示
するたびにメモリ使用量が1.37MBづつ増えていってしまうのです。
419326:2007/01/30(火) 16:26:36
>>417
タスクマネージャでGDIオブジェクトの数が増え続けています。
420デフォルトの名無しさん:2007/01/30(火) 16:27:58
SelectObjectしたままDeleteObjectしてるとか。
421デフォルトの名無しさん:2007/01/30(火) 16:31:11
うんこしたままおしっこしてるとか。
422326:2007/01/30(火) 16:31:26
>>420
それはないです、戻り値に0以外の数字を確認しました(DeleteObjectの戻り値)
423326:2007/01/30(火) 16:34:06
>>421
??どういうこと??
424デフォルトの名無しさん:2007/01/30(火) 16:35:11
上書きしちゃったらDeleteObject()できないと思うんだが・・・
425デフォルトの名無しさん:2007/01/30(火) 16:40:12
最終後始末のことを考えなければ
DeleteObject(dc, SelectObject(dc, LoadBitmap()))
差し替えなんてこんなもんだろ?
426デフォルトの名無しさん:2007/01/30(火) 16:45:18
hbmp = LoadBitmap(・・・);
SelectObject(hdc, hbmp);
hbmp = LoadBitmap(・・・);
SelectObject(hdc, hbmp);
  ・
  ・
  ・
DeleteObject(hbmp);

↑な順番でやってるならGDIの基礎から勉強しなおしてこい。

hbmp = LoadBitmap(・・・);
hbmpold = SelectObject(hdc, hbmp)
SelectObject(hdc, hbmpold);
DeleteObject(hbmp);

こうするのが正解
427デフォルトの名無しさん:2007/01/30(火) 16:45:44
それは元の質問者の HBITMAP型の変数、が出てこないから
428デフォルトの名無しさん:2007/01/30(火) 16:46:27
>>427>>425宛て
429デフォルトの名無しさん:2007/01/30(火) 16:49:14
質問者とは関係ないと思うが、こんな話しもあってガグブルw
>Windows XP を実行するコンピュータ上で
>MFC アプリケーションを実行すると GDI オブジェクトでメモリ リークが発生する
http://support.microsoft.com/default.aspx?scid=kb;ja;319740
430326:2007/01/30(火) 16:53:06
>>427,425
426の方の正解の方法をとってました。
が425の方法に変えてやって見ましたが、やはりタスクマネージャーの
メモリ使用率が増えていってしまいます。
431デフォルトの名無しさん:2007/01/30(火) 16:53:46
>>430
で、増えると何か困るのか?
432デフォルトの名無しさん:2007/01/30(火) 16:55:34
LoadLibraryされた時に走る関数内(例えばDLL内アプリケーションクラスのInitInstance等)で
デバイスアクセスっぽいAPI(例えばwaveOutGetNumDevs)呼ぶのって、何か問題ですか?

XPだとうまくいくのに,Vistaだとうまくいかない(0が返ってくる)。。

教えて下さい。
433326:2007/01/30(火) 16:59:48
>>431
はい、画像枚数が少ない間はそれでいいんですけど
増えていった時に困るでしょう(;_:)
434326:2007/01/30(火) 17:02:03
>>429
すいません、MFCはまだ勉強できておりませんので、
しかしわざわざありがとうございますm(__)m
435デフォルトの名無しさん:2007/01/30(火) 17:04:01
ウィンドウプロシジャ内で break; 付け忘れてるとかいうオチはないだろうな?

case xxx: 差し替え側コード;
case xxx: 生成側; break;

# 昔はまったことがあるw
436326:2007/01/30(火) 17:06:53
>>436
確認しましたがそれは無いようです(^^ゞホッ
437デフォルトの名無しさん:2007/01/30(火) 17:15:32
>>437
それはないわ
438326:2007/01/30(火) 17:18:18
>>437
それはないと言いますと、この手順で間違いがないということでしょうか?
439デフォルトの名無しさん:2007/01/30(火) 17:35:36
タスクマネージャのメモリ使用量ってアレだな。
リソースがディスクからデマンドページングで読まれても
増えるんだっけか?
440デフォルトの名無しさん:2007/01/30(火) 17:36:38
>>433
別に困らんが?
システムの動作に文句つけたいんならもうちょっと調べろ矢
441326:2007/01/30(火) 17:38:43
すいません。ありがとうございました
442デフォルトの名無しさん:2007/01/30(火) 18:09:32
ワーキングセットサイズから物理メモリと仮想メモリを見てメモリリークを確認
ハンドル数をチェックしてハンドルリークを確認
メモリリークチェッカーでリーク箇所があるかをチェック
MSのサイトからランタイムがリークするネタをチェック。同様にOSがリークするネタを同様にチェック
ローディングされているモジュール一覧からIME等DLLを注入してくる系統をすべて排除
グローバルフック、CreateRemoteThread系でDLLを後から打ち込んでくるものを排除
英語版Windowsでチェック、ドライバをデフォルトのものにする
443デフォルトの名無しさん:2007/01/30(火) 18:19:41
もしかしてGetDCとReleaseDCの予感
444326:2007/01/30(火) 19:20:43
>>442
ワーキングセットサイズ自体の見方がわかりません(~_~;)
445デフォルトの名無しさん:2007/01/30(火) 19:54:51
最小限のコード組んで何処で増えているのか、或いは減るべきところが減っていないのか調べろ。
446デフォルトの名無しさん:2007/01/30(火) 20:02:01
PrivateProfile系のAPIは、セクション名やキー名の途中に半角スペースが含まれていても
環境に依存せず正常に動作するでしょうか
447デフォルトの名無しさん:2007/01/30(火) 20:11:51
>>446
ためせばわかる
448デフォルトの名無しさん:2007/01/30(火) 20:46:55
環境っていったいなんの環境なのか
449デフォルトの名無しさん:2007/01/30(火) 21:20:14
450326: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;
こんな感じで組んでます。やはり画像を出した後タスクの
メモリ使用量が増えていってしまいます。
451326:2007/01/30(火) 21:46:30
>>451のつづき
こんな感じで最小限に小さくしました。
減ったところはありません
452デフォルトの名無しさん:2007/01/30(火) 21:49:02
>>451
hdc2ってなに?
SelectObject前のビットマップはどこへ?
453デフォルトの名無しさん:2007/01/30(火) 21:50:23
SelectObjectの戻り値をDeleteObjectしてるわけだが、LoadImageしたhBitmapはどこでDeleteObjectしてるかと…
454デフォルトの名無しさん:2007/01/30(火) 22:06:53
SelectObjectより

解説
この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。
アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。

hdc2がキャッシュだったら重要じゃないかもな
455デフォルトの名無しさん:2007/01/30(火) 22:19:05
hdc2ってのがWM_PAINTで画面に描画するメモリDCなわけね。
んで新しいのをSelectObjectしたときに、前のをDeleteObjectしてる、と。
GetDC / ReleaseDC は要らないけど、害も無さそう、と。

初回はLoadImageしてないのを DeleteObject してるので、そこはマズそう。
2回目以降は別に問題ないんじゃない?
hdc2 の生成と破棄のあたりを曝してみては?
456デフォルトの名無しさん:2007/01/30(火) 22:19:22
僕ハッカー
457326: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はメモリディバイスコンテキストです。
458326:2007/01/30(火) 22:30:07
>>455
hdc2の生成はこんな感じで↓
hdc2= CreateCompatibleDC(hdc)
破棄のときは↓
case WM_DESTROY:
 DeleteDC(hdc2);
PostQuitMessage(0);
break;
こんな感じでやっております。
459デフォルトの名無しさん:2007/01/30(火) 22:34:31
hdc2= CreateCompatibleDC(hdc)はWM_CREATEあたりでやってるのかな?
460デフォルトの名無しさん:2007/01/30(火) 22:36:50
ちなみにWM_PAINTは?
461326: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;
こんな感じです。
462デフォルトの名無しさん:2007/01/30(火) 22:46:48
面倒だ。全部どっかのアプロダにUpしろ。
463デフォルトの名無しさん:2007/01/30(火) 22:48:20
お前のプログラムのメモリ消費より
くだらんことでスレが消費される方が痛いわ
464デフォルトの名無しさん:2007/01/30(火) 22:56:11
>>412
うまくいかない理由は知らないけど、
回避策として FindResourceEx でリソースから文字列をロードしたら?
これなら言語を明示的に指定てきる。
465デフォルトの名無しさん:2007/01/30(火) 23:00:42
>>461
WM_CREATEのhdcはどっから生成?

hdc2= CreateCompatibleDC(hdc);
こんときのhdcは有効な値?
466デフォルトの名無しさん:2007/01/30(火) 23:08:27
俺はベタで言われたとおりコピペったが?
普通に動くし
467デフォルトの名無しさん:2007/01/30(火) 23:28:07
http://mata-ri.tk/up5/upload.html
ここの5M5135.zip

DLはxs5l

>>326よ、これとなぬが違う?
468326:2007/01/30(火) 23:43:18
>>467
すいません、動きませんでした。なんかアプリケーションを最初から
インストールしてくださいみたいなのがでて、実行できませんでした。
469デフォルトの名無しさん:2007/01/30(火) 23:52:32
やっていることが滅茶苦茶だ。
リソースは必用なときに選択して、使い終わったら元に戻せ。
選択しっぱなしにしたり、管理が曖昧な状態でタイミングで削除するな。
470デフォルトの名無しさん:2007/01/30(火) 23:53:15
>管理が曖昧な状態のタイミングで削除するな。
471デフォルトの名無しさん:2007/01/30(火) 23:54:13
>>468
Visual Studio 6?
472326:2007/01/31(水) 00:08:34
>>467
すいませんなんとか動きました、
しかしこれも新しい画像を読み込むと
メモリ使用量が増えますよね。
473デフォルトの名無しさん:2007/01/31(水) 00:11:27
bitmapの描画って普通はメモリDCにSelectObjectしてから
BitBltとかでメモリDCからスクリーンに転送するんじゃないの?
474デフォルトの名無しさん:2007/01/31(水) 00:12:55
C言語+APIでWinプログラミング始めたんですが、
デバイスコンテキストがやたら出て来るんですけど、
デバイスコンテキストがわからねー、何なのこれ?????
475326:2007/01/31(水) 00:14:39
>>469
リソースを元に戻すとはどのようにですか?
すいません、ほんと質問ばかり。
>>471
Visual Studio 8です。

476デフォルトの名無しさん:2007/01/31(水) 00:31:35
>>474
グラフィック・デバイス・インターフェイスを抽象的に扱う【対象】。

例えば、
『▲に叩かれる』とした場合、
▲に相当するものが、姉,妹ならば、
『姉,妹は俺を叩くことができるコンテキスト』となる。

んで、『俺を叩くこと』を『描画する』に、
『姉』はディスプレィ,『妹』を『プリンタ』にそれぞれ変換するとだな
477デフォルトの名無しさん:2007/01/31(水) 01:49:44
>>476
どうもです、超入門レベルでスマソですが、
抽象的に扱うがなんなのか?なんです。
デバイスコンテキストで描画に関する何を管理(管理という言葉が正しいか?)してるのか?なんです。
描画対象のHWNDが分かれば、HDCは不要な気がするのですが...
478デフォルトの名無しさん:2007/01/31(水) 01:57:52
「抽象的に扱われるなにか」を隠蔽してエンドユーザー(API利用者)が
HDCやHWNDやHANDLEという単純な「型」だけを意識すればいいようにする仕組み
なにが抽象化されているかは公開されていないから考えないのがオトナ

あとHWNDからHDC取れるけどプリンタとかその他の要素もHDCを介するから
HWNDイコールHDCで考えるのは間違い
479デフォルトの名無しさん:2007/01/31(水) 02:13:49
質問です

子ウィンドウを動かす際に、

GetWindowRect(子ウィンドウハンドル,rect);
MoveWindow(子ウィンドウ,rect.left,rect.top,幅,高さ,TRUE);
とすると、繰り返すことでどんどん下に下がって行きます。

GetWindowRectの座標の原点が親のウィンドウのフレームを含めた左上に対して、
MoveWindowの原点が親のウィンドウの描画領域の左上なことは分かりました。

この差を吸収するAPIはありますか?
それとも事前にフレームとの差を保存しておくしかないでしょうか?
480デフォルトの名無しさん:2007/01/31(水) 02:19:41
>>479
GetWindowRectが返すのはスクリーン座標だから、親のウィンドウは関係ない。
スクリーン座標からクライアント座標への変換はScreenToClient
481デフォルトの名無しさん:2007/01/31(水) 02:50:01
親のハンドルでScreenToClientすることでできました

ありがとうございました
482デフォルトの名無しさん:2007/01/31(水) 02:52:12
test
483デフォルトの名無しさん:2007/01/31(水) 07:34:07
>326
描画せずに、LoadBitmap直後にDeleteObjectしてみれ。
それで現象が変わらないなら、>439じゃねーの。
484デフォルトの名無しさん:2007/01/31(水) 08:12:13
>>439
例えば、ビットマップ表示後にウィンドウを最小化して再び最大化したら、
メモリ量は解消されているのかな?
485デフォルトの名無しさん:2007/01/31(水) 09:15:02
OS側でメモリの解放さぼってるだけだろ
頻繁にやっても効率わるいだけだし
486デフォルトの名無しさん:2007/01/31(水) 09:15:53
とりあえず、>>419だそーだから、リークしてるのは確かぽくね?
487デフォルトの名無しさん:2007/01/31(水) 09:24:47
>>467のやつだとほとんど変化なしだったよ
488デフォルトの名無しさん:2007/01/31(水) 09:28:17
そんなに気になるんならタイマーかなんかで何回も繰り返してみりゃいいじゃん
HDBENCHみたいな感じで
489デフォルトの名無しさん:2007/01/31(水) 09:30:36
同じビットマップだと変化しないそうだから、ビットマップリソースに限られるんじゃね
で、確かに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
です。

出ても問題ないような気もするけどなんとなく気持ち悪い…
491デフォルトの名無しさん:2007/01/31(水) 11:59:15
中で例外使った処理してるだけだろ。
仕様だろうから諦めるしかないんじゃね。
492326:2007/01/31(水) 15:03:43
>>484
最小化して元に戻したらメモリ使用量は結構減りました。
なんでだろ??
493デフォルトの名無しさん:2007/01/31(水) 15:05:38
494デフォルトの名無しさん:2007/01/31(水) 15:12:15
webからphpを利用してサーバ内でcmdプロンプトを立ち上げ、サーバのモニタ上に表示させるようにしたいと思ってるのですが、
system()でcmdを実行してもプロセス(cmd.exe)は立ち上がっているのですが、ウインドウが非表示になってしまいます。
表示で起動する方法はありますか?
495デフォルトの名無しさん:2007/01/31(水) 15:16:10
>>494
ありません。他の方法を考えましょう(デスクトップと対話可能なサービスと通信するとか)。
496デフォルトの名無しさん:2007/01/31(水) 15:17:16
Webサーバは何をどうやって動かしてるの?
497デフォルトの名無しさん:2007/01/31(水) 15:20:40
>>495
レスありがとうございます。
デスクトップと対話可能なサービスって、例えばなにかご存知でしょうか?

環境はApache/2.0.54 (Win32) PHP/4.4.2 で、
WEBから起動し、リモートデスクトップ見た時にウインドウが立ち上がっていることを確認したいのです。
498デフォルトの名無しさん:2007/01/31(水) 15:43:23
いやだからそのWebサーバはどうやって起動してんのかと
サービス?

サービスだったら、サービスの設定で対話可能にするチェック入れてみ
自分でサービス書いたほうが楽だとは思うが、
それよりも、Syslog を導入してそれ使うのがいいと思うよ
499490:2007/01/31(水) 15:46:15
>>491
中で例外使ってるといっても正しく呼び出してるのに何で例外になるのかと思って
何が気に食わないんだろう
500デフォルトの名無しさん:2007/01/31(水) 15:49:23
何が気に食わないんだろう
501デフォルトの名無しさん:2007/01/31(水) 15:51:21
サトエリかよ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回目を無視する方法はありますか?
よろしくお願いします
503デフォルトの名無しさん:2007/01/31(水) 17:55:28
フラグの処理まちがってんじゃね?としか
504デフォルトの名無しさん:2007/01/31(水) 18:39:06
>>499
例外というのは単なるエラーではない。
状況や結果を表す為にライブラリ等が敢えて発生させるもの。
「例外が発生した=問題がある」ではない。
505デフォルトの名無しさん:2007/01/31(水) 20:33:12
ウィンドウの左上のアイコンを非表示にしたいんですけどどうしたらいいですか
506デフォルトの名無しさん:2007/01/31(水) 22:55:19
透明なアイコン作っていれとけ。
507デフォルトの名無しさん:2007/01/31(水) 23:04:10
>502
とりあえず変更バッファにでも保持しといて、しばらくしてから実行すれば。
508デフォルトの名無しさん:2007/01/31(水) 23:41:22
システムメニュー外すとか
509デフォルトの名無しさん:2007/02/01(木) 00:20:18
>>502
非同期の待機処理が誤っているんじゃ?
結果、FILE_NOTIFY_CHANGE_SIZEの完了までに、
処理が2回走ってんじゃね?
510sage:2007/02/01(木) 00:27:28
タスクバーのボタンを消すのってどうすればいいのでしょ?
WS_EX_APPWINDOW を消して、WS_EX_TOOLWINDOW を付けて、
CreateWindowEx() すれば、タスクバーにボタンは出ないことはわかった。
が、既に作ったウィンドウに対して GetWindowLong() & SetWindowLong() で
同じ事をしても、ボタンは消えてくれない。なぜ???
SPY++ で見る限り、style は同じなのだが。
511デフォルトの名無しさん:2007/02/01(木) 02:06:02
タスクバーに通知
512デフォルトの名無しさん:2007/02/01(木) 05:20:56
SetWindowLongだけでは適用されないスタイルは
ShowWindowとかSetWindowPosすると適用されたりする。
非公式な動作なので保証はできないが。
513デフォルトの名無しさん:2007/02/01(木) 09:11:02
>>511
ボタン出す時は、WM_USER+1280 投げればよさげ。
消すときがわからん

>>512
HIDE→SHOWしてもだめ
SWP_DRAWFRAME もだめ


WM_USER+1280ってことは、ツールバーコントロール的に、やれってこと?

514デフォルトの名無しさん:2007/02/01(木) 09:18:11
やったことないけど、これでなんとかならんの?
ttp://msdn2.microsoft.com/en-gb/library/ms631840.aspx
515デフォルトの名無しさん:2007/02/01(木) 10:49:50
VCLアプリだとShowWindow(Application.Hnadle, SW_HIDE)で
516デフォルトの名無しさん:2007/02/01(木) 14:27:12
いっそのことタイトルバー消しちゃえば良いんでないの?
とか言ってみる
517デフォルトの名無しさん:2007/02/01(木) 14:29:22
そして自前でタイトルバーらしきものを描画するってか
518デフォルトの名無しさん:2007/02/01(木) 14:29:49
表示しないウインドウの子ウインドウ
519デフォルトの名無しさん:2007/02/01(木) 15:13:07
>>516-517
自前タイトルバーにドラッグ機能つけんといかんが、
その方法が手っ取り早いと思う。 問題はWinバージョンに
よってタイトルバーデザインが異なる点をどうするかだけど。
520デフォルトの名無しさん:2007/02/01(木) 17:02:53
521デフォルトの名無しさん:2007/02/01(木) 17:09:37
ドラッグはNCHITTESTでTITLE返せばいいだけだけど、
自前描画で解決は道が違うだろう
522デフォルトの名無しさん:2007/02/01(木) 18:21:52
ITaskbarListいじっちゃうとか
523ITaskbarList:2007/02/01(木) 18:24:43
私をいじって♪
524デフォルトの名無しさん:2007/02/01(木) 21:01:51
Vistaのエクスプローラの、
「詳細ペイン」とか「プレビューペイン」を表示/非表示するコマンドを
もしかして知ってる人いないですかね。いませんよね。
525デフォルトの名無しさん:2007/02/01(木) 21:02:18
vista系のスレで聞いてみれば
526510,513:2007/02/01(木) 22:25:34
>>514
>>520

ありがと、軽く読んだ感じでは、できそうですね。
週末にでも試してみます!

527510,513:2007/02/02(金) 00:08:02
消せた。

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 だけの設定で、再スキャンさせて消してもらう方法は無いのか?
528デフォルトの名無しさん:2007/02/02(金) 01:17:26
サウンドの多重再生はどうやったらできますか
529デフォルトの名無しさん:2007/02/02(金) 01:19:29
むかーしMS謹製非サポートのサウンド多重再生ライブラリがダウソできた記憶が……
今ならDirectX使え、ってことになるのかも
530デフォルトの名無しさん:2007/02/02(金) 01:21:04
WDMドライバなら、カーネル側で合成してくれなかったっけっか。
それを期待できないほど古いハードウエアならご愁傷様。
531デフォルトの名無しさん:2007/02/02(金) 01:23:41
>>529
おまえそれWindows95時代の話じゃないか?
532デフォルトの名無しさん:2007/02/02(金) 01:39:31
wavemix懐かしす
533デフォルトの名無しさん:2007/02/02(金) 04:09:01
>>510
hide なウィンドウ1個作って
そのウィンドウを親にして子ウィンドウを作っていく。

とか。
534デフォルトの名無しさん:2007/02/02(金) 07:09:53
つーかそれしかない
535510,513:2007/02/02(金) 09:06:45
最初からボタン出さないならTOOLWINDOWでいい
今回は途中で消したい
あ、サイズ0で親作って途中でHIDEしろってことか
フラグに比べると面倒だなぁ
536デフォルトの名無しさん:2007/02/02(金) 10:25:37
MessageBoxってスレッドセーフなんでしょうか
また、もしスレッドセーフだったとして
スレッドセーフとか考えずにMessageBoxのラッパを書いたら
スレッドセーフじゃなくなるものでしょうか
537デフォルトの名無しさん:2007/02/02(金) 10:25:49
最初からHIDEでいいじゃん
538デフォルトの名無しさん:2007/02/02(金) 10:27:59
>>536
MessageBoxに対して複数スレッドからアクセスすることなんてある?
何しようとしてるの?
539536です:2007/02/02(金) 10:34:24
C++のストリームみたいにアクセスできる
メッセージボックスのラッパを書いて使ってたんです
シングルスレッドでは、特に問題なかったんですが
グローバルなマウスフックのプログラムを書いていて
mbstream << x座標 << y座標 << std::endl;
mbstream.show(); //ここでメッセージボックス表示
メッセージボックスを表示した時に
同じ座標の値が一つのメッセージボックスに大量に表示されてしまいました
なので、もしかしてマルチスレッドの問題かなと思ったんですが
見当違いだったらすみません
540デフォルトの名無しさん:2007/02/02(金) 10:48:32
プログラムの問題
541デフォルトの名無しさん:2007/02/02(金) 11:16:56
GetPrivateProfileString で ini ファイルを読もうと思っているのですが、
セクション名のないキーの値を取得することはできないんでしょうか?

普通の ini ファイルの中身は
[hoge]
fuga=unko
のようになっていますが、事情があって
fuga=unko
しか書いていないのです(変更することはできません)。

試しに
DWORD result = GetPrivateProfileString("", "fuga", "", 値へのポインタ, MAX_PATH, iniファイルへのパス);
と、セクションに空文字列を設定してみましたが、空文字列が取得できただけでした。
やっぱり自分でファイル開いて読むしかないでしょうか?
542デフォルトの名無しさん:2007/02/02(金) 11:19:00
textで読めばいいと思うよ
543デフォルトの名無しさん:2007/02/02(金) 11:23:20
やっぱそうですよね、ありがとうございました。
544393:2007/02/02(金) 12:16:06
DuplicateHandleで他プロセスのMutexをクローズできるかどうか質問した者です。
DuplicateHandleを試してみたのですが、SourceHandleを設定する際に、他プロ
セスのハンドルを取得することができません。他プロセスのMutexハンドルを取得す
る方法はあるのでしょうか?
または、ProcessExplorerみたいに他のプロセスのハンドルを列挙してハンドルを閉
じるということはできるのでしょうか?
545デフォルトの名無しさん:2007/02/02(金) 12:56:37
>>541
ファイルの中身をコピーして、頭にセクション名を付加するといいぉwww
546デフォルトの名無しさん:2007/02/02(金) 16:23:03
>>545
おまえ頭いいな
547デフォルトの名無しさん:2007/02/02(金) 17:20:16
>>539
とりあえずストリームとメッセージボックスに問題を分けてみよう。
これでどうよ。
std::basic_ostringstream<TCHAR> os;
os << x << y << std::endl;
MessageBox(0, os.str().c_str(), TEXT(""), MB_OK);
548デフォルトの名無しさん:2007/02/02(金) 17:42:59
MessageBoxが止まるのは、呼び出したスレッドだけだし。
中でメッセージループは回るし。
グローバルフックなら、各アプリケーションの各スレッド全部が
MessageBox出すだろそりゃ。
549デフォルトの名無しさん:2007/02/02(金) 17:51:38
MessageBoxって、下にあるWindowに
WM_PAINT処理があっても再描画してくれない?
550デフォルトの名無しさん:2007/02/02(金) 18:04:21
>>549
くれるよ(別にMessageBoxが再描画するわけじゃないけど)。
551デフォルトの名無しさん:2007/02/02(金) 18:36:28
>>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側にポストすると
普通にデータがきているみたいでした

一言でまとめると、ウィンドウハンドルを
指定したら同期処理されてるっぽい?
552536です:2007/02/02(金) 18:40:31
あ、名前欄入れ忘れた
551は536です
553デフォルトの名無しさん:2007/02/02(金) 18:57:11
・・・・・・
554デフォルトの名無しさん:2007/02/02(金) 18:57:53
>>551
全プロセスの全スレッドでそれが動いて、hWnd が有効な1つのプロセスでだけ
「メッセージボックスは1つしかでません 」ってことじゃないの?

それは別としても、グローバルフックでメッセージボックスは出さない方がいいと思うよ。
555デフォルトの名無しさん:2007/02/02(金) 19:17:00
キチガイはいきなりわけわからんことやるから怖い
556536です:2007/02/02(金) 19:33:14
>>554
メッセージボックスをたくさん出したいわけではなくて
単にフォアグラウンドのスレッドのマウスの軌跡を表示させたかったんですが
ええと、これってそもそもスレッドセーフとか全然関係ないことでしょうか

>>それは別としても、グローバルフックでメッセージボックスは出さない方がいいと思うよ
次からそうすることにします
ブレークポイントとかきかないし、フック処理はデバッグ難しいですね
557デフォルトの名無しさん:2007/02/02(金) 20:24:10
>>556
スレッドセーフっていうかさ、どんなライブラリをリンクしているとも知れない他所の
プロセスにコード挿入して

 std::basic_ostringstream<TCHAR> os;
 os << pm->pt.x << pm->pt.y << std::endl;

って大丈夫?どこのヒープからどうアロケートされることを期待してるんだ?
558デフォルトの名無しさん:2007/02/02(金) 20:51:49
win32apiの関数だけでサウンドの多重再生できませんか?
サウンドの多重再生を実現するためだけにDirectXを勉強したくないんですけど
559デフォルトの名無しさん:2007/02/02(金) 20:52:07
背伸びし過ぎ
だから不具合が出たときも検討違いのところしか
考えられなくて原因が追求できない
560デフォルトの名無しさん:2007/02/02(金) 20:53:32
>>557
すみません、ライブラリのリンクがどう関係するかまではわからないんですが
DLL挿入先のプロセスのアドレス空間でアロケートされると思ってます
今は暗黙のリンクにしているので
.exeのほうで静的なコンストラクタ等が呼ばれるよりも前に
各DLLのDllMainが呼ばれて、おそらくこのタイミングで
ストリームの初期化が行われているんだと思ってます
ストリームではなくデータをどう保存するかは考え中だけど
今のところメモリマップトファイルに保存しようと思ってます
561デフォルトの名無しさん:2007/02/02(金) 20:54:11
>>558
DirectX勉強する方が遥かに楽だよ
562デフォルトの名無しさん:2007/02/02(金) 21:26:06
>>561
そうすか。
じゃあ画像描画の部分もdirectX使ってプログラム全部書き直すかなあ。
ああ面倒くせ挫折するかな
563デフォルトの名無しさん:2007/02/02(金) 21:27:06
>>558
Vistaが出て、今後益々Windowsのマルチメディアの中核にDXが来るこのご時世に
そんなわがまま言ってるようじゃプログラマじゃないぜ
より少ない労力でより良い効果を出すのがプログラマですよ?
564デフォルトの名無しさん:2007/02/02(金) 21:27:10
DllMainのDLL_PROCESS_ATTACH内でメモリリークさせた状態でFALSEを返して、
クライアント側のロードを失敗させた場合って
クライアント側のプロセスにとっては事実上リークはなかったことになるんでしょうか?
565デフォルトの名無しさん:2007/02/02(金) 22:31:53
>>562
勉強が嫌いなら早めに挫折するといいよ
566デフォルトの名無しさん:2007/02/02(金) 22:38:34
>>562
何のためにDirectXがコンポーネントになってると思う?
DirectSoundを使うからと言ってDirectX Graphicsまで使う必要は無いぞ。
567デフォルトの名無しさん:2007/02/02(金) 22:54:36
ochinchin.h を manko.cpp に include したはずなのに童貞が捨てられません
568デフォルトの名無しさん:2007/02/02(金) 23:06:21
#ifndef WOTAKU で除外されてるからさ
569デフォルトの名無しさん:2007/02/03(土) 01:40:42
>>560
デバッグメッセージは、WM_COPYDATAを使って送りつけるといい。
570デフォルトの名無しさん:2007/02/03(土) 03:07:32
素朴な疑問。

SysListView32とかToolBarWindow32とかは、
64bit環境でも同じ名前なの?
571デフォルトの名無しさん:2007/02/03(土) 04:26:56
>>564
ならない。
572デフォルトの名無しさん:2007/02/03(土) 04:28:05
>>570
同じ。64bit DLLがsystem32にあって32bit DLLがSysWOW64にあるくらいですから
573デフォルトの名無しさん:2007/02/03(土) 04:37:26
CCritSecクラスをDLLのグローバルインスタンスで宣言した場合、
これは正しくCRITICAL_SECTIONを初期化できるのでしょうか?
それともDllMainが処理された後でないと正しくInitializeCriticalSectionが成功しないのでしょうか?

574デフォルトの名無しさん:2007/02/03(土) 06:28:10
デバッグして自分で確認すればいいじゃないか。
575デフォルトの名無しさん:2007/02/03(土) 06:30:44
ごめん。おいらの勘違いだった。
どうもイベントハンドルをもったまま終了するスレッドがあって
そいつのせいでおかしくなって他っぽい。
そのバグとったらクリティカルセクションで守っているコードブロックを同時にアクセスしなくなった。
576デフォルトの名無しさん:2007/02/03(土) 10:51:43
ディレクトリ以下を再帰的に全部削除してくれる API ってない?
DeleteDirectory じゃ空じゃないとだけだから面倒なんだよねぇ。
577デフォルトの名無しさん:2007/02/03(土) 10:57:07
ShellExecuteで、rd /s (NT)かdeltree (9x)を呼んだら?
まあたぶんシェル関係の関数で何かありそうな気がするけど。
578デフォルトの名無しさん:2007/02/03(土) 11:31:24
自分で再帰的に削除するぐらい簡単に作れるだろ。
579デフォルトの名無しさん:2007/02/03(土) 11:34:34
作らなくてもあるけど思い出せない
580デフォルトの名無しさん:2007/02/03(土) 11:39:44
boost::filesystem::remove_all
581デフォルトの名無しさん:2007/02/03(土) 11:42:12
SHFileOperation
582デフォルトの名無しさん:2007/02/03(土) 11:53:30
>>576
SHFileOperation
583582:2007/02/03(土) 12:00:21
ごめん、かぶったか。
念のため実行して確認してたんで・・・

>>576
ということで、間違いなくできるから。
確認やエラーのダイアログはフラグで出す出さない指定できるから。
584デフォルトの名無しさん:2007/02/03(土) 14:43:55
GDI+で画像拡大すると、ドット半分(2倍なら1ドット、16倍なら8ドット)左上にずれてしまうんですが
ずれなくする方法はないでしょうか?
585デフォルトの名無しさん:2007/02/03(土) 15:19:59
>>584
倍率の半分だけ右下にずらして描画する。
586デフォルトの名無しさん:2007/02/03(土) 18:22:54
XP SP2のネットワーク共有フォルダのファイルをFindFirstFileで
列挙すると、とても遅いんですが、なんとかならないでしょうか。
フォルダに2000ファイルぐらいあると10秒以上掛かります。
Windows2000では一瞬だったのに。
ネットワークドライブ、\\ホスト\共有名\〜のUNCパスどっちも遅いです。
ただし、共有フォルダの列挙が遅いだけで、
他の通信やファイルの読み書き自体は正常な速度です。
リンク速度は100Base-TXで、PCのEthernetチップは両方ともIntelです。

SH経由なら速いかなと思いましたがExplorerからも同じぐらいの遅さでした。
ポリシーやレジストリの設定くさいんですが、何かあるでしょうか?

587デフォルトの名無しさん:2007/02/03(土) 18:27:15
エクスプローラより遅いかどうかだな
588デフォルトの名無しさん:2007/02/03(土) 20:06:39
ネットの設定だな。名前解決が遅いネットワークに組みあがっているんじゃない?
何にしてもお前の問題だしスレ違い。
589デフォルトの名無しさん:2007/02/03(土) 20:39:38
>588のいうとおり名前解決の問題か、ログオン処理の問題か、考えられるのはそんなところか。
WNetAddConnection2でログオン処理をしてる?
590デフォルトの名無しさん:2007/02/03(土) 23:54:00
いま、C+Win32APIでwinプログラムの勉強を始めたばかりなんだが、
親ウインドウのHWNDを子ウインドウで使うんでグローバル変数に保存したいんだが
どこで親のHWNDを取得するのがよい?
たとえば
1. 親ウインドウをCreatWindow(Ex)した時の戻り値のところ
2. 親のプロシージャのWM_CREATEメッセージのところ(でプロシージャの引数をコピー)
等など
591デフォルトの名無しさん:2007/02/03(土) 23:56:58
>>590
子ウィンドウ側がGetParentで取得
592デフォルトの名無しさん:2007/02/04(日) 00:00:56
>>591
早い答え、dクスです
グローバル変数に保存するのではなく、必要なときにGetParentすると言うことですね
593デフォルトの名無しさん:2007/02/04(日) 00:17:23
>>558
すでにバッファにある音を再生できているなら、APIを使う必要すらないよ。
単にwavをバッファで合成してから出力するだけだし。
デバイス周りからやらなきゃならないなら、他の人が言うようにDirectSound使うのがいいかもね。
594デフォルトの名無しさん:2007/02/04(日) 00:34:18
>>592
補足
GetParent()ぐらい大したオーバーヘッドにはならないし、
下手にグローバル変数やメンバ変数使うよりも
その都度取得した方が確実で読みやすいコードになる
595デフォルトの名無しさん:2007/02/04(日) 01:32:10
そういえば、constがついてないグローバル変数は10年以上使ってないなw
_Moduleだけは使わざるを得ないけど。
596デフォルトの名無しさん:2007/02/04(日) 02:00:26
サウンドの多重再生で悩んでるものですが、
DirectSoundはC言語のみでは利用できませんか
自分が作ってきたプログラムがC言語のみで書かれてるので、
C++で書かれたDirectSoundのサンプルコードを自分のプログラムに追加できませんn
萎える
597デフォルトの名無しさん:2007/02/04(日) 02:06:38
C++コンパイラなら普通に使えるだろ
598デフォルトの名無しさん:2007/02/04(日) 02:19:14
>>596
dsound.hにC向けのマクロが用意されている、はず。
lpVtblから直接書いてもいいし。
599596:2007/02/04(日) 20:17:24
自作のプログラムの拡張子をcppに変えて、コンパイルエラーが出ないように修正した上で、
DirectSoundのコードを追加することにより解決しました、ありがとうございました。
600デフォルトの名無しさん:2007/02/04(日) 22:56:47
Listviewのツールチップで困っています。
LVS_EX_INFOTIPを設定し、LVN_GETINFOTIPで
ツールチップを表示していますが、
表示するまでにどうしても時間がかかるので、
別のスレッドに分けました。
しかし、別のスレッドで処理を終えた後、
ツールチップを表示させることができません。

TTM_UPDATETIPTEXTとTTM_TRACKACTIVATEで表示できるのですが、
以降LVN_GETINFOTIPが来ないので、さらに困ったことに。

何か良い方法はないでしょうか?
601デフォルトの名無しさん:2007/02/04(日) 23:48:51
なんか標準コントロールを色々使ってみて出した結論。
完全に自作した方が楽だった。
602デフォルトの名無しさん:2007/02/05(月) 00:50:56
>>599
全然解決してないよそんな対処法!
なんでそんな横着なの?
603デフォルトの名無しさん:2007/02/05(月) 00:52:22
そもそも、DirectSoundはCだけで使えるしw
604デフォルトの名無しさん:2007/02/05(月) 01:31:10
でも、CよりもC++のほうが書きやすいのもまた事実。
605デフォルトの名無しさん:2007/02/05(月) 02:17:58
>>599
DirectSound周りだけC++にしてCのコードから呼び出す関数だけextern "C"つければいいやん
606デフォルトの名無しさん:2007/02/05(月) 08:31:18
いや、そこまでC++を避けなくたっていいだろ。
607600:2007/02/05(月) 20:46:07
>>601
やっぱりそうですか。
自作となるといろいろやることが多くて、
できれば標準のものが使えればいいんですけどね〜。
608デフォルトの名無しさん:2007/02/05(月) 21:10:32
ライブラリパスの追加方法
#pragma comment (linker, "/libpath:..\libdir")
は見つかったんですが、同様(似たような)の方法でインクルードパスを
追加する方法ってありませんか?
609デフォルトの名無しさん:2007/02/05(月) 21:17:31
GetGlyphOutlineを使用しているのですが、SystemやTerminalなどのフォントでエラーを返してしまいます。
エラーを返してしまうフォントかどうかを判別するにはどうすればいいでしょうか?
「システムフォント」や「デバイスフォント」など区別の仕方が沢山あってどうも混乱してしまいます。
デバイスフォントであればEnumFontFamExProcの引数FontTypeでDEVICE_FONTTYPEが立っているかどうかで判別できるのですが・・・
詳しい方ご教授よろしくお願いします。
610デフォルトの名無しさん:2007/02/05(月) 21:22:35
WinInetでFTP転送を行うソフトを昔作ったんだけど
今度サーバーがSSHになったら動かなくなってしまいました。

なんかこう、コンポーネントかなんか入れてちょっとした改造で
動くようになりませんかね?
絶対無理?
611デフォルトの名無しさん:2007/02/05(月) 21:49:26
それは冗談で言っているのか(AA略
612デフォルトの名無しさん:2007/02/05(月) 21:57:59
冗談に決まってるだろ。
実情知ったら青ざめるに尻毛100本。
613610:2007/02/05(月) 22:07:42
冗談じゃないっす…
>>612の尻毛を抜かせてもらいます
614デフォルトの名無しさん:2007/02/05(月) 22:14:51
>>609
GetGlyphOutline()ってTrueTypeだけだから
tmPitchAndFamily & TMPF_TRUETYPEでいいんじゃない
615デフォルトの名無しさん:2007/02/05(月) 22:17:38
>>610
INTERNET_FLAG_SECURE
616デフォルトの名無しさん:2007/02/05(月) 22:18:33
それSSL
617デフォルトの名無しさん:2007/02/05(月) 22:21:20
>>610
サーバーをちょちょっといじって、ftpサーバー立てれば?
618デフォルトの名無しさん:2007/02/05(月) 22:38:01
pscpとかpsftpとか使えばいいじゃん。
619デフォルトの名無しさん:2007/02/05(月) 22:49:00
GetDCを2連荘で呼んだらReleaseDCも2連荘で呼ばなければなりませんか?
620610:2007/02/05(月) 22:49:38
おっと失礼、FTPでなくてHTTPでした
ソース見直したらInternetReadFile使ってた

商品なので、フリーのソフトとかつけられないんです
ごっそり改造だと金かかるしなー
正直にちょっと直すくらいじゃむりぽと言ってしまうのが正しいか
621デフォルトの名無しさん:2007/02/05(月) 22:53:23
>>619
必要がなくなった時にReleaseDC(解放)すればいいんじゃない?
DCリソースが不足気味ならこまめに解放しないといけないが
622デフォルトの名無しさん:2007/02/05(月) 22:53:52
ぬるぽ
623デフォルトの名無しさん:2007/02/05(月) 22:59:01
>620
じゃあ本家のssh付ければいいじゃん。
http://www.ssh.com/products/client-server/features_benefits.html
624デフォルトの名無しさん:2007/02/05(月) 23:00:45
>>608
Win32APIと関係ない
625610:2007/02/05(月) 23:11:37
>>623
正式なのがあるんですね。買ってもらえるか打診してみます
つーかその前に、機能変わらないのに改造だけで開発費だしてもらえるかどうかが問題だけど
626デフォルトの名無しさん:2007/02/05(月) 23:31:03
>>619
取得したhdcをどうしてるのかしらないけどタスクマネジャ-でGDIオブジェクト数確認したほうが良い
vectorとかにはそういうツールが蔓延してるけどな

system("pause");
HDC hdc1 = GetDC(NULL);
system("pause");
HDC hdc2 = GetDC(NULL);
system("pause");
 ReleaseDC(NULL, hdc1);
system("pause");

627デフォルトの名無しさん:2007/02/05(月) 23:49:25
unixのexec()みたいなことはWin32APIではできないの?
628デフォルトの名無しさん:2007/02/05(月) 23:53:10
CreateProcess()の何が不満だ
629デフォルトの名無しさん:2007/02/05(月) 23:59:31
>>628
プロセスIDが別になること。
子アプリをラップしたいんです。
630デフォルトの名無しさん:2007/02/06(火) 00:11:01
プロセスIDが別になると、子アプリをラップするのに何の不都合が?
631デフォルトの名無しさん:2007/02/06(火) 00:14:26
job使えば?
632デフォルトの名無しさん:2007/02/06(火) 00:14:58
>>630
親が子プロセスIDで操作しても、孫に効かない。
633デフォルトの名無しさん:2007/02/06(火) 00:15:47
win32_forkの実装を、ドライバとかにもったうえで、そいつが
exec対象のEXEをでがんばって読み込んで、現在実行中の
プロセスを書き換えてやれば実現出来るような気もする。

ちなみにcygwinでは諦めた、という話があるな。
http://www.sixnine.net/cygwin/translation/cygwin-ug-net/highlights.html
>Win32 の元では実際の exec を行う方法が存在しないため、
>Cygwin は独自のプロセス ID(PID)を考案しました
634デフォルトの名無しさん:2007/02/06(火) 00:58:34
プロセスじゃなくてスレッドを使ってみるとか・・・
635デフォルトの名無しさん:2007/02/06(火) 01:07:48
>>632
具体的に子プロセスに対して"何"をしたいのよ?
その中身にもよるけど、Windowsじゃ難しいような気がする。
636デフォルトの名無しさん:2007/02/06(火) 01:09:35
>>632
子プロセスを変更することが出来るなら、
ファイル マッピング オブジェクトに孫プロセスのプロセスIDを書きこむようにして

|プロセスの深さ|子プロセスID|孫プロセスID|...|

(操作するプロセスID) = (プロセスIDリスト) [ (プロセスの深さ) ]

ってな具合にすればいいんじゃないだろうか
637デフォルトの名無しさん:2007/02/06(火) 01:12:02
ファイルマッピングとか、とにかくプロセスが複数絡むと
デバッグが異様にやりづらくなるんだよなあ……
638デフォルトの名無しさん:2007/02/06(火) 06:08:49
InterixのアプリってWin32からは操作できないんだっけ?
639デフォルトの名無しさん:2007/02/06(火) 07:18:19
子プロセスが勝手に子プロセスを産んでも処理できる、
そのためのJobObjectじゃないのか。
640デフォルトの名無しさん:2007/02/06(火) 10:50:03
ファイルマッピングオブジェクトのソースコードを書いてみたのですが、
初めて書いたのでエラー処理で足りない部分があれば教えて頂けないでしょうか?
ちなみに 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 で表示される値が変更される仕様です
641640:2007/02/06(火) 11:04:19
>>640 は MapViewOfFile が失敗した時に CloseHandle するのを忘れていました。

他に問題点があれば指摘して下さい。
642デフォルトの名無しさん:2007/02/06(火) 11:34:23
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win73.html
>この関数(SetCursor)は WM_MOUSEMOVE が発生するたびに呼び出すのが一般的です
とありますが、元に戻ったりでチラついてしまいます。
領域内に触れたとき一時的にマウスカーソルを変更したいのですが、
ちらつかないようにする方法を教えてください。お願いします。
643642:2007/02/06(火) 11:38:31
×元に戻ったり
○点滅したり
644デフォルトの名無しさん:2007/02/06(火) 11:43:46
>>642
SetCursor 部分を削除するか、WNDCLASS の hCursor を NULL にするかでいいんじゃないかな?

WNDCLASS の hCursor が NULL 以外の時は、
システムが以前のカーソルを復元しようとするらしいので、
それが原因でちらついていると思われる。
645642:2007/02/06(火) 12:04:58
>>644
>SetCursor 部分を削除するか
元に戻そうとするメッセージをですか?
646デフォルトの名無しさん:2007/02/06(火) 12:08:10
1.Windowsの再生デバイスの設定(デフォルト)を変更する方法ってありますか?
(waveOutOpenでWAVE_MAPPER指定したときに、再生先が変わってほすぃ)

2.waveOutOpenでデバイス指定して、ADPCM再生する方法って?
(ACM?? 手順がわからない... ソース乗ってる解説サイトとかありますかね...)

よろしく...
647642:2007/02/06(火) 12:17:19
>>644
できればクラスを再定義せず変更したいので、
前者の方法を教えてください。
マウスが動いたりクリックする度にSetCursorを送るメッセージがあるのだと
思っていたのですが、違っていたらすみません。
648デフォルトの名無しさん:2007/02/06(火) 12:24:17
まずはやってみようぜ…?
649デフォルトの名無しさん:2007/02/06(火) 12:35:33
>>642
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win73.html
のソースコードを一切書き換えずに実行してみればいい
650642:2007/02/06(火) 12:39:21
>>648-649
申し訳ありません。本当に勘違いでした。
NULLにしたらカーソルが表示されないのかと思ってたらしいです。
ご迷惑おかけしました。
ありがとうございます。
651デフォルトの名無しさん:2007/02/06(火) 12:40:56
FreeLibraryを対象になるDLL側から禁止することは無理ですか?

DLL_PROCESS_DETACHでFALSE返しても結果には影響しないようだし
DllMain - DLL_PROCESS_DETACH内で待機関数使ってスレッドとめることも状況的にできない
ロードされた側のFreeLibrary自体をいじればなんとかなると思うけど大掛かり過ぎるし…
652デフォルトの名無しさん:2007/02/06(火) 12:49:40
普通に考えて、FreeLibrary()してもデタッチされないDLLって
半分ウイルスみたいなタチの悪い代物になると思う。
FreeLibrary()をフックするしかないんじゃない?
既にアタッチされてるのが前提なら一般的なAPIフックより少しは楽。
653デフォルトの名無しさん:2007/02/06(火) 12:56:07
>>652
基本的なトリックでアンロードの拒否ができればいいなーとおもったんですが
やっぱそうなりますか

即答どうもです
654デフォルトの名無しさん:2007/02/06(火) 12:59:35
>>651
自分自身を LoadLibrary すりゃいいんじゃね?
655デフォルトの名無しさん:2007/02/06(火) 13:20:38
>>654
どうも。
一瞬すごい これだ! と思ったけどいろいろ問題ありで怖いんで
素直にFreeLibをフク-するか、所詮自分様専用ってことであきらめるかしますわ 
656デフォルトの名無しさん:2007/02/06(火) 13:39:15
マ板の69式のおっさんを呼び込むスレからきました
657デフォルトの名無しさん:2007/02/06(火) 13:54:14
>>495
実は方法ある
詳細についてはMSのページに長いコードがあるから割愛するけど
簡単に言えばデフォルトで裏側にウィンドウを表示しているのを表側に表示するコードを書くだけ
たったこれだけなんだけどコードはえらく長い
658627:2007/02/06(火) 14:11:38
>>635
タスクスケジューラではWindowStyleが指定できないので、
CreateProcessを被せればよいかなと思ったのですが、
そうすると今度は「タスクの終了」が孫に効かなくなるので、
なんかいい方法はないものかと。。。
659デフォルトの名無しさん:2007/02/06(火) 15:09:31
>>658
CreateProcess で開いたハンドルを保持しておいて、
SetConsoleCtrlHandler 使ってプロセスが終了したときに
ExitProcess するようなコードを書けばいいと思う。
660デフォルトの名無しさん:2007/02/06(火) 17:59:30
>>655
モジュールの参照カウントをあげておけばアンロードされない
自身でLoadLibraryしてもいいし、GetModuleHnadleでもいいんじゃないかと
661デフォルトの名無しさん:2007/02/06(火) 18:01:14
GetModuleHandleはダメだと思うよ。
662デフォルトの名無しさん:2007/02/06(火) 18:02:45
GetModuleHandleは参照カウント増やさないだろ
663662:2007/02/06(火) 18:03:28
被ったorz
664627:2007/02/06(火) 19:07:41
>>659
SetConsoleCtrlHandleはコンソールアプリでないと駄目なのでは?
[親(スクスケジューラ)]->[子(CreateProcess)]->[孫(アプリ/バッチ)]
子はコンソールアプリでないウィンドウアプリ(ウィンドウなし)
の関係を考えています。なんか無理そうですね。諦めモード。
665デフォルトの名無しさん:2007/02/06(火) 19:11:37
だから、ジョブオブジェクトは何の不満があるのか
666デフォルトの名無しさん:2007/02/06(火) 19:13:18
GetModuleHandleって参照カウント上げなかったっけか。失礼
667デフォルトの名無しさん:2007/02/06(火) 19:14:17
ジョブの入れ子にすればいいじゃん
668デフォルトの名無しさん:2007/02/06(火) 19:29:30
タスクスケジューラーってタスクをジョブオブジェクトで管理してるの?
(.job に対応する job object じゃない方のジョブオブジェクト)
669デフォルトの名無しさん:2007/02/06(火) 19:38:00
ラッパを生かし続けてて、タスクスケジューラの終了メッセージで
子供を殺せばいいんじゃね?
670627:2007/02/06(火) 21:10:11
>>665
すみません。ジョブオブジェクト調べてみましたが、
これでどうやってできるのか分りませんでした。
unixのプロセスグループだと、プロセスグループリーダが死ぬと、
みんな巻き添えになったような気がしますが、
ジョブオブジェクトにもそういう仕組みがあるのでしょうか?

>>669
ですね。非表示のウィンドウを使えばいいみたいです。
671651:2007/02/06(火) 21:16:28
具体的な問題をいうと、MSGBOXをIATの書き換えとDLLでフックしてるところ、
そのフック関数の最中にDLLがアンロードされてしまうと、
フック関数がぬるぽを参照することになって落ちるという状態です。

再LoadLibraryだとアンロードされないんじゃなくて
アンロードされて、新しい再配置なインスタンスになるんでアドレスが違ってしまって、
フック関数のアドレスを正しく引きつぎできない。

相当乱暴に自身へのFreeLibraryは常にFALSEを返して
FreeLibrary経由しないDLL_PROCESS_DETACHでは、
まあ、面倒くせーから状況見て待機させちゃうか、強制的にmsgboxから制御奪うかなって感じでいますが、

>>670
CreateJobObjectしてそいつにプロセスを追加してく
殺すときはTerminateJobObjectって流れ
672デフォルトの名無しさん:2007/02/06(火) 21:20:40
>>671
DllMain で即 LoadLibrary して、ロードしたモジュールの方の関数でフックすれば良いよ。
ってか漏れがやったときは単に LoadLibrary でOKだったけどなぁ・・・
673デフォルトの名無しさん:2007/02/06(火) 21:22:44
DETACHされたときにIATを戻してやれよ・・・
674デフォルトの名無しさん:2007/02/06(火) 21:26:38
>>673
フックの種類によってはまさに置き換えたコードを実行中ということもあるので、
アンロードされないようにすることもある。

>そのフック関数の最中にDLLがアンロードされてしまうと、
>フック関数がぬるぽを参照することになって落ちるという状態です。
675デフォルトの名無しさん:2007/02/06(火) 21:36:22
大半のAPIなら瞬間的に制御が帰るので気づかなかったんですが
>>674のとおりです

>>672
できました。感動です。
DLL_PROCESS_DETACHでLoadLibraryしたときに再配置になって、
初回のアタッチのときなら再配置じゃなくてカウントあげになるみたいです
うだうだお騒がせしました
676デフォルトの名無しさん:2007/02/06(火) 22:30:12
>>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.
677デフォルトの名無しさん:2007/02/06(火) 22:52:44
>because this may create dependency loops in the DLL load order.
678デフォルトの名無しさん:2007/02/06(火) 23:07:54
>>676
いや、今回はまさに、dependency loopとやらをでっち上げたいんだが。

無駄知識
LoadLibraryしまくって、参照カウンタを最大までインクリメントすれば、絶対にアンロードされない
ttp://blogs.msdn.com/mgrier/archive/2005/06/18/430522.aspx
679デフォルトの名無しさん:2007/02/06(火) 23:14:37
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") とやると嵌まるよ、ということ。

今回明らかに問題ない。
680デフォルトの名無しさん:2007/02/06(火) 23:42:37
>>642
> WM_MOUSEMOVE が発生するたびに呼び出すのが一般的
ってマジか? そのためのWM_SETCURSORだと思ってたのだが
681デフォルトの名無しさん:2007/02/06(火) 23:43:55
GetModuleHandleExならデフォルトで参照カウント上げるし
絶対アンロード不可能にするオプションもあるな。Windows XP以降でしか使えないけど
682デフォルトの名無しさん:2007/02/06(火) 23:47:38
>>642
クライアント領域に入ったらこのカーソル、みたいな感じならば
WM_SETCURSOR のハンドラで SetCursor する。

アプリで任意のタイミングで変えたいのなら、
それ+任意のタイミングで SetCursor する。

ちらつくのは多分WM_SETCURSORでの処理を忘れているため。
WM_MOUSEMOVEで常に SetCursor しているなら、
WM_SETCURSOR では単に return 0L するだけでもよい。
683デフォルトの名無しさん:2007/02/07(水) 00:08:09
perlでデフォルトプリンタ名を取得したいのですが、

use Win32::API;
$pr = new Win32::API('winspool.drv', 'GetDefaultPrinter', '', 'P');
print $pr->Call();

どこがおかしいですか?
684デフォルトの名無しさん:2007/02/07(水) 00:59:38
use Win32::API;
$GetDefaultPrinter = new Win32::API('winspool.drv', 'BOOL GetDefaultPrinter(LPTSTR, LPDWORD)');
$pszBuffer = ' ' x 200;
$pcchBuffer = length($pszBuffer);
$GetDefaultPrinter->Call($pszBuffer, $pcchBuffer);

試してないが。
68569式オサンクローン ◆4E1yVnBRhg :2007/02/07(水) 01:18:53
ここはデバドラの質問もあり?
686デフォルトの名無しさん:2007/02/07(水) 01:26:39
【WDM】Windows Driver Model相談室【デバドラ】
http://pc10.2ch.net/test/read.cgi/tech/1063453024/l50
687683:2007/02/07(水) 02:07:23
>>684

ありがとうございます。
残念ながら、動きません。


688640:2007/02/07(水) 02:11:05
>>640 には >>641 以外の問題なしということでOKでしょうか?
問題が出るほど大きなコードではないと思うけど・・・
689683: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;
690デフォルトの名無しさん:2007/02/07(水) 06:54:40
まだまだ、各サイトにあるWin32APIのサンプルを書き換えて
プログラムの練習をしているレベルの質問者です。

CreateDialogで作ったダイアログにテキストを描画したいと思っています。
プログラムの結果を表示するためなのですが、何か参考になるサンプル
プログラムがサイトか、理解の手がかりになるAPIなどを教えてください。

まだまだ、理解が浅いので描いたコードがまずいのですが、DrawTextで
描画するようなコードを書いてみたらエラーで落ちてしまいました。
691デフォルトの名無しさん:2007/02/07(水) 09:01:28
CreateWindowで作るウインドウのタイトルバーをなくしたいのですが、
リージョンで表示させない以外に何か方法はありますか?
タイトルバーをなくしたいのは自作のウインドウだけです。
よろしくお願いします。
船場合気道同好会(覚醒剤中毒)元龍貴Contact ◆MasterNNok
http://sports10.2ch.net/test/read.cgi/budou/1144120516/401-500
http://sports10.2ch.net/test/read.cgi/budou/1149945436/801-900
http://sports10.2ch.net/test/read.cgi/budou/1165146415/301-400
嘘で合気会・合気道三段を名乗り経歴詐称して2ch住人から5年間で合計
数百万円猫糞し トンヅラしている覚せい剤ジャンキーです。 この男を見つけたら110番
主催している段位詐称詐欺武道 反射道 http://homepage2.nifty.com/hanshado/
<<<連絡先 奈良県警吉野署生活安全課 熊代刑事>>>
http://news21.2ch.net/test/read.cgi/news2/1155668899/677
■覚せい剤中毒・元龍貴(反射道)が投稿規制をかける秘密のURL(笑)
※スレ内では「合気道三段」となっている証拠、二重リンクしておきます。
※HNは、ウサで登場 http://bbs.2ch2.net/test/read.cgi/sns/1161301239/l
■偽合気道有段者の有料詐欺講習会証拠「ウロコを落とせ!」(参加費一日最高8000円)
※HNは、HAJIMEのすけ、天下無敵、万有愛護、合気バカ一代などで登場
http://sports.2ch.net/budou/kako/1015/10154/1015423701.html
http://sports.2ch.net/budou/kako/1024/10242/1024232697.html
http://pc.2ch.net/ad/kako/1015/10155/1015559182.html
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
元龍貴(はじめ りゅうき)を合気道経歴詐称・覚醒剤取締法違反で逮捕する場所
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■元龍貴の現住所 大阪市中央区南船場1-14-7 アインズ南船場306
http://maps.google.co.jp/maps?q=%E5%A4%A7%E9%98%AA%E5%B8%82%E4%B8%AD%E5%A4%AE%E5%8C%BA%E5%8D%97%E8%88%B9%E5%A0%B41-14-7
■本籍地 神戸市長田区苅藻通4丁目15■生年月日 昭和36年8月3日生
■前住所 奈良県吉野郡川上村寺尾533−1(奈良県警吉野署熊代刑事も驚愕)
693デフォルトの名無しさん:2007/02/07(水) 09:04:13
Window の Style を良く見れ。
694デフォルトの名無しさん:2007/02/07(水) 10:08:16
>>690
Dialogならstaticかeditを乗っけて、SetWindowTextで設定するのがいいかも
695デフォルトの名無しさん:2007/02/07(水) 11:22:10
>>693
Styleの項目を一つ一つ試してみました。
勉強不足で恥ずかしい限りです。
ご助言をありがとうございました。
696デフォルトの名無しさん:2007/02/07(水) 12:16:14
APIについての質問ではないのですが・・・

VC2003付属のヘルプ(Document Explorerかな)で、SDKを閲覧する際、
文章中のリンクをクリックすると、10秒程待たされるのですが、これは正常ですか?
読む気が失せてしまうので、スラスラ読みたいのですが・・・
697デフォルトの名無しさん:2007/02/07(水) 12:34:54
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で文字を送る方法を教えてください。
お願いします。
699デフォルトの名無しさん:2007/02/07(水) 14:38:08
DLG_LABEL が -1 (or 65535) になっていないことを resource.h で確認したうえで、
(-1 or 65535 ならば、衝突しないユニークな値に書き換える)

SetDlgItemText( <ダイアログの hwnd>, DLG_LABEL, <変更文字> );
700デフォルトの名無しさん:2007/02/07(水) 15:21:40
>>699 のSetDlgItemTextは、GetDlgItem + SetWindowText の機能だから、
一応、GetDlgItem() も参考にな
701デフォルトの名無しさん:2007/02/07(水) 15:40:24
>>699-700
ありがとうございます。
無事にできました。

自分で調べたときにはGetDlgItem()+ SetWindowText までは行っていたのですが、
なぜか失敗をしていました。
ヘッダファイルが読み込まれておらず、DLG_LABELがdefineされていなかったようです。
ご助言で気づけて助かりました。
702デフォルトの名無しさん:2007/02/07(水) 23:35:18
ロケットマウスで、文字列の貼り付けという機能があるのですが、この機能はEXSELやTEXT EDITORに
あらかじめ設定しておいた文字列を貼り付けることが出ます。
WindowsAPIにはクリップボード関連のAPIがあるのですが、クリップボードからデータを取得など、微妙にピントがずれたAPIしか見つけられませんでした。
良い方法がありましたら教えてください。よろしくお願いします。
703デフォルトの名無しさん:2007/02/07(水) 23:39:32
何をしたいの?
704デフォルトの名無しさん:2007/02/07(水) 23:46:50
たとえば、事前にクリップボードに文字列を入れておき、ソフトウェアで一秒後にクリップボードに貼り付けを行うソフトを作りたいです。
クリップボードの貼り付け先は、不特定多数のアプリケーションです。
705デフォルトの名無しさん:2007/02/07(水) 23:47:23
??
706デフォルトの名無しさん:2007/02/07(水) 23:53:14
クリップボード「から」貼り付けじゃなくて?

日本語がわからん
707デフォルトの名無しさん:2007/02/07(水) 23:57:59
クリップボードの内容をリアルタイムで更新したいのか?
Synthesized Clipboard Formatsで何とかしろ。
708デフォルトの名無しさん:2007/02/08(木) 00:00:12
ごめんなさい。変な日本語でした。

たとえば、事前にクリップボードに文字列を入れておき、ソフトウェアで一秒後にクリップボードの内容を
不特定多数のアプリケーションに貼り付けを行うソフトを作りたいです。

貼り付け先は、ユーザーが事前にカーソルを合わせ、待機します。
709デフォルトの名無しさん:2007/02/08(木) 00:03:43
>>706
クリップボード「から」です。
すみません。
710デフォルトの名無しさん:2007/02/08(木) 00:11:33
WM_PASTEでも送ってやれば?
711デフォルトの名無しさん:2007/02/08(木) 00:14:01
それかも!!
アドバイスありがとうございます。
712デフォルトの名無しさん:2007/02/08(木) 00:17:31
>>710
まさにそれでした。
ありがとうございました。
713デフォルトの名無しさん:2007/02/08(木) 05:56:24
わざわざクリップボードを使う意味がわからんけどまぁ関係ないからどうでもいいや
714デフォルトの名無しさん:2007/02/08(木) 09:41:35
フォルダ選択ダイアログで、パスを取得することはできたのですが
そのパスを使ってファイルの保存先を変更するときに、「¥」が一つしかついていないので
パスとして認識されません
どうしたらいいのでしょうか?

BrowseInfo構造体
SHGetPathFromIDList
など使用しました
715デフォルトの名無しさん:2007/02/08(木) 09:49:49
>「¥」が一つしかついていないので
うーん、何が言いたいのか分かるような分からないような・・・

C/C++の文字列リテラルのエスケープ文字を勘違いしてない?
716デフォルトの名無しさん:2007/02/08(木) 10:04:46
例えば、フォルダ選択ダイアログで「D:\program\log」というパスが
取得できたとします
これをそのまま保存先のパスにすると、\がエスケープ文字として認識されてしまいます
なので、「D:\\program\\log」のようなパス名になるようにしたのですが・・・
説明が下手ですいません
717デフォルトの名無しさん:2007/02/08(木) 10:12:35
ホームラン級の馬鹿ですか?
718デフォルトの名無しさん:2007/02/08(木) 10:21:19
× パス名になるようにしたのですが・・・
○ パス名になるようにしたいのですが・・・
719デフォルトの名無しさん:2007/02/08(木) 10:22:24
>>716
エスケープ文字がどういう代物なのか、よく考え直してください・・・
720デフォルトの名無しさん:2007/02/08(木) 10:23:36
> エスケープ文字として認識されてしまいます 

これは気のせい
721デフォルトの名無しさん:2007/02/08(木) 10:37:12
>>716
とりあえず失敗してるのは別の理由
エスケープ文字だと思い込んでるから、本当の理由を調べられない
722デフォルトの名無しさん:2007/02/08(木) 11:27:38
みなさんありがとうございます
文字列中に「\」があると、それがエスケープ文字と解釈されてしまうので
文字「\」を文字列定数の中に指定したいときは「\」を2つ並べて
「\\」のように書く必要がある、という解釈は間違っているのですか?

L""で囲んでみましたがダメでした
723デフォルトの名無しさん:2007/02/08(木) 11:30:31
>>722
そういうソースで "" で囲まれた文字列は \ をエスケープするが
フォルダ選択ダイアログで取得した文字列は関係ない。
724デフォルトの名無しさん:2007/02/08(木) 11:42:38
フォルダパスをINIファイルに保存していたのですが
それを取得し、Log.txtを末尾にくっつけるところで""を用いていたのが原因でした
strcatでそのまま結合したらできました
ありがとうございました
725デフォルトの名無しさん:2007/02/08(木) 15:20:46
pugya-
726デフォルトの名無しさん:2007/02/08(木) 18:21:49
メニューをoffice風する方法を教えてください
727デフォルトの名無しさん:2007/02/08(木) 18:22:36
728デフォルトの名無しさん:2007/02/08(木) 18:27:30
どーせcodeguruとかcodeprojectにあるんじゃねーの
729デフォルトの名無しさん:2007/02/08(木) 18:44:37
オーナードローで激しくやってんじゃない?
専用のライブラリか下手したら別言語でさっくり作ったりしてるのかも試練が
730デフォルトの名無しさん:2007/02/08(木) 18:45:37
WPFとか
731デフォルトの名無しさん:2007/02/08(木) 20:25:33
MSはオーナドロー大好きっ子
Win95時代のOfficeでグラデ付きタイトルバー使ってたり
732デフォルトの名無しさん:2007/02/08(木) 20:42:42
.NET Framework 2.0使えば普通にできるよ
Win32APIだけでやりたいならオナードローしてください
733デフォルトの名無しさん:2007/02/08(木) 20:49:58
.NET Framework
Cに慣れた俺にはアー
最初からNET覚えとけばよかったorz
734デフォルトの名無しさん:2007/02/08(木) 20:56:15
新たにインスコするのが嫌なのでWin32api
735デフォルトの名無しさん:2007/02/08(木) 21:04:12
ダイアログなどウィンドウで親に乗っているコントロールだけアルファ255で
親を透過したいのですが、どのように行えば委員でしょうか。
UpdateLayeredWindowに32ビットDIBを持たせてピクセルごとにアルファを
管理できるところまで調べたのですが、コントロールが表示されない?ので
それ以上の描画が出来ません。
WM_PRINTを投げてみたりもしましたが非対応な模様。
レイヤードウィンドウの子ウィンドウをレンダリングする方法など無いのでしょうか?
736デフォルトの名無しさん:2007/02/08(木) 21:11:42
コントロールをDIBに出力しない限り無理。
737735:2007/02/08(木) 21:16:02
>>736
>コントロールをDIBに出力しない限り無理。
ごもっとも。出力したいです。
自前で書けってことですか?
738デフォルトの名無しさん:2007/02/08(木) 21:27:10
自前でやる場合にはテーマAPIを使うのが常道。

BeginPaint、EndPaint、GetDC、ReleaseDCをAPIフックしてオフスクリーンに
書かせてもいいかも知れない。この場合でも、文字列が描画される際に文字ある
のところは背景も塗られるが、空白のところは何の描画もなしとか、その辺の
不具合があるのである程度は自前でやる必要も出てくると思う。
739デフォルトの名無しさん:2007/02/08(木) 21:28:58
>>726
.NET Framework 2.0のSystem.Windows.Forms.MenuStrip
このスレでこの答えはないか。
740デフォルトの名無しさん:2007/02/08(木) 21:55:47
mscoree呼んでCLRホスティングしろということですね!
741デフォルトの名無しさん:2007/02/08(木) 23:36:46
C#やってみたら、アプリが劇的に簡単に作れてしまって。
今までやってたC++やWin32apiって、何だったんだろうかと。
もうたぶんこの世界に戻ることは無いだろうな。
742デフォルトの名無しさん:2007/02/08(木) 23:41:24
C#でも細かいことをしようとすればWin32APIを使います
743デフォルトの名無しさん:2007/02/08(木) 23:41:27
ガリガリSDKのメリットだってあるさ
744デフォルトの名無しさん:2007/02/08(木) 23:46:00
>>741
むしろC#は不安じゃない?
745デフォルトの名無しさん:2007/02/08(木) 23:50:15
ちょっと質問。

テキストエディトの入力を消去したいときってSendMessageで何のメッセージを
送ればいいんでしょうか?
746745:2007/02/08(木) 23:51:30
馬鹿か俺は・・・・
SetWindowTextの存在をすっかり忘れてたorz
747デフォルトの名無しさん:2007/02/08(木) 23:53:01
713さんの言うように、もっと良い方法ありましたら、教えてください。
よろしくお願いします。
748デフォルトの名無しさん:2007/02/08(木) 23:55:25
自分のバカさに1分15秒で気づいた>>745のお話でした。

749デフォルトの名無しさん:2007/02/09(金) 00:21:41
される側にとっては迷惑か、ノイズだけど
ひとに問題点を説明するその途中で
「あ、わかった、やっぱもういい。ありがとう」ってのはよくある
750デフォルトの名無しさん:2007/02/09(金) 00:22:16
質問させて下さい。

//..
chocolate choco = Valentine(ore);

と、バレンタイン関数を呼び出してみたのですが・・・
何度やっても戻り値に NULL が返ってきます!

どうしてなんですか? 教えて下さい><
751デフォルトの名無しさん:2007/02/09(金) 00:25:56
>>749
あと、される側にとってははなはだ迷惑だけど
ひとつの問題点を質問した後に回答前に
解決法を見つけてしまうこともある。
「さんざん探した後なのに・・・」
752デフォルトの名無しさん:2007/02/09(金) 01:05:02
>>750 処理系依存
753デフォルトの名無しさん:2007/02/09(金) 01:46:02
>>746の評価できる点は質問に対する解答をレスにつけてたこと。

自己解決したら何も書かない奴が結構いるからな。
754デフォルトの名無しさん:2007/02/09(金) 06:25:26
CreateDialogで作ったダイアログの表示を親ウインドウの後ろにするには
どうしたらよいでしょうか?
親ウインドウのハンドルをNULLにするとタスクバーのところにダイアログの
名前が出てしまいます。
SetWindowLongでタスクバーに表示しないように設定するのでしょうか?
それとも、他に方法があるのでしょうか?

SetWindowLongのスタイルを色々と試しているのですが、見つけることが
できませんでした。
755デフォルトの名無しさん:2007/02/09(金) 06:54:51
すみません、自己解決しました。
ダイアログのリソースにEXSTYLE WS_EX_TOOLWINDOWを追加して、
CreateDialogで親ウィンドウのハンドルをNULLにしました。

これで良かったのでしょうか?
もし、こうするほうが安全とか、こっちのほうが良いとかありましたらお教えください。
756デフォルトの名無しさん:2007/02/09(金) 12:28:44
VC++でプログラムを書いております。
非コンソールのプログラムで、
コンソールウィンドウの表示のさせ方と、
そこへの文字の出力の仕方を教えてください。

よろしくお願いします。
757デフォルトの名無しさん:2007/02/09(金) 12:31:31
AllocConsole()かな
758デフォルトの名無しさん:2007/02/09(金) 12:47:21
>>756
CreateProcessでcmd.exeを起動させWriteFile関数で書き込めばいい

759756:2007/02/09(金) 12:57:20
>>757 さん
>>758 さん
ありがとうございます、自分のプロセスで出したかったので
次のようにやりました。
たすかりましたー^^/

AllocConsole();
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
printf("本日は晴天なり");
760デフォルトの名無しさん:2007/02/09(金) 14:58:37
ダイアログにSTATICを貼り付けてテキストを表示しようとしています。
スタイルにSS_LEFTを入れているのですが、スペースがあると
適当なところで折り返してくれるのですが、スペースがないと
折り返さずに行が途切れてしまいます。
何か対策とかはあるでしょうか?
761デフォルトの名無しさん:2007/02/09(金) 20:28:23
>>760
意図的に改行したいの?
したくないの?
762デフォルトの名無しさん:2007/02/09(金) 20:34:09
教えてください。
APIでlstrncmpなるものは無いのでしょうか?
763デフォルトの名無しさん:2007/02/09(金) 20:43:53
無い
764デフォルトの名無しさん:2007/02/09(金) 20:51:09
ありがとう
765デフォルトの名無しさん:2007/02/09(金) 21:05:04
>>762
もすかしてTCHAR対応がお望み?
766デフォルトの名無しさん:2007/02/09(金) 21:08:13
m$
は嫌いだが、クラッカーはもっと嫌い
767デフォルトの名無しさん:2007/02/09(金) 21:13:03
チーズつけるとうまい
768デフォルトの名無しさん:2007/02/09(金) 21:14:04
>>765
ちゃいます。ただなんとなく全てAPIで書きたかっただけですw
まあ、自作で作ってDLLにでも埋め込もうと思っていたのでちょうどよかったです
769デフォルトの名無しさん:2007/02/09(金) 21:29:34
ちっちゃいバイナリなあれか?
この辺MSがちょっとまとめてる
http://support.microsoft.com/kb/99456/ja 

StrCmpNとかもあるけどな
770デフォルトの名無しさん:2007/02/09(金) 21:43:18
ちっちゃいバイナリーってなんだよw
スーパバイザモードじゃなけりゃなにをやってもいいはずだろw
771デフォルトの名無しさん:2007/02/09(金) 21:54:24
ところで、ZeroMemoryがmemsetへの#defneだということを知っているか?
772デフォルトの名無しさん:2007/02/09(金) 22:12:04
へえ〜〜〜〜
>>771ってとっても物知りなんだんあ〜〜〜〜
きっと周りの人から尊敬されてて、「きゃーステキ!」とかいわれてるんだろうなあ。
いや〜〜〜、スゴイ・スゴイ。
773デフォルトの名無しさん:2007/02/09(金) 22:22:20
SendMessageのAとWってwParam,lParamに文字列設定するときのために必要だったんだな
文字列設定するわけでもないのになんでA,Wが用意されてるんだろうってずっと疑問に思ってた
774デフォルトの名無しさん:2007/02/09(金) 22:28:44
っ[チラシの裏]
775デフォルトの名無しさん:2007/02/09(金) 22:31:37
直接じゃなくてもLV_ITEMとか色々文字列つかうよね。
そんなことを疑問に思う人もいたってのは新鮮。
776デフォルトの名無しさん:2007/02/09(金) 22:34:51
>>771
処理系依存。
ZeroMemoryというAPIは存在するし、それを何に置き換えるかは開発環境次第。
memsetすら関数ではなくストリング転送命令に置き換えられてしまう場合すらある。
777デフォルトの名無しさん:2007/02/09(金) 22:40:28
>>776
Win32 API スレでは Windows SDK のヘッダまで含んで "Win32 API" と言っていいんじゃない?
mingw とか cygwin とかはモドキってことで。
778デフォルトの名無しさん:2007/02/09(金) 22:42:40
存在するのは、RtlZeroMemoryじゃないか?

そういや、CreateWindowは存在しないよな。
779デフォルトの名無しさん:2007/02/09(金) 22:48:50
ExitWindowsも無い
780デフォルトの名無しさん:2007/02/09(金) 22:54:55
EXitMicrosoft
あったらすぐ買う
781デフォルトの名無しさん:2007/02/09(金) 22:56:17
質問させて下さい
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) には動いてくれます
クラシックスタイルにすると動いてくれます
782デフォルトの名無しさん:2007/02/09(金) 23:03:00
誰か日本語に翻訳頼む
783デフォルトの名無しさん:2007/02/09(金) 23:03:54
WinFXは色々と変化してるらしい
784デフォルトの名無しさん:2007/02/09(金) 23:08:17
>>782
MoveWindowやSetWindowPosで、ウィンドウの右端座標(スクリーン座標)が 0 未満に
なるようにウィンドウを移動しようとしても、動いてくれません。これはなぜでしょう?

ヒント:
OS は Windows XP。クラシックスタイルにすると動く。
785デフォルトの名無しさん:2007/02/09(金) 23:29:37
愛情が足らんのだろう
786デフォルトの名無しさん:2007/02/09(金) 23:31:45
MSに文句言ったほうがイイカモな
787デフォルトの名無しさん:2007/02/10(土) 01:35:52
マルチモニタすればいいじゃない。
788781:2007/02/10(土) 10:41:17
>>784
ありがと

最大化されてなければ問題は無いのです
最大化されてると、左と上には動いてくれない
右と下には動いてくれるのに

マルチモニタにできないから仮想的に広げようとしたのだが

789デフォルトの名無しさん:2007/02/10(土) 11:25:54
仮想デスクトップ使えばいいじゃん
790デフォルトの名無しさん:2007/02/10(土) 11:50:18
稚拙な質問ですみません。
真っ黒に塗りつぶされたダイアログを作りたいのですが、方法がわかりません。
見つかるのはVCとかVBなどを使ったもので、直接Win32 APIをたたくものが
見つけられませんでした。
リソースを書いて設定する方法でもかまいませんので、方法があれば教えてください。
791デフォルトの名無しさん:2007/02/10(土) 12:03:44
>>790
WM_CTLCOLOR で HIWORD(lParam) が CTLCOLOR_DLG だったら
GetStockObject(BLACK_BRUSH) を返すとか。
792デフォルトの名無しさん:2007/02/10(土) 12:34:08
>>788
最大化させなきゃいいじゃない
793デフォルトの名無しさん:2007/02/10(土) 12:35:48
>>791
WM_CTLCOLORDLG じゃないか?
794デフォルトの名無しさん:2007/02/10(土) 12:56:54
>>791>>793
ダイアログのプロシージャで

case WM_CTLCOLORDLG:
return (long)GetStockObject(BLACK_BRUSH);

とすれば解決しました。
とても簡単な方法にたどり着けて感謝しています。
ありがとうございました。

795781:2007/02/10(土) 20:40:59
XPのバグだなこりゃ
クラシックスタイルなら全然問題無く指定した通り動いてくれるし
796デフォルトの名無しさん:2007/02/10(土) 22:26:17
発見したならちゃんと報告しとけよ
797デフォルトの名無しさん:2007/02/10(土) 22:52:10
クラシックスタイルのバグが直ったんだろ
798デフォルトの名無しさん:2007/02/10(土) 23:05:45
>788
最大化の時はデスクトップサイズ、というか、デスクトップにツールバーが追加されてから
その仕様が出来た。
ツールバーを含んだ領域を獲得するAPIがあるから、そちらから数値をもらってきてみな。
または、最大化を一時的に解除してから動かせば問題ない。

昔は幾らでもサイズ変更できたんだけどね。

799デフォルトの名無しさん:2007/02/11(日) 00:29:31
つーか最大化してるときにGetWindowRectしたらまともな値返ってこなかった気がするんだが
800デフォルトの名無しさん:2007/02/11(日) 01:26:10
GetWindowPlacement
801781:2007/02/11(日) 14:23:12
SystemParametersInfo()
getworkarea
だっけ?

というか、サイズはあんま関係無い気がする
最大化されてるとマイナス座標へは動いてくれない
元々画面からははみ出てて左上は(-4,-4)とかの座標なのに、それよりマイナスには行かないっぽい
クラシックスタイルもWin2Kも動いてくれるのに
802デフォルトの名無しさん:2007/02/11(日) 17:49:06
なにか目的があってMSDNとgoogle徘徊してたら一日終わってた
なにが目的だったのかは思い出せてない
かゆ うま
803デフォルトの名無しさん:2007/02/11(日) 18:58:16
初歩的な質問ですみません。
Win32APIで具体的に何ができるようになりますか。

テンプレにある、
- Win32 API入門
http://wisdom.sakura.ne.jp/system/winapi/
- Win32 プログラミング入門
http://www7.plala.or.jp/keny01/

このあたりをすべてやればvectorとかにあるフリーソフト並のものが作れるのでしょうか。
804デフォルトの名無しさん:2007/02/11(日) 19:04:07
タイトルバーでマウスのミドルクリック押したら
そのウィンドウを閉じる用なの作りたいのだけど
どうすればいいの?
805デフォルトの名無しさん:2007/02/11(日) 19:04:46
努力次第

その中の内容だけでと言うのなら無理だが、そこにある事をある程度理解し
必要な機能をGoogleで探して活用するなら可能。
手始めにそのサイトを覚えるのは悪くはない。

ただ、『Win32 API入門』には何箇所かソースの間違いがあった。
他のコードと見比べるなら発見できるので、勉強にはちょうど良いかもしれない。
基本的にはソースコードはそのまま使えて、動作が確認できるので
理解の手がかりにはなる。
806デフォルトの名無しさん:2007/02/11(日) 19:29:55
>>804
自分のウィンドウのタイトルバーがクリックされたら閉じるようにしたいの?
ならWM_NCMBUTTONDOWNとUPを捕まえて処理するだけ。
一般のウィンドウに対してやりたいのならマウスをフックする必要がある。
807デフォルトの名無しさん:2007/02/11(日) 19:38:09
>>806
後者です。
よければマウスをフックもう少し詳しくお願いします。
808デフォルトの名無しさん:2007/02/11(日) 19:46:20
ググってみたんかい?
806でもない俺が言うのもなんだが、ググって簡単にひっかかったぞ。
809デフォルトの名無しさん:2007/02/11(日) 19:52:36
ぐぐってトップに来るのは猫だけど、
かぶすたにも説明があるんで参考にするといい。
ttp://www.kab-studio.biz/Programing/Codian/index.html
ちょっと手を伸ばしてAPIフックかじったりすると面白いと思う。
そのうち用済みになる知識だけど。
810デフォルトの名無しさん:2007/02/11(日) 19:54:41
うるせーカス
811デフォルトの名無しさん:2007/02/11(日) 19:54:59
>>809
ありがとうございます。
これから読んでみようと思いますです。
812804:2007/02/12(月) 01:02:41
あかん。
出来たけどうごかへん、何が悪いのかもわからへん。
タイトルバー上での左Wクリック、右クリックアップ、中クリックアップをフックしようとしたのだけど
なぜか右クリックアップだけ全くとんでこなーい。
何度見直しても何が悪いのかわかんない。
そーすこーどアップするのでお願いだから何が悪いのか教えてけろ。
http://geiji.s10.x-beat.com/php/img/up524.zip
813質問:2007/02/12(月) 01:23:08
質問です。
長めなので3レスに分けます。

標準入力(コンソール,パイプなど)をバイナリモードで読めるだけ読んで、
即座に標準出力に出したいのですが、
ブロックせずに読めるバイト数が取得出来ず困っています。

※ 上を実現した後ストリーム加工処理を入れるつもりです。
  また、読めるバイト数が0の場合は、待機関数で待てるのが理想ですが、
  ブロックしてもかまいません。

オーバーラップIOでは、ブロックはしませんが
バッファが満たされるまで読めないので意味がありません。

recvやPeekNamedPipeも使用出来ませんでした。
814813 (質問続き):2007/02/12(月) 01:24:15
現在は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)
815813 (質問続き):2007/02/12(月) 01:24:49
DOSプロンプトで
  # (1秒おきに文字列を出力するexe名) | (今回作りたいexe名)

  # (今回作りたいexe名) < 10MB程度のファイル > 出力ファイル
のように使うプログラムで、「即座に出力」「それなりのパフォーマンス」を
両立させる手は何か無いでしょうか?
816デフォルトの名無しさん:2007/02/12(月) 01:44:27
ちょっと長めです。
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;
817815:2007/02/12(月) 01:46:08
で、何がいいたいのかというと。

もっと別で簡単なやり方が無いのかという事が知りたいのですが。
何かいい方法あれば、どうぞよろしく教えてください。
818デフォルトの名無しさん:2007/02/12(月) 01:52:03
うろ覚えだけど、それか、それに似た手段を
執らなくちゃいけなかったような気がする。
プロセスIDとウィンドウハンドルって繋がりなかったよなあ確か
819815:2007/02/12(月) 02:00:18
>>818
ふむ・・・

因みに断片的ですがサンプルです
http://zetubou.mine.nu/itoshiki/nozomu/zetubou4948.c
820815:2007/02/12(月) 02:03:18
呼び出し順としては

EnumProcessNameでリストボックスに列挙
TargetProcessIdで第一引数に紐付く名前を探してプロセスID取得
TargetWindowHandleでTargetProcessIdで取得したIDと同じ奴を探す

という感じになってます
821816:2007/02/12(月) 02:06:37
間違えてた・・・。
>>815 ×
>>816 ○
822デフォルトの名無しさん:2007/02/12(月) 05:45:53
>>812
適当なウィンドウのタイトルバーでクリックを繰り返してみて、
それをSpy++でよーく見ると分かる
(持っていないのならVectorかどっかで類似ソフトを調達してくること。
この類のものを作るときには必須)。
左ボタンを押したときに送られて来るメッセージは
確かに WM_NCLBUTTONDOWN だけど、
解放されたときは WM_LBUTTONUP になる。右ボタンも同様。
ウィンドウを動かしたりメニューを出したりするために
ウィンドウが勝手にマウスに SetCapture() するからだろう(多分)。
中ボタンなら(調べもせずに適当に書いた)>>806の通り
WM_NCMBUTTONUP でいいんだけどね。
いつもSetCapture() とセットで使ってたもんだから
恥ずかしながら今知ったよ。
823デフォルトの名無しさん:2007/02/12(月) 05:51:44
ウィンドウハンドルを指定して、そのウィンドウがアクティブか否かって言うのを見たいんですが、そのような関数ご存知でしょうか。
824デフォルトの名無しさん:2007/02/12(月) 06:01:17
「HWND フォーカスを持つ」とかでぐぐれば1分で見つかる
825デフォルトの名無しさん:2007/02/12(月) 09:35:45
>813
stdinの実体に応じて、手法を使い分けるしかなくね?
パイプなら、PeedNamedPipe で長さ調査、
ソケットなら、selectで読み込み可能か調査
コンソールなら、ReadFileで読んでみる(エンターキー押下で戻ってくる)

UNIXなら、みんなselectで待てるんだろうが。
826デフォルトの名無しさん:2007/02/12(月) 09:40:07
つ Cygwin
827デフォルトの名無しさん:2007/02/12(月) 10:41:17
Cygwinは>>825を内部でやってくれる
828デフォルトの名無しさん:2007/02/12(月) 10:59:48
>>816
そもそも前提が間違っている。
全てのプロセスがウィンドウを持っているわけではない。
ウィンドウを取得したいなら、最初からウィンドウのリストを取らないと駄目。
829816:2007/02/12(月) 11:21:11
>>828
その辺はEnumWindowProcの段階で見つからなかった場合のチェック
かかるようにしてるんでハンドルを持ってるか持ってないか識別できるようにしてます

lpWinHandle->hWnd = NULL;
830804:2007/02/12(月) 13:07:37
>>822
なるほど!
確かにWM_NCRBUTTONUPではなくWM_RBUTTONUPが飛んできました。
そこでWM_RBUTTONUPに併せてSC_MAXIMIZEを行ったところフリーズ。
もしやCaptureしないといけないのかなと思い、WM_NCRBUTTONDOWNに併せてSetCapture()
そしてWM_RBUTTONUPでSC_MAXIMIZE、ReleaseCapture()することで
右クリックアップで動作させることができました。
アドバイス、本当にありがとうございました。
感謝です。
831デフォルトの名無しさん:2007/02/12(月) 13:33:58
HPEN,HBRUSHに対して色を変える操作だけをしたいんですけど、
その度にCreateとDeleteを繰り返さなければいけないんでしょうか。
できれば同じオブジェクトに対して色を変えるだけの操作をしたいです。
832デフォルトの名無しさん:2007/02/12(月) 14:46:40
Win2000以降なら
SetDCPenColor、SetDCBrushColor
Win9Xは知らない
833デフォルトの名無しさん:2007/02/12(月) 15:07:26
あいあおう
834デフォルトの名無しさん:2007/02/12(月) 15:26:28
>>831
ラッパークラス書く
835デフォルトの名無しさん:2007/02/12(月) 15:31:10
ダイアログに置いた子ウィンドウ上に、更に孫となるコントロールを置いたとき、
Tabキーで他の子のコントロールと今置いた孫のコントロールを行き来できるようにするには
どうするといいでしょうか?
836デフォルトの名無しさん:2007/02/12(月) 15:38:03
自分でTabキー捕まえてSetFocus
837デフォルトの名無しさん:2007/02/12(月) 16:06:23
>835
WM_CTLDLGだっけ、Focusをダイアログ側ですべて処理するように出来る、というのが1つの方々。
ウィンドウからウィンドウにフォーカスが移動する際に、特定のメッセージがあがるからソレを捕まえる、というのが二つめの方法。
最後のコントロールからの TAB 押下を判定して NEXTCTRする。というのが三つ目の方法。
838デフォルトの名無しさん:2007/02/12(月) 17:12:12
VC GDIでゲーム作ってるんですが、止めた方が良いんでしょうか。
「好きにしろ」レベルの事でしょうか。
839デフォルトの名無しさん:2007/02/12(月) 17:19:18
ゲーム次第だが、まあ好きにしろ
840デフォルトの名無しさん:2007/02/12(月) 17:26:39
どこを止めてほしいのかわからん
VC
GDI
ゲーム
841デフォルトの名無しさん:2007/02/12(月) 18:34:07
MODULEENTRY32のhModuleはLoadLibraryのモジュールハンドルと一緒なんでしょうか?
842デフォルトの名無しさん:2007/02/12(月) 18:44:55
>>837
IsDialogMessageでよくね?
843デフォルトの名無しさん:2007/02/13(火) 02:58:38
指定した文字列を描画するときに、描画範囲を指定してDrawTextなどで
出力するときに、どれくらいの領域が必要か調べるのにはどうするのが
良いでしょうか?
あまり知識がないので、文字の幅、高さ、行の幅などを取得して計算するしか
思いつかないのですが、なにか便利なAPIとかはないでしょうか?
844デフォルトの名無しさん:2007/02/13(火) 03:05:46
DrawText

DT_CALCRECT
845デフォルトの名無しさん:2007/02/13(火) 03:53:15
>>844
ありがとうございます。
846デフォルトの名無しさん:2007/02/13(火) 04:18:44
RPGを作っているんですが
フィールドの移動で32ピクセルを0.4秒くらいで移動するようにしたいんですが
FPSを60に設定して画面の一回の書き換えで1ピクセル移動するようにすると
32ピクセル移動するのに、32/60=0.533...秒で遅すぎて、
画面の一回の書き換えで2ピクセル移動するようにすると
32ピクセル移動するのに(32/2)/60=0.266...秒で早すぎるんですが
FPSが60で0.4秒くらいでキャラがフィールドをなめらかに
32ピクセル移動させるにはどうしたらいいでしょうか
847デフォルトの名無しさん:2007/02/13(火) 04:37:47
こんなのはどう?

浮動小数点数のカウンタをひとつ用意する。
1フレーム毎に、0.4/60.0加算する。
移動量 = 32ピクセル * カウンタ

これならFPSが変わっても大丈夫。

浮動小数点数が遅すぎて受け入れられないというのなら、
整数を多少工夫して使えばいいけれど。
848デフォルトの名無しさん:2007/02/13(火) 06:07:49
>>846

求めたい移動量 = 32 * 経過時間 / 移動に要する時間

小学生か?
849デフォルトの名無しさん:2007/02/13(火) 07:23:03
>>846
座標を整数ではなく少数で持つのが一番簡単。
850デフォルトの名無しさん:2007/02/13(火) 08:44:11
でもBitBltのに渡す座標の引数は整数だから
座標を少数で持つと動きがカクつく
0.5ピクセル色を塗るとかできないし
851デフォルトの名無しさん:2007/02/13(火) 10:28:10
少数画素位置での Blt は、AA処理のようにバックバッファ用意して

背景を n倍 StretchBlt
→ 整数化(座標xn) の位置に n倍 Obj を貼り付け
→ 全体を 1/n StretchBlt

とかやるしかないのかな
852デフォルトの名無しさん:2007/02/13(火) 10:52:42
>>850
世の中の2Dゲーが全てカクついて見えるんだな。
常人では追いつけないすご目をしているな。
853デフォルトの名無しさん:2007/02/13(火) 11:01:40
携帯ゲーみたいな小さい液晶と比べたらはるかに条件いいんだけどね
854デフォルトの名無しさん:2007/02/13(火) 11:08:16
こういうときこそ無駄に3Dエンジンを使うのだ!
855デフォルトの名無しさん:2007/02/13(火) 11:12:08
>0.5ピクセル色を塗るとかできないし

AA使いたいってこと?
856デフォルトの名無しさん:2007/02/13(火) 11:15:56
やっぱりゲ製作板へ行くべきだろう
857デフォルトの名無しさん:2007/02/13(火) 11:42:18
>>850
動体視力凄いな。
イチローでも80f/sくらいだけどお前は一体なに?
ハエか何かか?昆虫なら150f/sとかザラにいるけど地球外生命体なの?
858デフォルトの名無しさん:2007/02/13(火) 11:46:13
>>857
いや、使っているディスプレイもすごいと思うぞ。
なんだろ、1ドットが見えるような超巨大スクリーンかな。
スタジアムとかにあるやつ。
859デフォルトの名無しさん:2007/02/13(火) 12:22:25
今からゲームを作ろうと言うのにそんなとこでつまづいてたら一生できないぞw
860デフォルトの名無しさん:2007/02/13(火) 13:16:42
細かい事気にしてると禿げるよ。
861デフォルトの名無しさん:2007/02/13(火) 13:54:15
FPSが60で0.4秒で32ピクセル移動するわけだから
画面の一回の書き換えで移動するときと移動しないときができてなめらかに
表示されないと思うんですけど問題にならないですかね
それにキャラを書き換るんじゃなくて、背景画像をスクロールさせてるので
画面全体を書き換えてるんですけど問題ないですかね
862デフォルトの名無しさん:2007/02/13(火) 14:16:32
実際に試してみれば?
863デフォルトの名無しさん:2007/02/13(火) 14:18:24
>>850
アンチエイリアシングを応用すれば、
擬似的に解像度が高く見えるんじゃない?
モーションブラーって名前で既に一般化された手法だけど。
864デフォルトの名無しさん:2007/02/13(火) 14:35:22
輝度がFFFFFFのとある1pixelに、0.5x0.5pixelの輝度000000を描画したとすると、
描画対象になったかわいそうなとある点の輝度は(FFFFFF*3+000000)/4で良い。

とかいいたいの?
865デフォルトの名無しさん:2007/02/13(火) 15:29:58
普通の動画でも30fpsぐらいじゃん
60fpsだったらその倍の速さだぞ
866デフォルトの名無しさん:2007/02/13(火) 15:31:43
いまどきフレームレート固定はないだろ‥‥常識的に考えて
867デフォルトの名無しさん:2007/02/13(火) 15:59:26
今時120fpsもないなんて終わってる
868デフォルトの名無しさん:2007/02/13(火) 16:46:19
> いまどきフレームレート固定はないだろ‥‥常識的に考えて
ごめんね…
640x480 60fps 固定でゴメンね…
869デフォルトの名無しさん:2007/02/13(火) 22:45:33
>>861
なんで移動しないときが出て来るんだよ!
870デフォルトの名無しさん:2007/02/13(火) 22:50:33
1ピクセル動く時と2ピクセル動く時があるが、動かない事は無いな。
871デフォルトの名無しさん:2007/02/13(火) 23:24:05
対して手間のかかる物じゃないんだからとっとと作ればいいのに、
グダグダグダグダ
グダグダグダグダ
グダグダグダグダ
グダグダグダグダ
872デフォルトの名無しさん:2007/02/14(水) 01:25:39
子プロセスから親プロセスのハンドルを取得するAPIってありますか?
873デフォルトの名無しさん:2007/02/14(水) 02:13:49
CreateToolhelp32Snapshot
Process32First
Process32Next
874デフォルトの名無しさん:2007/02/14(水) 02:22:05
しかしその親プロセス情報って親が死んでようが生成されたときのままなんだよな
ツリー構成する類のタスクマネージャで見るとたいていプロセス関係は並列になっちゃってるし
プロセス間の親子関係はあんま使えない
875デフォルトの名無しさん:2007/02/14(水) 09:57:32
プログラムから他のプロセスのカレントディレクトリを変更するにはどうしてらよいですか?
876デフォルトの名無しさん:2007/02/14(水) 10:06:46
>>875
できません。フックその他の手法でターゲットのプロセスにコードを注入して、
そのプロセス自らがカレントディレクトリを変更するようにするしかありません。
877デフォルトの名無しさん:2007/02/14(水) 10:34:39
ここの「パレットアニメ」のサンプルプログラムが動きません。
http://wisdom.sakura.ne.jp/system/winapi/win32/win126.html

フリーのBorland C++コンパイラ23行目で「'void *' 型は
'tagLOGPALETTE *' 型に変換できない」エラーが出ましたので、
mallocの前に(LOGPALETTE *)をつけたらエラーはなくなりました。

しかし、256色モードにして実行をしてもサイトに説明されているように
黒い四角が左へは移動せず、その場から動きません。

何か間違いがあるのか、当方の環境が悪いのか、環境が悪いのは
コンパイラが悪いのか、ハード的な要因かなど一向に原因がつかめません。

どなたかわかる方がいましたら、ご助言をお願いします。

それから、フルカラーの場合にパレットアニメを実行するには
具体的にどうしたらよいかをご指南をいただければ助かります。
よろしくお願いします。
878デフォルトの名無しさん:2007/02/14(水) 10:42:33
普通に塗り直せよ。
879デフォルトの名無しさん:2007/02/14(水) 10:57:18
塗りなおしと言うとPatBltでマスク画像を用意して、XOR演算子で結合しか
当方には思いつきません。
なにか特定の色だけを一気に書き換える方法はないでしょうか?
880デフォルトの名無しさん:2007/02/14(水) 11:01:06
元データをメインメモリー上に持っておいて、変えたい色を変えて塗り直せ。
思いつくとかそういう問題じゃないぞ。
881デフォルトの名無しさん:2007/02/14(水) 11:11:11
>>879
1.256パレットのデバイスに依存しないビットマップを作る
2.パレット変更
3.デバイスコンテキストに転送
でいけると思う
882デフォルトの名無しさん:2007/02/14(水) 11:16:35
パレットアニメの意味がない
883デフォルトの名無しさん:2007/02/14(水) 11:18:18
パレットアニメっていったいどこの化石プログラマーだよ。
884デフォルトの名無しさん:2007/02/14(水) 11:20:47
今は全部書き直しでおk
885デフォルトの名無しさん:2007/02/14(水) 11:31:46
安直に名前だけでサンプル選んで動かしてみただけだろ
特に必要なかったらやる意味ないよ
886デフォルトの名無しさん:2007/02/14(水) 12:11:10
1フレーム毎に移動量を4/3ピクセルずつ増やして
実際の描画位置の座標は小数部分切捨てで整数部分をBitBlt関数に渡すようにして
24回の画面の書き換えで32ピクセル移動する設定で作ってみたら
0.4秒で32ピクセル移動するようになりましたありがとうございました
画面がカクつくと感じた原因は画面を書き換える時間を格納する変数をDWORD型?にしてたせいみたいで
これをlong double型とすることでうまくいきましたありがとうございました
887デフォルトの名無しさん:2007/02/14(水) 12:50:51
long doubleってあるんだ・・・
888デフォルトの名無しさん:2007/02/14(水) 13:29:46
結果的にうまくいってるように見えていても
それが正しい解決方法とは限らない好例
889デフォルトの名無しさん:2007/02/14(水) 14:59:10
>>886
とりあえずゲーム作るんなら秒で考えるの止めて何フレームで何をする
って考えにを身に付けた方がいいよ。
890デフォルトの名無しさん:2007/02/14(水) 16:00:41
質問です。
既存のシステムが機能的に不足があるのですが、ソースはもらえないので、
スレッドを作る機能を利用して機能を拡張したいと思ってます。

スレッドはCreateThreadで指定されたSubThread関数を呼び出す形になっています。
このSubThread関数の中だけで、既存のシステムのマウスの状態を拾いたいんです。
たとえばWM_LBUTTONDOWNとかを拾う感じです。

まずはSubThread関数が呼ばれたら普通にウィンドウを作り、(非表示)
この中で普通にWM_LBUTTONDOWNを拾えばいいのかと思ったんですが、
問題なく左クリックは検出できましたが、
既存のシステムのウィンドウと何か衝突してしまうようで、
無限ループのような感じでウィンドウが真っ白になり、応答なしになります。

何か他の方法とかありましたらよろしくです。
891デフォルトの名無しさん:2007/02/14(水) 16:10:18
なんでデバッグしないの?
892デフォルトの名無しさん:2007/02/14(水) 16:15:57
>>890
1.GetWindowLong 元のウインドウの WNDPROC を取得する
2.SetWindowLong で新しい WNDPROC に書き換える
3.新しい WNDPROC で必要な処理をした後で以前の WNDPROC を呼び出す
893デフォルトの名無しさん:2007/02/14(水) 16:31:18
>>890
マウス フックじゃダメなのん?
894デフォルトの名無しさん:2007/02/14(水) 17:10:03
>>888
kwsk
895872:2007/02/14(水) 19:17:57
>>873-874
ありがとうございます。調べてみます。
896デフォルトの名無しさん:2007/02/14(水) 19:59:43
>>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
マウス以外も拾いたいんです。
897デフォルトの名無しさん:2007/02/14(水) 20:26:17
>>896
可能性
1. 右ボタンを押して反応している部分の WNDPROC が別
2. WNDPROCを通さないでマウスイベントを処理している
3. その他

どんなソフトなのか分からないので、なんとも言えない
RADツールで作ったソフトの場合には、ボタンなどのウインドウで処理しないイベントだけが親ウインドウに渡されたりする
898デフォルトの名無しさん:2007/02/14(水) 20:29:35
>>897
うーんそうですか・・・・もう少し悩んでみます。
ありがとうございました。
899デフォルトの名無しさん:2007/02/14(水) 20:46:24
僕ハッカー
900デフォルトの名無しさん:2007/02/14(水) 20:51:45
>>899
kwsk
901デフォルトの名無しさん:2007/02/14(水) 20:56:02
僕バッカー
902デフォルトの名無しさん:2007/02/14(水) 21:04:56
>>901
mjsk
903デフォルトの名無しさん:2007/02/14(水) 21:09:27
僕ぬるぽ
904デフォルトの名無しさん:2007/02/14(水) 21:17:29
俺ガッ
905デフォルトの名無しさん:2007/02/14(水) 21:22:36
バカバッカー
906デフォルトの名無しさん:2007/02/14(水) 21:44:34
 (⌒)    ピ
/ ̄ ̄|        ∧_∧ 
| ||.  |     ━⊂(・∀・ )
\__|    ========  \
 |   |   /※※※※ゞノ,_)
907デフォルトの名無しさん:2007/02/14(水) 21:47:14
LVS_EX_ALTERNATEROWCOLOR
をワクテカして使ってみようとしたんだが、ヘッダにも記述がない。
挙句にそんなflagなどないだと。本当になくなっちゃったの?
908デフォルトの名無しさん:2007/02/14(水) 21:51:15
よくみたらLVS_EX_にもうフラグの空きがないねorz
909デフォルトの名無しさん:2007/02/14(水) 21:59:36
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1071006&SiteID=1
>There is no such flag. The documentation is incorrect. I've filed a doc change request.
910デフォルトの名無しさん:2007/02/14(水) 22:08:16
>>872
Cygwinのgetpidのソース見れば
911デフォルトの名無しさん:2007/02/15(木) 15:32:04
CM_Request_Device_EjectでUSBデバイスをはずした後、
デバイスマネージャで!マークがつきますが、
これを抜き差しせずにまた再認識させるのにはどうしたらいいのでしょうか?

SetupDiChangeStateやSetupDiCallClassInstallerでの有効・無効では無理でした。
912デフォルトの名無しさん:2007/02/15(木) 16:16:18
SendInputを使えば他のmouse_eventの割り込みを受けずに連続動作が保証されると聞いたのですが,
確かに他のアプリが発行したmouse_eventの割り込みは受けないのですが
ユーザ自身のマウス操作に割り込まれてしまいます。
ユーザのマウス操作にも割り込ませず完全な連続動作を保証するにはどうすればいいのでしょうか?
913デフォルトの名無しさん:2007/02/15(木) 17:49:18
>>912
一体何をしたいんだ。
未署名のドライバのインストール時にでるダイアログでも回避したいのか?
914デフォルトの名無しさん:2007/02/15(木) 20:40:10
VK_Aなどの仮想キーコードを利用しようとすると
定義されていない識別子です。というエラーが出るのですが、
windows.h以外に何かインクルードしなければならないヘッダがあるのでしょうか?
915デフォルトの名無しさん:2007/02/15(木) 20:53:22
そもそもそのVK_Aとやらは、なんであると思ったんだ?
916デフォルトの名無しさん:2007/02/15(木) 21:12:33
'A'でいい。
英字のキーコードは、ASCIIの英大文字のコードと一致している。
VK_Aなどといった英字に対するVK_?定数は文字定数の存在しないVBなどで便宜的に使用されるもの。
917デフォルトの名無しさん:2007/02/15(木) 21:14:59
勘違してたから。
・・・すまん。吊ってくる
918デフォルトの名無しさん:2007/02/15(木) 21:15:35
>>916
ありがとう。
919デフォルトの名無しさん:2007/02/15(木) 21:19:09
WinUser.h
920デフォルトの名無しさん:2007/02/15(木) 21:51:03
>>919
ありがとう。
中身見たらいろいろ書いてあって勉強になった。
921デフォルトの名無しさん:2007/02/15(木) 22:29:21
なんでincludeの中を全文検索してみるとか、ごく簡単に出来ることをしなんだろう?
922デフォルトの名無しさん:2007/02/15(木) 22:52:58
MAXのつく#defineをファイル検索する俺は病気。
923デフォルトの名無しさん:2007/02/15(木) 23:12:54
"WM"
でそれやったことあるが
924デフォルトの名無しさん:2007/02/15(木) 23:29:15
ネットワーク上のWin9xマシンのファイル/フォルダに対して
GetFileAttributesEx()すると、作成日時が取得できない!?
925デフォルトの名無しさん:2007/02/15(木) 23:50:50
>>924
それは9xというよりFATのせいじゃね?
926デフォルトの名無しさん:2007/02/16(金) 00:55:12
>>925
ネットワーク越しのXPのFATでは問題なく取得できるので、
やはり9xっぽいですよ
927デフォルトの名無しさん:2007/02/16(金) 01:06:30
ローカルのFATのファイルの中に、作成日時が空で表示されるのがあるな。
DOSで弄った時は、作成・アクセス日時が書き込まれないのかも。
928デフォルトの名無しさん:2007/02/16(金) 01:25:52
DWORD MyGetTickCout()
{
return (DWORD)((ULONGLONG)(*(ULONG *)0x7FFE0000) * (*(ULONG *)0x7FFE0004) / 16777216);
}

この0x7FFE0000にユーザモードから書き込みたいのですが
いい方法が思い浮かびません。
929デフォルトの名無しさん:2007/02/16(金) 01:27:57
OutputDebugStringの出力を
コマンドプロンプトに表示させたいのですが
どうしたらいいですか?
930デフォルトの名無しさん:2007/02/16(金) 02:29:02
>>928
*(DWORD *)0x7FFE0000 = 0;
って話じゃないんだろうなあ。何が問題なのか良く分からん。
931デフォルトの名無しさん:2007/02/16(金) 02:31:23
そもそもユーザーモードってなんだろか。
932デフォルトの名無しさん:2007/02/16(金) 02:44:23
7ffe0000ってユーザモードで自由にアクセスできるエリアじゃなかったっけ
933デフォルトの名無しさん:2007/02/16(金) 03:02:27
ここで聞いた私が馬鹿でした
934デフォルトの名無しさん:2007/02/16(金) 03:45:07
>>928 の内容をエスパーを駆使して超解釈

【質問】
リアルタイムで動くゲーム(MMORPGか?)をしていますが、ゲームの動作速度を自由に変更したいです
ゲームの動作速度は API GetTickCount で取得した値に応じて動作しているようです

アドレス 0x7FFE0000 に書き込みが出来れば GetTickCount の返す値を自由に操作できます
これによってゲーム速度を変えられるのではないかと考えています

ただし、 0x7FFE0000 は読取専用となっており書込みが出来ません
どなたか 0x7FFE0000 のアドレスへ書込みを行う方法を教えて下さい

【回答】
っ API フック (jump するアドレスを書き換えろ!)
935デフォルトの名無しさん:2007/02/16(金) 05:20:30
通報しました
936デフォルトの名無しさん:2007/02/16(金) 07:41:50
>>934
わざわざ0x7FFE0000をreadしている理由を考えて見ましょう。
928はGetTickCountをフックしたいわけではないのでは。
937デフォルトの名無しさん:2007/02/16(金) 08:15:07
>>934
エスパー残念
938デフォルトの名無しさん:2007/02/16(金) 08:46:57
>>936
自作関数ならアドレスの内容を書き換えなくても、
コピーしてから好きなように加工できるから
>>928 は目的を隠すためにそういう書き方をしてるんじゃなかろうか?

と邪推してみる
939デフォルトの名無しさん:2007/02/16(金) 08:50:57
940911:2007/02/16(金) 10:42:23
DDKスレで質問してみます
941デフォルトの名無しさん:2007/02/16(金) 11:01:10
>>928は俺のエスパー能力を駆使しても分からんん。
32bitのアドレスならば、カーネルのメモリでもないし
思う存分書き込めばいいだろうし。

GetTickCountをフックしたのならば、
いくらでも自分の好きなようにすればいいだろうし。

他プロセスのメモリならば、WriteProcessMemoryするだけだし、
PAGE_READONLY等が指定されているというのならば、VirtualProtectExだろうし。
942デフォルトの名無しさん:2007/02/16(金) 12:03:46
0x7ffe000〜は読み込み専用だった希ガス
Ollydbgでアクセス属性を変えようとしてもエラーが出たような。
943デフォルトの名無しさん:2007/02/16(金) 12:11:06
タイマーをフックしてゲームの速度を変更してしまうソフトがあるが、
ゲーム側でタイマー関係のAPIを呼ばずに0x7FFE0000を読んで
時間を取得するという対抗手段がある。

それに対応するために0x7FFE0000を書き換えたいのだろう。
944デフォルトの名無しさん:2007/02/16(金) 12:55:50
はーなるほど。
NTでは、0x7FFE0000から面白い情報が入っているのか。
しかしなんでこっちを書き換えたいのかね。
これはOSが使う領域だろうに。

0x7FFE0000だと分かっているのなら、
そのアドレスを参照している部分を全部特定できるのでは。
945デフォルトの名無しさん:2007/02/16(金) 17:10:23
質問です。
CでのAPIフック(他プロセス)の実現でSetWindowHookExを使ってやるのはどうすればいいのでしょうか?

現状、時プロセスにしかフックを実現できていません。
恐らくフックインストール時にインポートテーブルの書き換えをやっても呼び出しが自プロセスだからだと予想しているんですが。。。
946デフォルトの名無しさん:2007/02/16(金) 17:38:54
>>945
ぐぐればいくらでも出てくる
947デフォルトの名無しさん:2007/02/16(金) 18:11:13
それはCではないと思われ。
喧嘩を売るみたいで申し訳ないがググルなんて基本的な事はとうの昔にやっており、それでもわからなかったからここで質問したんだ。

俺が調べた限り【C言語】でのAPIフックのサンプルは自プロセスはあるが他プロセスに対してのアプローチのやり方は無かったはず(海外含めず)

まあ、自己解決したんで概要を。

まず、DLLにアタッチしたとき共有メモリで自プロセスIDを取得する。これはターゲットプロセス以外フックを行わないため。
次にターゲットにフックをかましてアタッチされた時、プロセスIDを取得し共有メモリのIDと比較して等しくない場合インポートテーブルを書き換えAPIフック完了

携帯だから文章汚いが勘弁
948946:2007/02/16(金) 18:23:05
>>947
ごめん
ぐぐったらそれと全く同じ内容のサンプルが見つかった
949デフォルトの名無しさん:2007/02/16(金) 18:32:45
マジで?それどこよ?

いっとくけどKENJI氏のウェブサイトとかいわないでくれよ?w
950デフォルトの名無しさん:2007/02/16(金) 18:34:09
フックするのにCとC++で何か違うの?
951デフォルトの名無しさん:2007/02/16(金) 18:40:49
俺はCが前提って文頭に示して質問してるから、「何が違うの?」とか言われても逆に困るんだが。
取り敢えず帰宅するから家についてそのサンプルサイト楽しみにしてます。
952デフォルトの名無しさん:2007/02/16(金) 18:40:52
>>950
違わない
953デフォルトの名無しさん:2007/02/16(金) 18:41:12
なーんも変わらんな。

C++ かつラッパークラス作るあたりで、
暗黙でスタックに詰まれる this をどう始末するかで迷うだろうが。
954デフォルトの名無しさん:2007/02/16(金) 18:43:07
釣りだから釣られないように
955デフォルトの名無しさん:2007/02/16(金) 18:43:21
あるフォルダの内容が変更されたら(ファイルが追加されたり削除されたり)
それを察知するにはどうすればいいですか
956デフォルトの名無しさん:2007/02/16(金) 18:54:15
CreateFontで作ったフォントを使い終えたら元のフォントに戻す理由って何なんでしょうか。
色々調べてもそうした方が良い、そうするべき、としか書いてないので・・・
957デフォルトの名無しさん:2007/02/16(金) 19:02:47
DCのSelectObject話なら戻す必要ないぞ
あの辺をブラックボックスとみなす派が何が起きるかわからないと言ってるだけ
malloc/free論争に近い
958デフォルトの名無しさん:2007/02/16(金) 19:35:36
>>955
FindFirstChangeNotification
FindNextChangeNotification
959デフォルトの名無しさん:2007/02/16(金) 19:44:50
>>957
なるほど。ありがとう。
960デフォルトの名無しさん:2007/02/16(金) 19:51:42
理由聞いてたはずなのに自分に都合のいい意見なら理由はいらないんだ
961945:2007/02/16(金) 19:56:01
>>946
返信が無いな
まあ、おそらくKENJI氏のサイトなんだろうけどw
962946:2007/02/16(金) 19:59:22
>>961
そのサイトであってる
C++のコードだったがCでも書くこともできるので何の問題もない
それすらできないやつがAPIフックなんて考えないほうがいい
963デフォルトの名無しさん:2007/02/16(金) 20:04:08
APIフックでググって最初の10件に、C言語で他プロセスにAPIフックを
仕込む日本語サンプルがあったんだが。
964デフォルトの名無しさん:2007/02/16(金) 20:10:10
そもそもAPIフックって自プロセスのAPIフックして何が楽しいの?
965デフォルトの名無しさん:2007/02/16(金) 20:16:20
親近相姦
966デフォルトの名無しさん:2007/02/16(金) 20:30:46
>>malloc/free論争に近い
違う。全プロセスのGDIオブジェクトの合計はシステムで制限がされている(レジストリで指定されている)。
967デフォルトの名無しさん:2007/02/16(金) 20:51:10
ビットマップとか DC に Select されたままだと DeleteObject しても
解放されないしね。
968デフォルトの名無しさん:2007/02/16(金) 20:55:33
7FFE0000について今頃知った。
そうか、チート小僧だったのか。
969デフォルトの名無しさん:2007/02/16(金) 22:36:12
>>966-967
そういう理由だったんですか・・・
丁寧にSelectObjectの戻り値は取っておいて戻しておくべきなんですね。
ありがとうございました。
970945:2007/02/17(土) 00:17:17
>>962
違うなー。サイトがあってる?俺は当初質問しただけで
サイト教えてとは一言もいってないんだけどな。
そもそも誰一人としてまとも(技術的)な返事が帰ってこなかった。
これじゃあ質問スレの存在意義が。。。(答えられる人がいないっていったらそれまでだけど)

ともかくなんとか自分で解決できたんだけどね。

「それすらできない」ってお前さん言ってるが、じゃあ有言実行
KENJI氏のC++コードを同じ動作をCで組んでごらん?
大変だから。解決はしたが、少なくとも知識の乏しい俺はここに
たどり着くまでにかなりの時間かかったけどな。
まあ、苦労したなりに得るものはかなり大きかったが。

それに動機(実現したいと考える)があるからものすごい努力するんであって
「それすらできない奴は考えない方がいい」という発言はおかしな話だと思わないか?。

恥を覚悟で言うがAPIフックをターゲット(単一)プロセスに実現できるように
なるまでにかかった時間は実に2ヶ月だ。今日はじめてできたんだ笑えよw
971デフォルトの名無しさん:2007/02/17(土) 00:18:56
>違うなー。
まで読んだ。
972デフォルトの名無しさん:2007/02/17(土) 00:31:18
>>966
ごめん「全プロセス」っていっているてことは
GDIProcessHandleQuotaやUSERProcessHandleQuotaとは別のものがリミットとして存在するってこと?
↑のやつの制限って「1つのプロセス」の制限値だよね?
よろしければ、教えてください。
973デフォルトの名無しさん:2007/02/17(土) 00:41:10
>>970
質問に対する答えとしてググれとかどこそこのページを見ればいいというのは認めないのか。

あと、そんなあのようなC++のコードをCにするのが大変なら、
拡張子cppでC++のままにしておいて、
自分の書くコードはCのコードのように書くという手段では駄目か?
974945:2007/02/17(土) 00:57:08
>>973
それはもはやCとはいえない気が。

ググれとかどこそこのページを参考にとはわかるんだが
既にそのページを見て参考にしてでもわからないとなると
いったいどうすればいいんだろうという話を俺はしてたつもり。

まあなんにしろ何とか実現できたんで満足
975945:2007/02/17(土) 00:57:52
これ以上いるとウザイからこれを最後に名無しに戻る。
976928:2007/02/17(土) 01:04:20
皆様、反応ありがとうございます。
一応、GetTickCountをフックしてピンボールを早くすることくらいはできますw

kernel32.dllのGetTickCountはご存知の通り
0x7FFE0000を参照しているだけです。

>>944
OSが使う領域ということは
カーネルモードでしか書き込みできないのでしょうか。
977デフォルトの名無しさん:2007/02/17(土) 01:11:06
>>976
ふむふむ、確かに
MyGetTickCountとGetTickCountが同じ結果となる。
978デフォルトの名無しさん:2007/02/17(土) 01:17:32
>>974
そういうときはどこがどうわからないか具体的にはっきりと書いておいて、
後は誰か説明してくれる親切な人が現れるのを待つしかないよ。
979デフォルトの名無しさん:2007/02/17(土) 03:13:43
APIフックで思い出したけど、カーネルのSeAccessCheckを
フックして常にTRUEを返すようにしたら、あらゆるアクセス権を
無視して自由にアクセスできたな‥‥
980デフォルトの名無しさん:2007/02/17(土) 05:14:12
(゚Д゚)
981デフォルトの名無しさん:2007/02/17(土) 05:29:20
こっち見んな
982966:2007/02/17(土) 13:20:23
972さま、わたくしのかんちがいでありました。
全部で約16K個という制限は固定であります。
つけくわえると、Vistaは所持しておらず不明であります。
983デフォルトの名無しさん:2007/02/17(土) 18:47:12
特定のネットワークアダプタの有効化/無効化を、
プログラムやバッチファイル等から制御する方法はあるでしょうか?

netsh.exeで簡単にできるのかと思っていたんですけど無理みたいです。
984デフォルトの名無しさん:2007/02/17(土) 19:40:28
      ,、‐ " ̄:::゙:丶、
    ,r: ,' 3゙ :::::::/ハヽ:ヽ::::、:ヽ
    {::://:::::::// ヽ\ト、:::::::!
    ヾ l:::::::/ 丶   `ヾ ィ、:::|
     |;:r::|  O`  'O ゙ハ|   < ないない
      ヽハ :.:.    :.: レ
        ´\ r‐--‐、,ノ
 r、     r、/ヾ ̄下ヘ
 ヽヾ 三 |:l1、_ヽ/__ .ィヽ
  \>ヽ/ |` }    n_n| |
   ヘ lノ `'ソ     l゚ω゚| |
    /´  /      ̄|. |
    \. ィ   ___ |  |
        | ノ     l |  |
      | |      i:|  |
985983:2007/02/17(土) 20:27:54
自己解決しました。
984にカチンときたので教えません。
バーカ!
986983:2007/02/17(土) 20:35:25
ほんとに使えねえクズどもだな。
987デフォルトの名無しさん:2007/02/17(土) 20:36:56
>>983
m9
988デフォルトの名無しさん:2007/02/17(土) 21:02:10
次すれまだぁ?
989デフォルトの名無しさん:2007/02/17(土) 21:05:02
CTRL+ALT+DELをプログラムからPCに送る方法ありませんか?
keybd_eventやVNCがやってる方法では期待する動作になりませんでした。
単にタスクマネージャーを出したいわけではなく、割り込みを発生させたいのです。
990デフォルトの名無しさん:2007/02/17(土) 21:30:41
wsprintfW(&Buff[0], TEXT("%s"), lpStr);
cds.cbData = lstrlen(Buff) * sizeof(TCHAR) + 1;

これで表示させた時、途中から文字が化けるんだが。
どうしてかわかる人いますか?
UNICODEだからかな。

lpStrは固定長でWCHARで9バイトになります。
cds.cbData(COPYDATASTRUCT)に9を指定するとちゃんと表示されるんですが・・・・
APIの不具合なんですかね?
991デフォルトの名無しさん:2007/02/17(土) 21:34:06
WCHARで9バイト?
992デフォルトの名無しさん:2007/02/17(土) 21:35:20
先頭1バイトが長さを指定したりする方式なのかなぁ?
993デフォルトの名無しさん:2007/02/17(土) 21:35:22
cds.cbData = lstrlen(Buff) * (sizeof(TCHAR) + 1);

トレイラーも二バイトなんじゃないの?
標準C++ではワイドのヌルキャラクターはやっぱりワイド。
994990:2007/02/17(土) 21:35:23
>>991
!!!!!!!!!!!!!!
ありがとうございます!
995デフォルトの名無しさん:2007/02/17(土) 21:48:45
メモリにあるzip形式で圧縮されたデータを解凍するのにベストな方法は?
UnZip.dllだと1回ファイル作らないといけない??
何かフリーでライブラリないかな。
996デフォルトの名無しさん:2007/02/17(土) 21:52:39
>>995
ファイルに書き出しさえすれば色んな解凍ツールが使える
余計なコーディングはしないという点からはベスト!
997デフォルトの名無しさん:2007/02/17(土) 22:00:48
おいらはzlib付属のminizipみて、メモリ展開するようなのをつくったけど。
998デフォルトの名無しさん:2007/02/17(土) 22:35:27
APIの質問しろやああああああああああああああああああああああああああああ
999デフォルトの名無しさん:2007/02/17(土) 22:35:58
ああああああああああああああああああああああああああああああああああああ
10001000:2007/02/17(土) 22:37:41
自己解決しました。
>>1-999にカチンときたので教えません。
バーカ!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。