Win32API質問箱 Build124
■ このスレッドは過去ログ倉庫に格納されています
Win32APIについての質問はこちらへどうぞ。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで ■過去スレ Win32API質問箱 Build123 http://mevius.2ch.net/test/read.cgi/tech/1475897582/ Win32API質問箱 Build122 http://echo.2ch.net/test/read.cgi/tech/1451988219/ Win32API質問箱 Build121 http://echo.2ch.net/test/read.cgi/tech/1438695290/ Win32API質問箱 Build120 http://echo.2ch.net/test/read.cgi/tech/1428570962/ ■関連スレ Visual Studio 2017 Part4 http://mevius.2ch.net/test/read.cgi/tech/1509244956/ 【C++】 DirectX初心者質問スレ Part40 【C】 http://mevius.2ch.net/test/read.cgi/tech/1474782237/ >>466 > もっといい方法ないかな 「いい」はあなたの脳内でのみ定義された概念なので他人には答えようがない。 >>468 あなたが考える「いい」方法を教えてって意味でしょwww カーネルモードでFDDに保存 ユーザーモードはFDDの中身を定期的に読む これで良い >>469 答えたらそれは俺の「いい」と違うって言われるだけだろ プログラマなんてアスペキチばっかだから質問を読み取ってくれないのはよくあることよ それにDDKスレ見りゃ分かるが質問は海外ですべき。国内じゃ回答つかん 共有メモリだとデータ欠落がありえるから(受け渡し済みデータをメモリ内から消す仕組みを作るのが大変だから) FIFOにためて通知後にdeviceiocontrolで読み出させる いい方法はわからないが正しい方法はあるだろう システムはある方法が正解になる前提で全体ができている それに逆らうと別の局面で何か問題が発生する 煽りぬきで、まず「いい」の定義から。 信頼性を優先するのか、速度を優先するのか、ソースコードの使いやすさを優先するのか、メモリ消費を抑えることを優先するのか、等。 用途が挙げられてるからそこから読み取れってことよ その用途で実装するならこういう処理の方が「いい」となる 質問者や発注者は、何を優先し、何を犠牲にする覚悟があるかを明確にすることが必要。 それは金であったり時間であったりする。お前らの工数と人件費を犠牲にしたい場合が多い。 まあ、「いい」は人それぞれな部分はあるかもしれないけど、そこやこだわりが書かれて無いならテキトーで良いんじゃね? 「お手軽な」という程度の解釈で。 発注側が受注側にわざと曖昧な要件を出して、受注側が提案したアイデアを無償で手に入れるのも重要な技術。 いかにしてコストを相手に押し付けるかが重要になる。 相手の自尊心を刺激しつつ、情報をタダで引き出す技術は極めて重要。省資源の基本。 逆に言えば「CreateEventの通知と共有メモリ」ではダメな理由は何なのか? 当人(>>466 )が思うダメな理由が判れば、それを改善するものが「いい方法」なんじゃね? ネットワークモニターを共有メモリで実装すること考えたらダメと感じる理由分かるだろうよ ・・・・・この感覚・・・・・・感じるぞ・・・・・・ 共有メモリは誰が最後に開放するか問題があった気がする 代表プロセス(サービスとか)が全部やることにすればいいんだろうけど Win32APIでHDCに描画していくルーチンでPDFを作成できて、 プリンタドライバではなくDLLなどで提供されているものはありませんか? ユーザーが印刷でAcrobatなどを選択するのではなく、専用のコマンドを用意して、 DLLのAPIからHDCを作成してそこに描画していく、という方法を探しています。 ごめん、pdfiumは表示ができるけどPDF作成はできないんだった。 HDC って描いてるからダメなんだろうけど win32api じゃなくて良ければ matplotlib の dll >>486 いっそpdfを自分でゴリゴリ作るライブラリを作って公開しよう PDFは、Win32APIの範疇じゃないから、HDCにこだわる必要はないと思う。 どうしてもHDCで描くなら、ビットマップを使うことになる。 どうしてもHDCからデータを取る必要があるのなら、pdfじゃなくてemfはダメなの やっぱりこういうライブラリは無いものなんですかね。 プリンタのHDCに対する印刷処理は実装済みで、 普通にAcrobatなどを選んで印刷すればPDFは作成できるので、 PDF作成用のHDCさえ作れれば、Acrobatなどに依存せずに、 今の処理でPDFを作成できるんじゃないかと思った次第です。 もちろん、プリンタのHDCに描画する処理とは別に、 PDFを作成する処理を新たに作れば可能なんでしょうけど、 今の印刷結果と一致させるもの大変そうだと思いました。 HDC→bmp→手書きPDFの調子で画像埋め込みpdf生成 これで終わり。1日あればできるでしょw >>496 説明不足ですいません。 それだと文字がコピーできなくなってしまいます。 HDCをDLLから作れないと思う。プリンタドライバ入れないと無理じゃないかな それでもプリンタドライバを入れたくない&HDC使いたいってなら、手書きPDFしかないと思う HDC使う処理を全てフックして手書きPDF処理に渡して生成 フォントは埋め込めるし、当然座標指定もできるから見た目を合わせるのは難しいことじゃない EM_DOCUMENT_AddPageFromMetaHandleというメソッドがあるみたいだから試してみては。 $4995-が高いかどうかは自分で考えな。 https://github.com/sybrexsys/VersyPDF というものもある。 プロプロイエタリっぽいな。日本人にはまだ未踏の分野みたいだ。 IE(11)のタブってspy++で見ると、タブコントロールじゃないように見えるけど これ自前かな? タブの入れ替えの時も、タブがするすると動いて入れ替わる動作だし これってタブコントロールだと無理だよね? 基本的に、IE,Edge,Chrome,Firefox,Opera,Vivaldi等のブラウザのタブって タブコントロールじゃなくて、自前で描画しているのかな? char *p = "hello"; を書くと、「型 const char * の値を使用して型 char * のエンティティを初期化することはできません 」 と表示されるんだが、どうすればいいんだ? CQ出版社の『Win32 API完璧マスタ』189ページにも書いてある構文なのに・・・ char q[] = "hello"; char *p = q; そんなのはCスレで聞けよ char p[] = "hello"; こうか char q[] = "hello"; char *p = (char *)q; これをTextOutしたいんだが・・・ TextOut(hdc,10,10, p, strlen(p) ); と書いてもエラーになってしまうし、 pをqに変えてもエラーが出る >>513 「型 char * の引数は型 LPCWSFR のパラーメータと互換性がありません BOOL TextOutW(HDC,int,intLPCWSTR,)int: 引数 4 を char[6] から LPCWSTR へ変換できません。」 って出てしまう。 CQ出版社の本には、 「TextOut(ps.hdc,10,10, p, strlen(p) ); 」って書いてあるのに。 >>513 >508のエラーなのか TextOut のエラーなのか あー、面倒なので正確には調べないが、文字コードセットかソースファイルのコードを調べて 全部マルチバイト文字にでも統一すれ コンパイラのオプションでユニコードを使うを無効化しろ もしくはTCHARとかTextOutWとかTextOutAとかその辺でぐぐれ >>515 TextOutの際に、いちいち TextOut(hdc, 10, 10, TEXT("hello"), 5); と文字列と字数を毎回入力したくないし、 表示文字を"good morning"とか "good bye" とか違う字数の文字列にも置き換えたいんだ。 だから、変数を使って文字列をpとかqとかに置き換えたいんだけど、そこで 型 char * の引数は型 LPCWSFR のパラーメータと互換性がありません 」 とかのエラーが出てしまう。 charは1バイト文字の型 LPCWSTRは2バイト文字の型 ものが違うんだよ ってかwin32の本ならそのくらい書いてあるだろ。もし書いてないならゴミだから捨てろw TCHAR p[] = TEXT("hello"); TextOut(hdc, 10, 10, p ,lstrlen(p)); >>518 後から文字列を変更するのであれば、初期化の時に配列の要素数に注意 #define MAX_LENGTH 256; // 要素数に注意 TCHAR p[MAX_LENGTH] = TEXT("hello"); >>516-517 今から覚える人に非推奨のMBCS版を勧めるのはどうかと。 VSでも2015辺りからMBCS版のバグを治さず放置してたりするのだし。 「TCHAR p[MAX_LENGTH] = TEXT("hello");」 で「式が必要です」ってエラーが出てしまうし。 「TCHAR p[256] = TEXT("hello");」って直接に数値指定するとエラーメッセージが消えるから、 なんかdefineが働いてないっぽい >>523 すまんね 流石に気付くだろうと思って黙ってたけど、define文の末尾にうっかり余計なセミコロン付けてしまっているので注意してね とりあえずいまどきの環境なら、charはTCHAR、char *はLPTSTR、const char *はLPCTSTRを使い、リテラルはTEXTマクロで囲って 文字列操作関数はl付きの関数strlenならlstrlen、strcpyならlstrcmpなどに置き換えればほとんど問題はないよ いろいろと教えてもらい、スレの皆様、ありがとうございます。 自分、最終的にゲームっぽいのを作りたくって、 それで会話メッセージが何百個もあるから、どうしても文字列を変数にする必要があるんです。 エラーコード↓です。 「 TCHAR p[256] = TEXT("hello"); TextOut(hdc, 10, 10, p, lstrlen(p)); p = TEXT("good morning"); TextOut(hdc, 30, 30, p, lstrlen(p)); 」 こんな感じで、1つのpを使いまわしたいんです。 strcpyかとも思ったんですけど、「strcpy(p, TEXT("good morning") );」でも 「char*のパラメーターと互換性がありません」ってエラーが出て、なんか違いそうだし・・・ ググッても、Win32APIで1つの文字列変数を複数の文字列に何度も書き換える事例が見つからなくて、困ってます。 >>525 でstrcpyとstrcmpがごっちゃになってた、訂正 >>522 でもなこのレベルだとstrcpyすらできずに詰むぞw >>527 私なら(char *) にキャストしてしまいますね…これは悪手ですが 解決しました!こうですね 「 TCHAR p[MAX_LENGTH] = TEXT("hello"); TextOut(hdc, 10, 10, p, lstrlen(p)); lstrcpy(p, TEXT("good morning") ); TextOut(hdc, 30, 30, p, lstrlen(p)); 」 じぶん "lstrcpy" の存在を知りませんでした。 買ってたCQ出版社の本が2001年の本で古くって、 それで、ここら辺の話題が見当たらなくって、地元書店にWin32APIの本が無くって、 困ってました。月曜日に、銀行からカネを引き出して、都会の本屋に買い物に行こうかと思ってたところです。 質問に回答してくださった皆様、ありがとうございます。 >>527 中身を直接書き換えないならLPCTSTRで十分 LPCTSTR p = TEXT("hello"); p = TEXT("good morning"); >>533 LPTSTRなら可能だけどLPCTSTRだと無理じゃないかな >>513 TextOutA使え お前にTextOut/TextOutWはまだ早い >>534 無理と決め付ける前に、まずは試してみるべきじゃないかな。 >>507 やっぱり自前ですか。 ベースにコモンコントロールのタブコントロール使ってるかと思ったら どのブラウザも完全にオリジナルのタブコントロールを作ってる みたいなんですよね。 これだけで一仕事だ、せめて手を抜く方法が無いものか。 コモンコントロールでつくりゃいい 何も真似することないでしょ >>508 レスをつけてたここの住人はある意味、意地悪だなw 508よ、VS2017とか使ってるなら、プロジェクトのプロパティから、 構成プロパティ -> C/C++ -> 言語 の画面に、準拠モードという項目があるので、準拠モードをオフにしてみろ。 コンパイラが悪さしているだけだw たとえば、準拠モードONだとこのコードは、こんなエラーになる。オフなら無事コンパイルできる。 #include <stdio.h> int main(){ char *p = "hoge\n"; printf(p); return 0; } 1>------ ビルド開始: プロジェクト: test0001, 構成: Debug Win32 ------ 1>test0001.cpp 1>d:\test0001\test0001\test0001.cpp(3): error C2440: '初期化中': 'const char [6]' から 'char *' に変換できません。 1>d:\test0001\test0001\test0001.cpp(3): note: 文字列リテラルからの変換では const 修飾子が失われます (/Zc:strictStrings を参照) 1>プロジェクト "test0001.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== マルチバイト文字の設定しろって書き忘れた。 構成プロパティ -> 全般 -> 文字セット マルチバイト文字セットを使用する の項目をセットしておけ。 古い本ベースで作るならそっちで十分だ。 慣れて来たらunicode文字セットにしてwchar_tとか使えばいいよ。 >>541 本読んでる初心者相手に、難しいこと言って混乱させるよりはいいだろう。 まずは動くようにするのが先じゃね?w コンパイラとか言う野郎最悪だな そんなもんに頼むなよ >>542 意地悪も何も、そのレスをとっくにしとるんだが cygwin/mingw-gcc で文句がでなければ、ほぼ問題ない、としています 成功した時に返り値が0になることがあるのに、失敗したら0を返しますとか言ってるAPIって何なんだよクソ野郎め もちろんそんなの知ってるけど、GoがWindows API用に生成してくれるコードが返り値をチェックしちゃっててしばらくハマった >成功した時に返り値が0になることがあるのに、失敗したら0を返しますとか言ってるAPI ちなみにどのAPI? Goがクソなだけじゃん リファレンス読んでコード生成しろよバーカ >>549-550 「失敗が返って来たときは関数を呼びます」 だっけ >>549 「失敗したら0を返します」の対偶は「非ゼロが返ったら成功している」だ。 「成功したら非ゼロを返す」ではない これが分からない人には if文は書けない >関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。 これな >>557 >>拡張エラー情報を取得するには、 関数を使います。 これがわからない人には、プログラムは書けない >>554-555 >リファレンス読んでコード生成しろよバーカ >失敗が返って来たときは関数を呼びます しばしば、動詞の主語がないせいで誰が対象なのか、わからないことが多い。 バカなのは誰なのか。 関数を呼ぶのは誰なのか、関数が関数を勝手に呼んでくれるのか。 的な。 まさかと思うけど英語読めないとか? 戻り値 関数が成功すると、要求した値が返ります。 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。 https://msdn.microsoft.com/ja-jp/library/cc364638.aspx Return value Type: ULONG_PTR If the function succeeds, the return value is the requested value. If the function fails, the return value is zero. To get extended error information, call GetLastError. https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms633581 (v=vs.85).aspx ダークサイドの貧乏マは、インターネットのどこかにWin*2 Pr*gramm*rs' Refer*nceというヘルプファイルがあるから、別に。。。まあ、できる奴はサプスクリプションをイッチャッテ。 >>561 このひどい訳文はテンプレのようになってて このGetClassLongPtr()の例だけじゃなく Win32APIのいたるところで見るんだが ほんとうにやめてほしい >>562 , >>565 訳が酷いと言うよりなぜかわからんが関数名(GetLastError)が無くなってるって話だろ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる