Windows98やMEでCreateWindowExを使うとバグが出て ウィンドウを2つ3つ作ったところでAPが落ちるらしい。 まあ素直にダイアログ作っとけってこった。
すなおに 9x は捨てろってこった。
そうだな、リソースなんて概念に縛られてるようじゃ今時やってられん
>>751 どうしてもそれが必要になった事があってAPを 2000とXPでテストして客先に、提出したのよ。 (一応98とかは、サポート外だった) そんでもって客の都合で、たまたまAPを98で動かしてみたら 落ちたって言うから、調べてみたらそいつが原因だったってわけ。
>>753 CreateWindowExなんて良く使うAPIでバグがあるんならもっと話題になってもいいようなもんだが
ググっても見つからんし、信用できんな。
>>753 そんな話は初めてだし普通にEx使って何の問題も出たことないよ。
別のところに問題あったのが偶然致命傷にならずに動いてて
最終的にExの部分で発現しただけでは?
2000系では落ちないけど9x系では落ちる……。 十中八九、>749のアプリケーションのバグだな。 だから俺はMeが手放せない。些細なバグでも落ちてくれる。
CreateWindowはCreateWindowExを呼び出すマクロだった気が
マクロになってるね。
>>723 EDITSTREAM の構造体の callback に ReadFile(), WriteFile() を普通は
書いていると思いますが、例えが、WriteFile() の代わりに、格納先のメモリ
に MoveMemory() して、メモリのポインタをそのバイト進めるという処理を
続ければ、メモリに書き出した内容が置かれます。(GlobalReAlloc() すれば
どんどん書けます)
rtf の仕様は、ヘルプで出てくるのを見た憶えがあります。
また、MSword があれば、拡張子を .rtf にして書き出せば、どんな風に出て
来るかわかるでしょう。同じ内容を .txt でも書き出せば、対比できます。
文字を着色するだけなら、色指定と文字の格納の方法だけわかれば、txt->rtf
は簡単なので、私はCのソースは、txt で読んで、rtf に変換して、画面へ
送りこんでいます。文字列が英字だけなら文字列はそのまま rtf に置かれます。
760 :
720 :2005/03/26(土) 23:42:11
>>693 ,
>>721 (続き)
アイコン・データの所在を例示すると、一般的なものは、Shell32.dll に多くあります。
今、win98 で見たら、大小 342 個(RT_ICON ベース)ありました。
RT_GROUPE_ICON が ico ファイルに対応していて、この中に要素のアイコンを示す index
があり、RT_ICON を参照するようになっています。
.bmp ファイルのアイコンは、ペイントにあり、MSword のは MSword, Excel のは
Excel にあります。以下同様。
で、.exe, .dll の中を見るには resource editor があれば容易だと思いますが、
VC++ のサンプルの PeFile にアクセス方法が載っています。MSN には、今や PeFile
はないようですが。
.ico ファイルに復元する個数が少ないなら、個々のアイコンの DIB には、
相対アドレスを参照する値はないので、バイナリ・エディタで、hex を切り出して、
自分で hex 編集して、バイナリに戻せば、.ico ファイルにできないことはないで
しょう。
(しかし、決まりきったアイコンを使うだけなら、ExtractIconEx(),
ExtractAssociatedIcon() などの API を使うのが、早道です。)
>>745 SetLastError(0xffffffff);
CreateWindowEx(〜);
GetLastError();とすると失敗するときはffffffff、成功するときには57が常に表示されます。
(その0x57をFomatMessageに通すと「パラメータが正しくありません。」となります)
ちなみにCreateWindowExに渡すインスタンスハンドルをEXEのものからDLLのモジュールハンドルに変えたらこれでも成功しました。
ただ、これだったらDLL内でGetModuleHandle(NULL);する方にします。
DLL内のクラスにはDLLのインスタンスハンドルを指定しろとMSDNには書いてあるのが気がかりですが。
762 :
720 :2005/03/27(日) 00:32:03
>>760 忘れたので。
Shell32.dll は Windows フォルダにあるままでは、使用中で読めないことが
あるので、コピーを作って、開きます。
嫌ならwindows使うな
>>761 C Magazineの2004年12月号 125ページをみるべし
>>761 ウィンドウクラスは、インスタンスハンドルとクラス名で特定される
ということを知ってるか?
>761 CreateWindowEx()をいつ呼んでいるのかが気になるのだが…
>>761 RegisterClassに渡すインスタンスは、プロシージャのアドレスを解決するためのものだから
DLLにプロシージャを書いてるならDLLのインスタンスハンドルを渡すべし。
CreateWindowは実際に動いているプログラムのインスタンスを渡すべし。
Win32のコントロールとかDLLに入っててもCreateWindowにはプログラムのインスタンスを
渡してるでしょ、それと同じ。
要するにGetModuleHandle(NULL)だなー。
768 :
デフォルトの名無しさん :2005/03/27(日) 06:53:59
漏れの古いプロジェクト見るとWinNT/2000/XP系用と Win98/Me系用でReleaseが分かれていた。 あたりまえといえばそうなんだが、確かソースは同じで コンパイルオプションかリンクオプションか何か変えないと Win98/Me系でCreateWindowExがまともに動かんかったと記憶してる。
>>768 自分の管理してるソースだろがw
知らない間に妖精さんが書いたとか言うなよ。
CreateWindowExそのものじゃなくて、顧問コントロールを使うときの
マクロ切り替えだったんじゃないの?
今、思いつくだけでもバルーンチップ。
>>767 > RegisterClassに渡すインスタンスは、プロシージャのアドレスを解決するためのものだから
> DLLにプロシージャを書いてるならDLLのインスタンスハンドルを渡すべし。
コレマジっすか?
>>770 ウソ。サブクラスするときにはインスタンスハンドルを渡さないだろ。
EXEとDLL、あるいは複数のDLLが同一のクラス名でRegisterWindow()
したときに(一般にそれらの作り手は別であるので、名前が被る可能性は
十分にある)、CreateWindow()で目的のクラスを確実に指定するには、
クラス名だけでなくインスタンス固有の値も一緒に指定する必要がある。
逆にいうと、インスタンスハンドルにはクラスを特定するための意味しかない。
実際、インスタンスとして無効な値を渡しても動くしな。
>>771 NT系ならCreateWindowのインスタンスハンドルは無視すると書いてある。
773 :
デフォルトの名無しさん :2005/03/27(日) 11:50:15
>>769 いや、妖精ではないが、何年も前のものなのでもう忘れた。
昨日の自分は明日の他人だ。
DLLをロード/アンロード/ロードしたりすると、 インスタンスハンドル変わる時があるから、 偶発的なバグになって苦労するよ
人に聞く前にMSDNぐらい見ようぜ。
>>776 すまん、古いのを見てた。
MSDNもわざわざ間違いを追記することないのにな。
MSDN見る前に人に聞こうぜ。そのほうが早いよ。
人に聞くまえにMSDN見ようぜ。そのほうが早いよ。
780 :
714 :2005/03/27(日) 14:42:48
>>759 thx.
コールバック関数にくるのはReadFile特注のデータじゃないのね。少しわかってきた。
RTF先頭の
{\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}}
とかいうヘッダみたいなのはそのまま使えばいいものなのかな?
781 :
714 :2005/03/27(日) 15:41:07
コンソールアプリでタイマを使いたい場合は、どの関数を用いればいいのでしょうか。 ある処理を一定の間隔で繰り返すようなプログラムを作りたいのですが・・・
>>782 コンソールアプリでって言うのはメッセージループもなし?だとしたら
タイマは使えないよ、WM_TIMERを処理できないわけだから。
SetTimerでHWNDにNULLを指定してlpTimerFuncに特定のコールバック関数を指定したら ウィンドウやWM_TIMERの受け皿がなくてもできるかもしれない。 と思ったけどMSDNに「WM_TIMER メッセージを処理する代わりに TimerProc 関数を使う場合も、呼び出し側スレッド内でメッセージをディスパッチ(転送)する必要があります。」 って書いてあるから多分無理。。。
マルチメディアタイマなら使えるんじゃない?
>>786 ありがとうございます。
これってコンソールから割と簡単に使えるものなんでしょうか。
Windowsのプログラミングにあまり詳しくないもので・・・
あまり実用例がないものならGUIに乗っけてつくろうかなと思います。
GUIアプリとしてスケルトンを作って、AllocConsoleでコンソールを開き、メインウィンドウを 不可視にしたうえでWM_TIMERを受け取るとか。
別に while(1){ func(); Sleep(1); } みたいにすれば良いと思うが。
>>788 なんか複雑そうですが、
timeGetTime()というのがコンソールから使えそうなので、これにしようと思います。
あとついでなのですが、コンソールではSleep関数は使えるのでしょうか。
コンソールってWindows上ではスレッドで動いてるのかな?
どうもWindowsは単純プログラマではわからんことが多い・・・
>>790 スレッドで動いてるって何だろう…何も特別なことをしなければ
シングルスレッドで動いてるよ。もちろんマルチスレッドにも出来る。
コンソールアプリだろうとGUIアプリだろうと同じ。
>>789 それも使う予定ですが、どうしても相対時間を測りたい部分があるので。
>>791 シングルスレッドというのは、windowsの他のプログラム(例えばWORDとか)と
基本的に同じってことでしょうか。
Windowsにしろ処理の流れは一本だから、どっかで無限ループなどに陥ったら
全体がとまってしまうのではないかと心配なんですけど。
マルチプロセス
MSWORDはマルチスレッドだが
796 :
デフォルトの名無しさん :2005/03/27(日) 17:40:12
DLLのプログラミングで自分自身のパスを知るにはどうしたら良いですか?
>>796 DllMain() に渡されるインスタンス ハンドルを、
GetModuleFileName() に指定する。
>>796 DllMainに渡されるモジュールハンドルをGetModuleFileNameでいいんじゃね?
DllMainって自分で書く機会ってあんまりないよね。
799 :
798 :2005/03/27(日) 17:51:56
800 :
796 :2005/03/27(日) 18:01:28
801 :
759 :2005/03/27(日) 18:36:01
>>780-781 何年も前にやったので、細部はよく憶えていないけど、いいみたい。
漢字(shift-JIS)は、自分は下記の format で、1バイト目、2バイト目を書き出している。
"\\\'%02x\\\'%02x" // 結果は、\'xx\'yy という形なる。
細かいことですが、unicode の漢字で、第1バイトと第2バイトとか逆転しているケースとか
あるようだけど、対応してません。(ソースを見たら、コメントに書いてあった)
HRESULTとLRESULTの違いってなんですか?
さあね
HRESULTはビットごとに意味があるよ
806 :
714 :2005/03/27(日) 20:19:49
>>801 日本語はそのエスケープであってるんだ。安心。
というわけでワードパッドで出力したファイルと照らし合わせて研究中。
いろいろありがとう。
>804-805 レスありがとうございます MSDNライブラリってこういうのも載ってるんですね 日本語のページ見難くて見つけられなかった;
>>807 日本語のページが見づらいのと英語のページで見つけられないってのは別物だぞ
俺だと日本語のページは見づらい以前に文字化けして読めない……。 どうしても英語のほうを読むしかない
encode
>>783 今日の自分は、
1)過去の自分が他人に見える
2)未来の自分からみると他人に見られる存在
っていう意味だろ?
812 :
809 :2005/03/28(月) 03:59:44
>>810 いや、エンコードは一通り試したつもりなんだ。
参考までに、他の人が正常に見れる場合の文字コードを教えてくれ
ただのShift JISだがもしかしてIEでしか見れないようにしているとかの罠があるんじゃないか?
便乗すると、漏れの場合は文字化けというか、左側のフレーム内が意味不明になります。 こんな感じ。これが普通? □MSDN ????? □???????? □???? ??? Embeaded ?? □.NET ?? 米国サイトなら普通に読めるんだけどね。
IEの言語設定は?
816 :
814 :2005/03/28(月) 09:45:59
日本語(自動設定)またはShift-JISです。 IEとFirefoxでエンコードをあれこれ試したけど、 右側部分はS-JISでないと文字化けするし、左側は設定に関係なく読めないみたいです。
IEのバージョンは? IE6ならWin98でも読めたがIE4だと化けるねー。
818 :
814 :2005/03/28(月) 09:58:48
OSはWin-XPで、IEは6.0.2900.2180.xpsp_sp2.rtm...なのにorz 米国サイトじゃないと出てこない情報もあるみたいだし、日本語版はあきらめました。
自動選択のチェックを外して、Shift_JISにするとどうなる? IEの自動設定はバグだらけなので、自社サイトも読めない可能性がある。
820 :
デフォルトの名無しさん :2005/03/28(月) 10:12:51
「フォントキャッシュの破損」なんかじゃないよね?
バグだらけという表現は適切ではないか。とにかく挙動はおかしい。
再インスコ
自分の作ってたプログラムで、CreateWindow の hinstance を指定する部分で、NULL を 指定していたことに今日気付きました。けど、普通に動いていました。 もし、NULL にしていたままだとして、どんなバグが出ると予想できますか? よろしければ、ご教授ください。
hInstanceの部分は2000/XPでは無視されたはず。 9xで不具合が出るかも知れんけど具体的には知らん。
なるほど、確かに自分は Windows2000 を使っております。 はじめて知りました。ありがとうございました!
リッチエディットにC++のstd::stringに入っているRTFを読ませようとして コールバック関数を組もうとしたんだけど、 具体的にどうしたらいいのかわからない(テキストの末尾に来たときの*pcbの処理とか、string.substr()とか) んで、誰かわかる人いない?
いる
bmpファイルの特定の範囲を読みこむ関数ってありますか? LoadImageで読みこんだイメージの特定の範囲をコピーでもいいんですが
複写の BitBlt(), 表示の SetDIBitsToDevice(), StretchBIBits() には 部分の指定が可能だが、読むときに一発てのはないんじゃない? bitmap data のところを、ま、1行ずつ読んで、対象外のところは読み飛ばす とか出来るが。
832 :
829 :2005/03/28(月) 19:07:23
あいうえお かきくけこ ↑こういうBMPファイルから「あ」とか「く」を取り出して表示したかったんですが こういうのはどうやってるんですか?
LoadImageしたHBITMAPをCompatibleDCにSelectDCして、 BitBltすれば解決とかそう言う話?
>>832 メモリデバイスコンテキストはわかりますか?
BMPファイルなんて単純な形式だから、 ファイルフォーマット調べて書き出せばいいんでない? 2時間もあれは出来ると思うけど。
837 :
デフォルトの名無しさん :2005/03/28(月) 21:14:27
質問です。DeleteObject(NULL)は安全ですか?
>>837 ヘルプ見ると
戻り値
関数が正常に終了した場合は、 TRUEを返します。
指定されたハンドルが有効でない場合や現在デバイス コンテキストに選択されている場合は、 FALSEを返します。
とあるが、はて
840 :
デフォルトの名無しさん :2005/03/28(月) 21:30:17
GetFileSizeで4Gバイト以上のファイルサイズを取得したいのですが、 なぜか下位DWORDが1バイト多く返ってきます。 この場合、どこが問題なのか教えてください。
841 :
840 :2005/03/28(月) 21:40:24
なんか、WinXPProSP2でファイルのプロパティを見ても1バイト多いです……
>834 CreateCompatibleDCでメモリに描画したりはなんとかできます あい かき というBMPファイルを読みこんでBitBltで描画しようとすると 「き」だけ描画することはできるんですが い き とか 「かき」 見たいになって 「あ、い、か」だけ描画することが出来ません; BitBlt(コピー先のデバイス、コピー先で描画したい座標X、同上Y、コピー先の幅、コピー先の高さ、コピー元のデバイス、 コピー元のx?、コピー元のy?、オプション)までは理解しているんですが?の部分がよくわかりません x、yで点を指定してそこからコピー元の画像をコピーするみたいなんですが これで「あ、い、か」は抽出できますか? 読みづらくてすみません;
843 :
840 :2005/03/28(月) 21:47:05
すみません、プログラム以前のイージーミスでした。忘れてください。
何でわざわざコピー元座標引数を無視するんだよ。
「あ」 の左上座標と縦横サイズがわかれば「あ」だけコピーできるでしょ
コピー元の座標引数って上記のコピー元のx?、コピー元のy? 以外にあるんですか?
複数回BitBltを実行するという発想がないような予感
>>848 Meadowやxyzzyでソースを書いて、clでコンパイルすれば解決。
>>848 何がやりたいのかいまいちよくわかりませんが。
VisualC++6.0とVisualC++.Netでは最初の選択画面が少し違うからそのせいで戸惑っているのかな?と思います。
メニューの
[ファイル] -> [新規作成] -> [プロジェクト]を選択
作るプロジェクトを択するダイアログがでるのでその左側から
[VisualC++ プロジェクト]のフォルダを開くと
Win32コンソールプロジェクト
Win32プロジェクト
がでるのでWin32プロジェクト選んで後は適当に。
IDE使いたくないならnmake.exeってのがあるので適当にMakefile書いてガンガレ
>847 あーそういう発想は無かったです; だめだ私orz
853 :
851 :2005/03/28(月) 22:31:40
ああ、
>>851 でWin32プロジェクト 選んだ後さらにダイアログが出る。
その左側の[アプリケーションの設定]っての選ぶと初期設定みたいのが選べるので
[空のプロジェクト]とかにチェックつけるとIDE用のプロジェクトやらソリューションだけの状態で
ソースは一切無しの状態になるっぽ
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
855 :
848 :2005/03/28(月) 22:55:06
みなさんありがとうございます。 空のプロジェクトを作ることが出来ました。 ですが、windows.hをインクルードするWinMainを使うサンプルが コンパイルできません。 とりあえずIDE ? の作ってくれる雛型を土台にいろいろいじっていこうと思います。 重ね重ねありがとうございました。
>>855 main()を使うようにコンパイルされてるんじゃない?
ならばコンパイラの設定や引数で指定してみれ。
LoadIcon関数は将来サポートされなくなる可能性があるので LoadImage関数を使うほうがいいと「猫」に書いてあったのですが本当ですか?
ディスプレイが32bitカラーモードのときに 32bitアイコンに含まれる16色や256色のアイコンを選んで 描画する方法を知りませんか?
862 :
デフォルトの名無しさん :2005/03/29(火) 02:17:59
知ってます
>>861 僕はそのやり方を知らないけど、質問する時は念のために、
「もし知っているならそのやり方を教えてください」も追加した方がいい。
864 :
861 :2005/03/29(火) 02:40:48
>>863 いえ、私は皆さんが方法を知っているかどうかを知りたかったのです。
865 :
861 :2005/03/29(火) 03:04:47
864は偽者です。
>>863 忠告ありがとうございます。
>>865 それで終わりかいっ!
実現方法は聞かないのかよw
ごめん、wと!は逆の方がしっくりくるので脳内変換よろ
868 :
861 :2005/03/29(火) 03:57:21
>>866 いや揚げ足を取られやすい質問の仕方だっただけで
こちらの意図は伝わってると思ったので…
ちなみに32bitアイコンのリソースを直接読みこんで
つまりアイコンファイルのフォーマットを解析して
ビットマップ情報から表示みたいな方法ではなく
もっとスマートな描画方法があるのなら教えてほしいのです。
>>868 explorer のような tree view でファイルを表示するのを、自分もやっていて
最近知ったのですが、tree view に付ける ImageList の生成のときに 16x16 に
するか、32x32 にするか、指定できますね。32x32 にすると tree view の行の
高さは高くなります。color depth も指定できます。
普通は、4 bit color のを使うか、8 bit color のを使うかは、モニタの指定に
従い、判別されるようです。該当するものがないときは、近いものが選ばれたり、
他のものから生成されるようです(ぼやけた絵になりますが)。
HICON を作るときや DrawIconEx() でも、サイズは指定しますが、depth は書く
必要がないのは、OS に任せろと言っているのか、サイズとdepthは、略リンクして
いるので、それに従うということではないかと想像しています。
古い MSDN サンプルに aniEdit, imagedit というのがあり、これ以降、新しい
資料がなさそうなので、ご覧になるといいかと思います。
871 :
デフォルトの名無しさん :2005/03/29(火) 13:33:15
DefaltGateway,DNSServerを取得できる関数ってないですか? IPアドレスとサブネットマスク、MACアドレスなどは取得できる関数はあったのですが。
Win32_NetworkAdapterConfigurationクラスにあったような・・・
874 :
861 :2005/03/29(火) 18:43:12
>>870 貴重なサンプルについて教えて頂いてありがとうございます。
仰る通り、何ビットのアイコンをロードするかはOSが判断しているようです。
MSDN で LookupIconIdFromDirectory の解説を見ると、
LoadIcon も LoadImage も現在の表示デバイスに合ったものを検索するとあります。
で、調べていて気がついたのですが、LoadImage のオプションで LR_VGACOLOR フラグを立てれば
16色に指定することだけはできるようです。でもその他の色数は指定できません。
結局、リソースから直接読み出す方法を試していたところ、以外と簡単にできてしまいました。
FindResource, LoadResource, LockResource, CreateIconFromResourceEx を使用する方法で
>>722 のリンク先に完全なサンプルがあります。
DrawTextは、char型のポインタを指定しますが、 wchar_t(ワイド文字)に対応した文字列描画関数はありますか? 無いとしたら、ワイド文字をマルチバイト文字へ変換させてから描画しないといけないのでしょうか? よろしくお願いいたします。
>>875 MSDNより。
int DrawText(
HDC hDC, // handle to DC
LPCTSTR lpString, // text to draw
int nCount, // text length
LPRECT lpRect, // formatting dimensions
UINT uFormat // text-drawing options
);
LPCTSTR だが…?
877 :
875 :2005/03/29(火) 22:43:19
>>876 「error C2664: 'DrawTextA' : 2 番目の引数を 'wchar_t *' から 'LPCSTR' に変換できません。」
LPCSTRとなってしまいます。
ソースコードでは、
::DrawText(m_hDC,pString,length,pRect,uFormat);
とDrawTextと指定してるんですが。。。
DrawTextA?
#define UNICODE もしくは #define _UNICODE 直接wchar_t版使いたいなら、DrawTextWを呼べ。
すみませんお聞きしたいのですが HBITMAPを開放するのでDeleteObjectを読んでたのですが MSDNによると 戻り値 ・指定したハンドルが有効でない場合、またはデバイスコンテキストでそのオブジェクトが選択されている場合は、0 が返ります。 解説 ・デバイスコンテキストで選択されている描画オブジェクト(ペンまたはブラシ)は削除しないでください。 とありますが、SelectObjectで選択されていても0以外の値を返すのですがHBITMAPの場合問題無いのでしょうか?
普通は使い終わったらSelectObjectで選択解除してからDeleteObjectする おそらくWindowsプログラミングの常識じゃないか? SelectObjectしたまんま開放なんてありえない。
881 :
デフォルトの名無しさん :2005/03/30(水) 02:27:33
>>877 // winuser.h
int DrawTextA(HDC hDC, LPCSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
int DrawTextW(HDC hDC, LPCWSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
#ifdef UNICODE
#define DrawText DrawTextW
#else
#define DrawText DrawTextA
#endif
882 :
デフォルトの名無しさん :2005/03/30(水) 05:29:10
DDBビットマップの、透過表示に使う、マスク画像の作り方についての質問です。 今は、GetPixelで色を調べながら、SetPixelで描画みたいにしているのですが、 BitBltのラスタオペレーションの組み合わせで、うまい事出来ないでしょうか。 出来るなら、やり方を教えてください。
883 :
デフォルトの名無しさん :2005/03/30(水) 09:09:58
プロセス間で、共有メモリを使ってBSTR型の文字列をやり取りする方法ないでしょうか? 文字列のサイズを気にせずにプロセス間で受け渡ししたいのですが・・・ やり方まで教えていただけると嬉しいです
>>883 「やり取り」というものの詳細がいまひとつわからんが
メモリマップトファイルとかは調べた?
>>883 ウィンドウ間ならWM_COPYDATAで楽に出来る。
>>883 ひょっとしたらWM_SETTEXTだけでOKだったりして
888 そう鴨
889 :
882 :2005/03/30(水) 13:55:39
890 :
883 :2005/03/30(水) 14:31:56
>>884 すみません。
もうちょっと詳しく状況書かないといけませんでしたね。。
「やり取り」というのは、共有メモリを使って他プロセスにBSTR型の文字列を渡したり受け取ったりしたい、という意味です。
今まで、CreateFileMappingとMapViewOfFile使ってchar*で文字列の受け渡ししてました。
これをBSTRでやりたい・・という魂胆です
とりあえず、BSTRのポインタだけ渡すのは明らかにダメだったので、実体全部を・・などと考えているんですが・・
ここでのプロセスで動かしてるのは両方コンソールアプリ型のWin32サービスです。
いい方法ないでしょうか。。
>>886 >>887 即レスありがとうございます。説明不足でした。
コンソール型のWin32サービスなので、ウィンドウメッセージは×なのです。
すみません。
BSTRサーバーでも作れば?
>>890 えーと、FileMappingではいけない理由は?
893 :
デフォルトの名無しさん :2005/03/30(水) 15:13:25
#include "stdafx.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { static char* moji; // TODO: この位置にコードを記述してください。 for(int i=0; i<10; i++) { wsprintf(moji,"ループ%d回目です。",i+1); MessageBox(NULL,mojip,"ループ",MB_OK); } return 0; } wsprintfを使用してループ回数を毎度表示するプログラムを組みたいのですが、コンパイルは通るもののこれを実行するとエラーで終了させられてしまいます。 char配列にすれば問題なく作動するのですがstatic char*で動かすにはどうすればよいのでしょうか。
894 :
893 :2005/03/30(水) 15:14:55
書き忘れました、static char*にかぎらずchar*のように配列ではなくポインタを使用したいのです。 よろしくおねがいします。
>>893 メモリを確保しろ
というか、Cの基礎をやり直して来い
×:MessageBox(NULL,mojip,"ループ",MB_OK); ○:MessageBox(NULL,moji,"ループ",MB_OK); です。何度もスミマセン。
>>893 たぶん君の頭だとVB使ったほうがいいよ。
>>894 ポインタがなにも指してないからダメですよ
static char* moji = "ほげほげ";
とかやるとか、ちゃんと実体のあるものを指すようにしましょう
ポインタとか話すのは素人、値とか参照、名前といえれば高級言語の エキスパートといえる
901 :
デフォルトの名無しさん :2005/03/30(水) 16:34:34
LPSTRやらHANDLEやら、Win32で定義されてるのは沢山あると思うんですが、 それの内容一覧とかありませんか?
>>901 PlatformSDKのヘッダーファイル
903 :
デフォルトの名無しさん :2005/03/30(水) 16:38:34
904 :
デフォルトの名無しさん :2005/03/30(水) 16:40:51
>>902 すいません、PlatformSDKのヘッダーファイルってwinbase.hとかですか?
>>893 char* moji;
moji = (char*)malloc(256);
:
wsprintf(moji,"ループ%d回目です。",i+1);
MessageBox(NULL, moji ,"ループ",MB_OK);
:
free(moji);
908 :
890 :2005/03/30(水) 17:04:26
883です。
>>891 BSTRサーバ!!
なるほど。確かにこれなら・・。
こういう選択肢もあるんですね!
共有メモリに固執するあまり、考えてもいませんでした。
選択肢の1つとして、検討してみます。
ありがとうございます!
>>892 すみません、FileMappingにこだわる理由、書いてませんでしたね。。
依頼主からの要望なんです。
「なんとか共有メモリ使ってBSTRを渡すようにできないか」、と。
できない理由はいろいろ試してみていくつか挙がってきてるのですが、
それを解決する方法がどこかにあるんじゃないか・・と。
すみません質問させてください。 シフトを5回連続で押した際に発生する固定キー機能の ダイアログを出ないようにしたいために以下のようなコードを書いたのですが 動作時に、「無効になったはずです。」のメッセージは出せるのですが その後にシフトを5回連続で押すと、やっぱりダイアログがでてしまいます。 これで良さそうな気がするのですが、何か見落としでもあるのでしょうか? 何かありましたら、宜しくお願いします。
910 :
909 :2005/03/30(水) 17:11:42
STICKYKEYS StickKeys; //STICKKEYS 構造体の初期化 StickKeys.cbSize= sizeof(STICKYKEYS); StickKeys.dwFlags= 0; //固定キー機能の値を取得するユーザプロファイル更新のために SPIF_UPDATEINIFILE を指定 if(SystemParametersInfo(SPI_GETSTICKYKEYS,sizeof(STICKYKEYS),&StickKeys,SPIF_UPDATEINIFILE) != 0) { } else{ /*失敗*/ return FALSE;} //現在5回シフトで、固定キーダイアログ発生が有効 if(StickKeys.dwFlags & SKF_HOTKEYACTIVE) { MessageBox(NULL,"なので、でないようにしたいです。","",MB_OK); StickKeys.dwFlags &= !SKF_HOTKEYACTIVE; if(StickKeys.dwFlags & SKF_HOTKEYACTIVE) {} else { MessageBox(NULL,"5回シフト押下でダイアログがでないようになったはず。","",MB_OK);} }
ネタか?
912 :
909 :2005/03/30(水) 17:22:03
>>911 すみません本気で書いてるつもりっす…。
何故そんなこと言われるのかも解らん状態です。><
913 :
デフォルトの名無しさん :2005/03/30(水) 17:24:47
>>912 911のような奴を相手にしないこと
この板にふさわしくないバカはほっとけ
つうか、ネタだろ、longhornのネタかw
SPI_SET*の存在についてよく考えて見ろ。
つーか、BSTRならCOMだろ。OutProcなCOMなら、マーシャリングは 共有メモリなんでねーのか。
917 :
909 :2005/03/30(水) 18:30:16
>>915 うおーーーーーーーーーーーーー!!俺馬鹿だ(爆
有難うございます。
なんで皆がネタかと言ってたか解りました。
お騒がせしてすみませんでした。
918 :
デフォルトの名無しさん :2005/03/30(水) 18:45:37
>>906 ありがとうございます!まさにそれです!
>>908 char型に変換して渡す。
受け側でBSTRに戻す。
>>919 charにしなくてもwchar_tで渡せばいいじゃん。
こんばんわ char mb[]="@niftyでインターネット Version 5.00について"; wchar_t wc[100000]; を mbstowcs(wc,mb,100000); を使いワイド文字に変換したのですが、 次のように文字化けがおきます。 何に問題があるのでしょうか? "@nifty?A?C???^?[?l?b?g Version 5.00?E?A?¢?A";
cのライブラリ関数の質問はスレ違い。たぶんlocale関連の問題。 mbstowcsに拘らずにマルチバイト文字列からワイド文字列への変換がしたいだけなら、 Win32API のMultiByteToWideCharでちゃんとコードページを指定してやればOK。
setlocale
>>898 文字列リテラルは書き換え出来ない(C/C++の規格では)
マスクされたビットマップ画像を扱いたいのですが、 猫でも〜のMaskBltだと95/98じゃ動作しないようなので 95/98でも使えるマスク画像はできないか (特定の色を透過色として透かす方法などがあれば) 教えてください。お願いします。
GDI+使う手もあるけどね。 あれは95じゃ駄目か?
DirectDraw使う手もあるナ
930 :
デフォルトの名無しさん :2005/03/31(木) 01:07:18
OS再起動時にあるファイルの削除をしたいのですが、 何のAPIを使えば良いですか?
WinAPIで発生するエラーの処理はどの程度行えばよいのでしょうか。 ほとんどの関数が何らかの形で(NULLであったり定数であったり) エラーを返すと思うのですが、やはり全てを考慮すべきなのでしょうか。 それとも、他の方のソースとの比較や経験則から、 エラーがほとんど発生しないような部分は割り切ってしまったほうが いいですか? 自分は学生です。 仕事などで使うような重要なプログラムを作っているわけではありません。 頻繁に使用する部分を、自分なりに使いやすいようにまとめている最中です。
935 :
デフォルトの名無しさん :2005/03/31(木) 02:06:47
ListViewで アイコン一覧とコメント(名称) のリストを作成したく LV_ITEM item; item.mask= LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; ・ ・ という感じでリストビューを表示したのはよいのですが、 項目が増えると、右にスクロール(水平スクロールバーが表示される)してしまいます。 下に項目が増えていく(垂直スクロールバーのみが表示される)ように設定するには どうすればよいのでしょうか。教えてください
また厨房か バカとか使うからすぐ分かるよな 明日から学校いけ
938 :
504 :2005/03/31(木) 05:29:55
超亀レス失礼します。
>>530 それは尤もなのですが・・・・・
>>534 コンソールを操作するAPIがちゃんとあるんですね。
貴重なアドバイスをどうもありがとう御座いましたm(_ _)m
>>537 Linuxのlessのソースを見たらコンソールを操作する関数があったのですが、
include ファイルも環境依存のものだったので、結局あまり参考になりませんでしたorz
UNIXのソースなんか読んでも参考にならんよ
>>934 さー?人それぞれケースバイケースだけど。
エラーは一応全部orほとんどハンドリングしておいて、大した
エラー時処理は入れないぐらいでいいんじゃない?
メッセージボックス出すとか。
デバッグに役立てる意味で。
横レスですが、
>>908 のBSTRサーバって何ぞや?
ぐぐったけどわからなかった。誰か教えてん。
942 :
908 :2005/03/31(木) 08:55:45
>>919 >>920 ありがとうございます。
やっぱり、FileMappingではそれしかなさそうですね。
BSTRをWCHARとDWORDに分解して、受け側で再構築させてみます。
まぁ、BSTRで渡す意味あるのってツッこまれたら、それまで、ですが。。
>>941 BSTRを受け渡しするだけのCOMサーバのことと理解してます。(誤解だったりして)
この場合、アウトプロセスになるのかな・・
この辺、自分もそんなに詳しくないので。。
これなら出来そうだ・・っていうイメージぐらいしか分かりませんが^^;;
BUTTON のフォントサイズはどうやって変更するんですか?
>>942 DLLに共有セクションを持たせることもできるな
945 :
942 :2005/03/31(木) 13:05:25
>>916 遅レスすみません。
ごもっともです。
確かに、アウトプロセスCOMなら、
共有メモリ使ってるのと似たような使い方考えられますね。
BSTR型とCOMを切り離して考えてたところが急所でした。。
>>944 なるほど!
COMまでいかなくても、DLLの共有セクションって手段もあるんですね。
共有メモリからDLL、COMという発想がでてきませんでした。
FileMappingでは限界と感じてるので、
DLLかCOMではどうか・・と、そっちの方向に振ってみる事にします。
アドバイスくれたみなさん、有難うございました!
946 :
934 :2005/03/31(木) 13:15:25
>>940 そうですね。
どうしても読みにくくなる部分以外は
とりあえずメッセージボックス入れるようにしていきます。
こだわりすぎで読みにくくなったりしたら元の木阿弥ですしね。
丁寧な回答ありがとうございました。
DeleteDC( hmemdc ) DeleteObject( hobj ) とかって、オブジェクトを削除する前に、(メモリ)デバイスコンテキスト から削除(解放)する必要があると学びました。 その手順を教えているサイトはあるのですが、それはなぜか説明されている ところを見つけることが出来ません。 ご存知のかたいらっしゃいますか?
949 :
デフォルトの名無しさん :2005/03/31(木) 20:52:49 BE:88200847-###
CClientDCを使うんだ!
950 :
デフォルトの名無しさん :2005/03/31(木) 21:05:02
>>948 探せばすぐ見つかると思うが。
基本は、
hNew = CreateXXXX();
hOld = SelectObject(hdc,hNew);
/* ここで描画 */
SelectObject(hdc,hOld);
DeleteObject(hNew);
ずれたこというな
952 :
926 :2005/03/31(木) 21:44:32
>927 既出スマソ。サンクス
>>948 SelectObjectしたものをきちんと戻してあるなら破棄する順番に関係はない。
ただ、作成した順・逆順で破棄するなど規則性があった方がわかりやすい。
メッセージループのデッドタイムを使って処理をしてるとき、 ウィンドウのキャプションバーをマウスで押下してると処理が止まるから てっきり何かメッセージが連続で発生してるもんだと思ったら、 DispatchMessage()でループが止まってた…。 なのにWM_TIMERとかWM_MOVEとかでプロシジャはしっかり呼ばれてる。 なんで???わけわかんねーorz
>>954 そういう一部のメッセージはメッセージループを通らず直接ウィンドウプロシージャへ送られる。
ちなみに自分からそういう風にメッセージを送りたければSendMessage()を使う。
PostMessage()だとメッセージループ経由になる。
956 :
デフォルトの名無しさん :2005/03/31(木) 23:43:51
難しい話してるなぁ…僕はいつになったらこの人達みたいになれるんだろう
>>956 めっちゃ簡単ですやん。
やればできる子ですやん。
>>955 おお!そうかそういうことなのか…。
返答thxです。
いや、何か連続でメッセージが送られてるなら
そのメッセージ取得中は別に自前の処理関数呼べばいいかな
と思ってたんだけどそれだとどうやら無理っぽいっすね…。
なんとか処理止めずにいけないものでしょうか…(´・ω・`)
デッドタイム使うのやめてスレッド作ったらどう?
960 :
958 :2005/04/01(金) 00:06:01
時代はやはりマルチスレッドなのか…。 いまだに抵抗あるんですけど挑戦してみます!(`・ω・´) ノ
質問です。 実行されているアプリの実行時のカレントディレクトリ(作業ディレクトリ)を知るには どうすればいいでしょうか? 例えば C:\program files\program\program.exe を D:\Work から実行した、または、 C:\program files\program\program.exe のショートカットを D:\Work作成して実行した といったケースで、実行中のprgram.exeを特定し、そこから D:\Work を導き出すことは 出来ないでしょうか? なお、GUIアプリを対象にするつもりなのでWindowハンドルを元にプログラムを特定する つもりです。
>>955 DefWindowProc内でメッセージループが回ってんじゃね?
MessageBoxみたいに。
Longhornの発売がまた延期(2008年初頭)になるそうで。 これぞMicrosoftクオリティ。
964 :
961 :皇紀2665/04/01(金) 02:21:53
Processを特定できればSTARTUPINFOという型の情報を持っていてそれで判るみたいですね。 もう少し調べてみます。自己完結失礼。
実行ファイルはGetModuleFileName使って、 作業ディレクトリGetCurrentDirectory使えば。
Advanced WindowsのLastMsgBoxInfoサンプルを参考にして、ExitProcessをフックするプログラムを書いてみたんですが、 フックできるexeと出来ないexeがあります。 画像ビューアのirfanviewと、Windows2000/XPのCMD.exeはフック出来ませんでした。 あと、explorer.exeのCreateProcessもフックできませんでした。 どうしてなんでしょうか。 (フックできているかどうかは、OutputDebugStringで確認しています) 環境は、Windows2000 VC++6です。
967 :
デフォルトの名無しさん :皇紀2665/04/01(金) 11:55:48
WHND m_whandle; m_whandle = GetActiveWindow(); if(m_whandle==NULL) AfxMessageBox("NULLっぽい",MB_ICONSTOP); ってな感じで、アクティブなウィンドウのハンドルを取得しようとしてるんですが、そのプログラム(自分)以外のウィンドウをアクティブにするとNULLが返ってきます。 どなたかお助け願います。
>>967 GetForegroundWindow
969 :
デフォルトの名無しさん :皇紀2665/04/01(金) 12:42:55
>>968 GetActiveWindowをGetForegroundWindowに変えたところ、ダイアログが出なくなったのでうまく行くかと思ったのですが、GetWindowTextで確認するとやはり何も変わっていないようです。
char buf[100];
WHND m_whandle;
m_whandle = GetForegroundWindow();
if(m_whandle!=NULL){
GetWindowText(m_whandle, buf, 1000);
MessageBox(NULL, buf, "DoGetForegroundWindow", MB_ICONSTOP);
}
突っ込んで良いのか・・・・? >>char buf[100]; >>GetWindowText(m_whandle, buf, 1000);
あと、WHNDってのも無い。
972 :
デフォルトの名無しさん :皇紀2665/04/01(金) 12:59:24
その場で書き足したんでミスってました、すまんす。 ソースは1000とHWNDになってます。
GetWindowText 指定されたウィンドウのタイトルバーのテキストをバッファへコピーします。指定されたウィンドウがコントロールの場合は、コントロールのテキストをコピーします。ただし、他のアプリケーションのコントロールのテキストを取得することはできません。 に気づいてしまいました。 他のアプリケーションは取得も無理ですか?具体的にはアクティブなウィンドウに張り付きたいのです。
>>973 GetForegroundWindowがコントロールを返すことは多分滅多にないんじゃないかな。
ホントだ・・・ダメダメじゃん、自分・・・orz
977 :
966 :皇紀2665/04/01(金) 14:31:42
別人です。 APIフックで悩んでおります。
次スレまだー?
979 :
デフォルトの名無しさん :皇紀2665/04/01(金) 16:55:19
Net meeting SDKに関する質問は ココでいいですか?
>>966 たぶんそのサンプルはIATしか変更してないからだね。
いくらロードされたモジュール毎にIATを変更して回っても、
直接ExitProcAddressに飛んでる場合には対応できない。
プロセスにロードされたExitProcAddress関数のコードそのものを
書き換えるのが確実。
タイミングが悪いと書き換え中に呼ばれたりするから
SuspendThreadかなんかで停止中に書き換える。
例えば、ExitProcAddressの頭を
jmp MyHook
みたいなコードに書き換えて、用が済んだら書き換えた箇所を元に戻して、
jmp ExitProcAddress
する。
ExitProcAddressじゃなくてExitProcessだね。
GetWindowTextは他のアプリからでも取得できたんじゃなかったっけ。 Win3.1とかからの互換性のためとかいって、 対象ウインドウのメッセージループが回ってなくても大丈夫だとか 聞いたことがあったけど。
>>984 その辺の話はAdvancedWindowsに載ってるね。
WM_COPYDATA関連の章で。
>>984 WM_GETTEXTを素で送るとWindowsがよろしくやってくれるんだが
GetWindowTextを使うとはねられる。
SendMessageとはやり方が違うのかもね>GetWindowText
ReadFileは一文字ずつ読み込めるのでしょうか? カンマで区切られたtxtデータを読み込んで カンマまできたら、そこまでの文字を読み込みたいのですが、 どうすればいいでしょうか?
>>989 先ず日本語を勉強しろ。
>カンマで区切られたtxtデータを読み込んで
>カンマまできたら、そこまでの文字を読み込みたいのですが
読み込んだ後に読み込みたいって矛盾してるように読めるぞ。
991 :
966 :int 2ch =05/04/01(金) 21:38:11
>>981 なるほど。
回答ありがとうございました。
その方法でやってみます。
>>989 効率は悪いだろうけどSetFilePointerと組み合わせれば出来るかもね。
>>989 ファイルサイズがそこまで大きくなければ、メモリ上に一度全て
読み込んでしまえ。無駄に感じる気持ちは解る。はじめの頃は。
つーか、そういうときぐらい素直にC/C++の標準ライブラリとか使ってやれよ。
995 :
989 :int 2ch =05/04/01(金) 21:59:49
スマソ。正直学力が足りなかった
996 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 22:10:55
↓スレスト
997 :
♥ :int 2ch =05/04/01(金) 22:16:25
998 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 22:18:55 BE:12600522-###
999でスレスト ↓
ならぬツイスト _/ ̄
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。