Win32API質問箱 Build124

■ このスレッドは過去ログ倉庫に格納されています
2017/11/11(土) 19:23:00.69ID:TpLoCFAx
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/
2018/06/24(日) 11:09:06.07ID:Ki1yi8uD
>>436
リソースエディタがWin32APIに関係ないって?

>>437
誤解です。関係ない話を勝手に結び付けないで下さい。
2018/06/24(日) 11:19:47.20ID:Ki1yi8uD
5ちゃんねるは、広告料と浪人の収益によって成り立っています。
2018/06/24(日) 11:21:10.11ID:7l22t7T7
関係ないよ
質問内容によってはリソース編集が関係してくることはあるが、そんなソフトが関係することはまずない
2018/06/24(日) 11:23:27.52ID:Ki1yi8uD
コマーシャルの仕組みについて皆さまのご理解をお願い致します。
2018/06/24(日) 11:24:22.52ID:Ki1yi8uD
>>440
お前の中ではな。
2018/06/24(日) 11:39:26.10ID:Ki1yi8uD
お前ら、Win32を知り尽くしているんだろ?
だれかReactOSで日本語入力できるようにしてくれよ。
44441
垢版 |
2018/06/24(日) 11:48:47.83ID:iIAhljkC
Win32Apiで何ができるかをを知り尽くしているが
Win32Apiが何をしているのかは何も知らない
2018/06/25(月) 01:12:02.96ID:R9m7k+sg
if(sa::sendkey[cnt]!=NULL){
if(sa::sendcontrol[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, VK_CONTROL, 0 );
if(sa::sendalt[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, VK_MENU, 0 );
if(sa::sendshift[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, VK_SHIFT, 0 );
SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, sa::sendkey[cnt], 0 );
SendNotifyMessage(sa::hWndSa, WM_KEYUP, sa::sendkey[cnt], 1);
if(sa::sendshift[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYUP, VK_SHIFT, 1);
if(sa::sendalt[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYUP, VK_MENU, 1);
if(sa::sendcontrol[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYUP, VK_CONTROL, 1);
}
sa::sendkeyにデータキーが有る時、sa::sendcontrol、sa::sendalt、sa::sendshiftがtrueならば、
「Ctrl+Alt+Shift+データキー」といったふうに送信したいのですが、
データキーしか送信されません。
何がいけないのでしょうか?
2018/06/25(月) 07:03:38.33ID:euNVlzH4
keybd_eventもしくはsendinput使う
2018/06/25(月) 18:46:39.01ID:oo6U7F08
??非アクティブウィンドウのままがいいならこれでどうでしょう
ShiftとEndの同時押しが出来ることを確認しました

void send_shift_and_end()
{
HWND hWnd = FindWindow(L"Notepad", NULL);
if (hWnd == NULL) {
return;
}
HWND hEdit = FindWindowEx(hWnd, NULL, L"Edit", L"" );
if (hEdit == NULL) {
return;
}
BYTE kstats[256], shiftstat;
DWORD srctid, dsttid;
srctid = GetCurrentThreadId();
dsttid = GetWindowThreadProcessId(hEdit, NULL);
AttachThreadInput(srctid, dsttid, TRUE);
GetKeyboardState(kstats); // 実行前の状態を保存
shiftstat = kstats[VK_SHIFT];
kstats[VK_SHIFT] |= 0x80; // shift を押下状態に
SetKeyboardState(kstats); // 状態を更新
SendMessage(hEdit, WM_KEYDOWN, VK_END, 0); // SendMessage は OK, PostMessageは NG
kstats[VK_SHIFT] = shiftstat;
SetKeyboardState(kstats); // 実行前の状態に復帰
}
2018/06/25(月) 20:01:44.94ID:R9m7k+sg
レスありがとうございます。

このようにしてみたのですが、送りたいウィンドウがもともとアクティブな時は送信されるのですが、
アクティブ出ない場合、アクティブに出来ずに居ます。

if(sa::sendkey[cnt]!=NULL){
 //ターゲットををアクティブに
 HWND hWndTemp = SetActiveWindow(sa::hWndSa);
 char t0[256 + MAX_PATH];
 sprintf(t0, "sa::hWndSa:%d(%x), hWndTemp:%d(%x)", sa::hWndSa, sa::hWndSa, hWndTemp, hWndTemp);
 strscr_set(t0);

 //Key Event送信
 if(sa::sendcontrol[cnt]) keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
 if(sa::sendalt[cnt]) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
 if(sa::sendshift[cnt]) keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
 keybd_event(sa::sendkey[cnt], 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
 keybd_event(sa::sendkey[cnt], 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
 if(sa::sendshift[cnt]) keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP | 0, 0);
 if(sa::sendalt[cnt]) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
 if(sa::sendcontrol[cnt]) keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

 //元のウィンドウをアクティブに
 SetActiveWindow(hWndTemp);
}

デバッグ情報を見る限り、ウィンドウハンドルは取得できてます。何がまずいのでしょうか?
2018/06/25(月) 20:03:32.63ID:R9m7k+sg
ちょっと>>447さんの方法も試してみます。
有り難うございます。
2018/06/25(月) 20:32:07.52ID:RnBLs+IR
Ctrl+Alt+Delは、セキュリティで保護されているんじゃ中田家?
2018/06/25(月) 21:13:56.50ID:R9m7k+sg
>>447さんの方法で無事うごきました。
ありがとうございましたm(_ _)m
2018/06/25(月) 21:31:41.84ID:f6L/NlJ0
SetActiveWindow の代わりに SetForegroundWindow を試してみたら?
2018/06/25(月) 21:35:50.33ID:I2eYxQBJ
blinkWindowtop
2018/06/30(土) 18:06:34.48ID:RTJdtcUh
言いたかないがCOMでマジで糞だなと思うのは
アパートメントか何だか知らないが
勝手に内部でメッセージループ回すな!!!
たまにそうなって通常ではあり得ない順番で関数が呼ばれてデッドロックするんだよ糞野郎
そういう糞メソッド見つけるたびにメインスレッドとは別のスレッドで実行するように書き直すんだが
実に馬鹿らしい
どのオブジェクトのどのメソッドでそうなる可能性が有るかMSDNのどこにも書かれてないしな
どうしろと
2018/06/30(土) 18:25:36.41ID:SPR6zsx0
別スレッドにしたら余計危ないだろw
2018/06/30(土) 19:40:38.36ID:RTJdtcUh
いやまじでさ
しかも今まで大丈夫だったのに最近のWindows10のアップデートを当てたら
なぜかメッセージループ回すようになったやつとかあるし
いつ何のタイミングでメッセージループが回るか分からねぇ
アパートメントモデルはマジで糞過ぎ
全部マルチスレッド対応でいいだろ意味不明
2018/06/30(土) 19:45:02.11ID:RTJdtcUh
ただスレッドモデルのせいでメッセージループが回ってるのかどうかは良くわからないんだがな
原因は分からんが勝手にメッセージループ回すのはマジで迷惑だからやめてほしい
何がどの順で実行されるか分からなくなるから
458デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:09:52.47ID:gFgZc5FG
548
2018/07/05(木) 06:45:33.22ID:uNMy++3S
Direct2D いいね。
4K画像もヌルヌルに縮小拡大表示できる。回転や鏡像反転も大丈夫だった。
2018/07/06(金) 20:02:27.82ID:xJt/yCDq
1台のPCにマウスAとBを接続し、
マウスAは普通のマウスとしてWindowsで、マウスBを特定のプログラムのみで使いたいのですが
どのようにすればよいでしょうか?
2018/07/06(金) 20:26:18.50ID:uwYbJKCZ
特定のプログラムのみで使うってのをどういう意味にするかだな
フィルタードライバ作ってBを潰すと同時に操作をアプリに送って、アプリから特定のプログラムへマウスメッセージでも送るとか
2018/07/08(日) 20:51:40.89ID:O/180cHX
Low-Level Mouse HookでデバイスIDは取れなかったと思うし
ソフトでやる場合ドライバまで降りるしかないね
2018/07/08(日) 23:36:33.06ID:aNDdpi7h
GetGlyphOutlineでサロゲートペアの文字のビットマップを取得するには
どうすればいいでしょうか
普通の2バイトの文字はできます

調べると、グリフインデックスを取得して〜みないな内容は
ぽつぽつ見つかったのですがよくわかりません
コピペして適当に真似てみたのですが、GGO_GLYPH_INDEXを指定すると
謎の小さいデータ(abc間隔とかいうやつでしょうか)が返ってくるだけです
これまた試しにGGO_GRAY8_BITMAP | GGO_GLYPH_INDEX とやってもサイズは0でした
464デフォルトの名無しさん
垢版 |
2018/07/09(月) 17:38:45.00ID:1p1eFn95
INDEXをもらったら本体を取りに行く
2018/07/09(月) 21:03:04.88ID:xF/N3z+3
>>464
それはINDEXから直接アウトラインデータを持ってきて自前で処理するという意味でしょうか
本体を取りに行くというのがわからないです
2018/07/10(火) 19:32:28.56ID:Q7aC7GqH
カーネルモードからユーザーモードアプリにデータを渡すいい方法ないかな?
イメージとしてはマウスのボタンを押したらその情報をアプリが受け取るとか、ネットワークメッセージを受信したらそれをアプリに渡すというもの
CreateEventの通知と共有メモリ使えばできるけど、もっといい方法ないかな
2018/07/15(日) 04:33:45.21ID:Fuh1W0mR
>>463
これですがインデックス取得後、GGO_GRAY8_BITMAP | GGO_GLYPH_INDEXで
普通にサロゲートペアのビットマップを取得することが出来ました
原因は単にテストに使用していたフォントがサロゲートペアに対応してなかっただけでした…

もしそういうフォントの場合は
自分で取得前に代替フォントに切り替えるという認識であってますか
それともどこかで指定する方法はあるんでしょうか
2018/07/15(日) 07:18:20.84ID:F1eG7opL
>>466
> もっといい方法ないかな


「いい」はあなたの脳内でのみ定義された概念なので他人には答えようがない。
2018/07/15(日) 07:30:49.51ID:8618Mha6
>>468
あなたが考える「いい」方法を教えてって意味でしょwww
2018/07/15(日) 07:36:07.14ID:iXIp3nZ5
カーネルモードでFDDに保存
ユーザーモードはFDDの中身を定期的に読む

これで良い
2018/07/15(日) 08:27:47.61ID:GnA/ld69
>>469
答えたらそれは俺の「いい」と違うって言われるだけだろ
2018/07/15(日) 08:54:59.84ID:JD67P8Kl
プログラマなんてアスペキチばっかだから質問を読み取ってくれないのはよくあることよ
それにDDKスレ見りゃ分かるが質問は海外ですべき。国内じゃ回答つかん

共有メモリだとデータ欠落がありえるから(受け渡し済みデータをメモリ内から消す仕組みを作るのが大変だから)
FIFOにためて通知後にdeviceiocontrolで読み出させる
2018/07/15(日) 09:02:55.50ID:TNInTYOo
いい方法はわからないが正しい方法はあるだろう
システムはある方法が正解になる前提で全体ができている
それに逆らうと別の局面で何か問題が発生する
2018/07/15(日) 14:57:39.97ID:F1eG7opL
煽りぬきで、まず「いい」の定義から。
信頼性を優先するのか、速度を優先するのか、ソースコードの使いやすさを優先するのか、メモリ消費を抑えることを優先するのか、等。
2018/07/15(日) 15:00:46.43ID:JD67P8Kl
用途が挙げられてるからそこから読み取れってことよ
その用途で実装するならこういう処理の方が「いい」となる
2018/07/15(日) 15:19:18.62ID:F1eG7opL
質問者や発注者は、何を優先し、何を犠牲にする覚悟があるかを明確にすることが必要。
それは金であったり時間であったりする。お前らの工数と人件費を犠牲にしたい場合が多い。
2018/07/15(日) 15:24:35.14ID:blM5pGUx
まあ、「いい」は人それぞれな部分はあるかもしれないけど、そこやこだわりが書かれて無いならテキトーで良いんじゃね?
「お手軽な」という程度の解釈で。
2018/07/15(日) 15:38:50.77ID:F1eG7opL
発注側が受注側にわざと曖昧な要件を出して、受注側が提案したアイデアを無償で手に入れるのも重要な技術。
いかにしてコストを相手に押し付けるかが重要になる。
479デフォルトの名無しさん
垢版 |
2018/07/15(日) 16:39:00.88ID:F1eG7opL
相手の自尊心を刺激しつつ、情報をタダで引き出す技術は極めて重要。省資源の基本。
480デフォルトの名無しさん
垢版 |
2018/07/15(日) 18:54:11.43ID:z9dis41F
>>471
だよな
2018/07/15(日) 19:02:18.64ID:/PIdnGOp
逆に言えば「CreateEventの通知と共有メモリ」ではダメな理由は何なのか?
当人(>>466)が思うダメな理由が判れば、それを改善するものが「いい方法」なんじゃね?
2018/07/15(日) 19:29:32.13ID:JD67P8Kl
ネットワークモニターを共有メモリで実装すること考えたらダメと感じる理由分かるだろうよ
2018/07/15(日) 19:54:05.79ID:JjtknQT5
・・・・・この感覚・・・・・・感じるぞ・・・・・・
484デフォルトの名無しさん
垢版 |
2018/07/16(月) 09:41:18.75ID:Tl1DHPio
memory mapped file
2018/07/16(月) 11:29:16.36ID:fjsGqhw7
共有メモリは誰が最後に開放するか問題があった気がする
代表プロセス(サービスとか)が全部やることにすればいいんだろうけど
2018/07/17(火) 09:35:44.28ID:3FwnZhxD
Win32APIでHDCに描画していくルーチンでPDFを作成できて、
プリンタドライバではなくDLLなどで提供されているものはありませんか?

ユーザーが印刷でAcrobatなどを選択するのではなく、専用のコマンドを用意して、
DLLのAPIからHDCを作成してそこに描画していく、という方法を探しています。
2018/07/17(火) 11:31:49.15ID:iiy4NiaP
pdfium
2018/07/17(火) 11:36:41.73ID:iiy4NiaP
ごめん、pdfiumは表示ができるけどPDF作成はできないんだった。
489デフォルトの名無しさん
垢版 |
2018/07/17(火) 14:53:09.38ID:+kxKOOfA
HDC って描いてるからダメなんだろうけど
win32api じゃなくて良ければ
matplotlib の dll
2018/07/17(火) 15:02:10.66ID:Zb0J/52v
>>486
いっそpdfを自分でゴリゴリ作るライブラリを作って公開しよう
2018/07/17(火) 19:29:45.08ID:8vhfTmzU
PDFつくるの割と簡単だからな。読むのは難しいが
2018/07/17(火) 21:32:24.00ID:o/CsZXJt
PDFは、Win32APIの範疇じゃないから、HDCにこだわる必要はないと思う。
どうしてもHDCで描くなら、ビットマップを使うことになる。
2018/07/17(火) 21:46:38.93ID:zCwWixNA
>>486
libharu
手書きPDF (http://www.kobu.com/docs/pdf/pdfxhand.htm)
2018/07/17(火) 23:12:07.09ID:Zb0J/52v
どうしてもHDCからデータを取る必要があるのなら、pdfじゃなくてemfはダメなの
495486
垢版 |
2018/07/18(水) 09:13:26.55ID:b6TTATjh
やっぱりこういうライブラリは無いものなんですかね。

プリンタのHDCに対する印刷処理は実装済みで、
普通にAcrobatなどを選んで印刷すればPDFは作成できるので、
PDF作成用のHDCさえ作れれば、Acrobatなどに依存せずに、
今の処理でPDFを作成できるんじゃないかと思った次第です。

もちろん、プリンタのHDCに描画する処理とは別に、
PDFを作成する処理を新たに作れば可能なんでしょうけど、
今の印刷結果と一致させるもの大変そうだと思いました。
2018/07/18(水) 09:30:56.80ID:XytxFrpz
HDC→bmp→手書きPDFの調子で画像埋め込みpdf生成
これで終わり。1日あればできるでしょw
2018/07/18(水) 09:32:44.92ID:b6TTATjh
>>496
説明不足ですいません。
それだと文字がコピーできなくなってしまいます。
2018/07/18(水) 10:32:30.08ID:w8OpeSfX
>>469
じゃぁそう書けばいいじゃん
2018/07/18(水) 10:35:38.58ID:w8OpeSfX
>>497
まさにここに>>471の実例がw
2018/07/18(水) 10:49:35.82ID:XytxFrpz
HDCをDLLから作れないと思う。プリンタドライバ入れないと無理じゃないかな
それでもプリンタドライバを入れたくない&HDC使いたいってなら、手書きPDFしかないと思う
HDC使う処理を全てフックして手書きPDF処理に渡して生成
フォントは埋め込めるし、当然座標指定もできるから見た目を合わせるのは難しいことじゃない
2018/07/18(水) 11:39:33.38ID:2uaoDzyj
https://www.colorpilot.com/emf2pdfsdk.html
502デフォルトの名無しさん
垢版 |
2018/07/18(水) 17:17:05.71ID:r2tNZQmN
EMFがPDFになってもうれしくないんだよな
2018/07/18(水) 19:00:09.03ID:1yGq4zZr
嬉しいとか悲しいという感情はしまい込め
2018/07/18(水) 19:44:08.79ID:IL3iPWys
EM_DOCUMENT_AddPageFromMetaHandleというメソッドがあるみたいだから試してみては。
$4995-が高いかどうかは自分で考えな。

https://github.com/sybrexsys/VersyPDF
というものもある。
2018/07/18(水) 21:34:56.01ID:2uaoDzyj
プロプロイエタリっぽいな。日本人にはまだ未踏の分野みたいだ。
2018/07/21(土) 18:28:47.97ID:TBQGTmI1
IE(11)のタブってspy++で見ると、タブコントロールじゃないように見えるけど
これ自前かな?
タブの入れ替えの時も、タブがするすると動いて入れ替わる動作だし
これってタブコントロールだと無理だよね?

基本的に、IE,Edge,Chrome,Firefox,Opera,Vivaldi等のブラウザのタブって
タブコントロールじゃなくて、自前で描画しているのかな?
2018/07/21(土) 22:53:51.14ID:diLgD0pr
基本的に自前だよ
508デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:11:05.29ID:0LoJ4eZK
char *p = "hello";
を書くと、「型 const char * の値を使用して型 char * のエンティティを初期化することはできません 」
と表示されるんだが、どうすればいいんだ?
CQ出版社の『Win32 API完璧マスタ』189ページにも書いてある構文なのに・・・
2018/07/22(日) 17:13:16.23ID:Xbb1Ck+x
スレタイ
510デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:14:28.87ID:LiIRy0eu
char q[] = "hello";
char *p = q;
2018/07/22(日) 17:14:46.72ID:V5NblbDe
そんなのはCスレで聞けよ
char p[] = "hello";
512デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:15:10.69ID:LiIRy0eu
こうか

char q[] = "hello";
char *p = (char *)q;
513デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:20:17.81ID:0LoJ4eZK
これをTextOutしたいんだが・・・
TextOut(hdc,10,10, p, strlen(p) );
と書いてもエラーになってしまうし、
pをqに変えてもエラーが出る
514デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:26:49.45ID:0LoJ4eZK
>>513
「型 char * の引数は型 LPCWSFR のパラーメータと互換性がありません
BOOL TextOutW(HDC,int,intLPCWSTR,)int: 引数 4 を char[6] から LPCWSTR へ変換できません。」
って出てしまう。

CQ出版社の本には、
「TextOut(ps.hdc,10,10, p, strlen(p) ); 」って書いてあるのに。
2018/07/22(日) 17:27:01.83ID:+kDBWEhy
>>513
>508のエラーなのか TextOut のエラーなのか
2018/07/22(日) 17:29:03.13ID:+kDBWEhy
あー、面倒なので正確には調べないが、文字コードセットかソースファイルのコードを調べて
全部マルチバイト文字にでも統一すれ
2018/07/22(日) 17:30:27.51ID:V5NblbDe
コンパイラのオプションでユニコードを使うを無効化しろ
もしくはTCHARとかTextOutWとかTextOutAとかその辺でぐぐれ
518デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:33:51.95ID:0LoJ4eZK
>>515
TextOutの際に、いちいち
TextOut(hdc, 10, 10, TEXT("hello"), 5);
と文字列と字数を毎回入力したくないし、
表示文字を"good morning"とか "good bye" とか違う字数の文字列にも置き換えたいんだ。

だから、変数を使って文字列をpとかqとかに置き換えたいんだけど、そこで
型 char * の引数は型 LPCWSFR のパラーメータと互換性がありません 」
とかのエラーが出てしまう。
2018/07/22(日) 17:36:00.67ID:V5NblbDe
charは1バイト文字の型
LPCWSTRは2バイト文字の型
ものが違うんだよ
ってかwin32の本ならそのくらい書いてあるだろ。もし書いてないならゴミだから捨てろw
2018/07/22(日) 17:38:56.62ID:2bRdLxLs
TCHAR p[] = TEXT("hello");

TextOut(hdc, 10, 10, p ,lstrlen(p));
2018/07/22(日) 17:45:11.99ID:2bRdLxLs
>>518
後から文字列を変更するのであれば、初期化の時に配列の要素数に注意

#define MAX_LENGTH 256; // 要素数に注意

TCHAR p[MAX_LENGTH] = TEXT("hello");
522デフォルトの名無しさん
垢版 |
2018/07/22(日) 17:55:50.38ID:SZ8yn981
>>516-517
今から覚える人に非推奨のMBCS版を勧めるのはどうかと。
VSでも2015辺りからMBCS版のバグを治さず放置してたりするのだし。
523デフォルトの名無しさん
垢版 |
2018/07/22(日) 18:02:40.99ID:0LoJ4eZK
「TCHAR p[MAX_LENGTH] = TEXT("hello");」
で「式が必要です」ってエラーが出てしまうし。
「TCHAR p[256] = TEXT("hello");」って直接に数値指定するとエラーメッセージが消えるから、
なんかdefineが働いてないっぽい
2018/07/22(日) 18:09:58.01ID:lnBo9wWY
>>521
「256」の後の「;」は不要
2018/07/22(日) 18:17:18.42ID:2bRdLxLs
>>523
すまんね
流石に気付くだろうと思って黙ってたけど、define文の末尾にうっかり余計なセミコロン付けてしまっているので注意してね

とりあえずいまどきの環境なら、charはTCHAR、char *はLPTSTR、const char *はLPCTSTRを使い、リテラルはTEXTマクロで囲って
文字列操作関数はl付きの関数strlenならlstrlen、strcpyならlstrcmpなどに置き換えればほとんど問題はないよ
2018/07/22(日) 18:18:05.39ID:2bRdLxLs
被った、
指摘ありがとう>>524
527デフォルトの名無しさん
垢版 |
2018/07/22(日) 18:19:49.25ID:0LoJ4eZK
いろいろと教えてもらい、スレの皆様、ありがとうございます。

自分、最終的にゲームっぽいのを作りたくって、
それで会話メッセージが何百個もあるから、どうしても文字列を変数にする必要があるんです。

エラーコード↓です。

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つの文字列変数を複数の文字列に何度も書き換える事例が見つからなくて、困ってます。
2018/07/22(日) 18:20:26.15ID:2bRdLxLs
>>525でstrcpyとstrcmpがごっちゃになってた、訂正
2018/07/22(日) 18:20:35.42ID:V5NblbDe
>>522
でもなこのレベルだとstrcpyすらできずに詰むぞw
2018/07/22(日) 18:24:33.44ID:2bRdLxLs
>>527
多分 lstrcpy でいける
2018/07/22(日) 18:26:03.58ID:+jM3tBOE
>>527
私なら(char *) にキャストしてしまいますね…これは悪手ですが
532デフォルトの名無しさん
垢版 |
2018/07/22(日) 18:26:33.56ID:0LoJ4eZK
解決しました!こうですね

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の本が無くって、
困ってました。月曜日に、銀行からカネを引き出して、都会の本屋に買い物に行こうかと思ってたところです。

質問に回答してくださった皆様、ありがとうございます。
2018/07/22(日) 18:26:39.79ID:lnBo9wWY
>>527
中身を直接書き換えないならLPCTSTRで十分
LPCTSTR p = TEXT("hello");
p = TEXT("good morning");
2018/07/22(日) 18:36:11.82ID:2bRdLxLs
>>533
LPTSTRなら可能だけどLPCTSTRだと無理じゃないかな
2018/07/22(日) 18:57:59.75ID:Xbb1Ck+x
なぜ?
536デフォルトの名無しさん
垢版 |
2018/07/22(日) 19:17:54.18ID:LiIRy0eu
>>513
TextOutA使え
お前にTextOut/TextOutWはまだ早い
2018/07/22(日) 19:47:40.34ID:lnBo9wWY
>>534
無理と決め付ける前に、まずは試してみるべきじゃないかな。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況