X



Win32API質問箱 Build126

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/
Win32API質問箱 Build124
https://mevius.5ch.net/test/read.cgi/tech/1510395780/

■関連スレ
Visual Studio 2019 Part4 https://mevius.5ch.net/test/read.cgi/tech/1585715794/
Visual Studio 2017 Part7 https://mevius.5ch.net/test/read.cgi/tech/1558179898/
【C++】 DirectX初心者質問スレ Part41 【C】 https://mevius.5ch.net/test/read.cgi/tech/1521786252/
0367デフォルトの名無しさん
垢版 |
2020/10/27(火) 20:43:03.29ID:rXCQsaV4
GetOpenFileName で初期ディレクトリとして OPENFILENAME の lpstrInitialDir に
任意のディレクトリを指定してファイルを開くダイアログを開いていて、おおよそ
意図した通りに動いているのですが、"C:\Users\Public\Documents"を指定したときだけ
初期ディレクトリが現在使用中ユーザーのドキュメントディレクトリになってしまいます

アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
0368デフォルトの名無しさん
垢版 |
2020/10/28(水) 11:43:37.22ID:Mf8tEr2f
SHGetSpecialFolderPath
0369デフォルトの名無しさん
垢版 |
2020/10/28(水) 17:45:50.04ID:DoZwgPmf
パブリックディレクトリの取得方法を聞いているわけではないのですが
"C:\Users\Public\Documents" は存在する有効なパスです
0370デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:30:52.56ID:Mf8tEr2f
再現した
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
0371デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:36:57.63ID:Mf8tEr2f
あと存在しないディレクトリを与えると
C:\Users\自分のアカウント\Documents
が開いた
0372デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:41:30.63ID:Mf8tEr2f
lpstrInitialDir
The initial directory. The algorithm for selecting the initial directory varies on different platforms.
Windows 7:
If lpstrInitialDir has the same value as was passed the first time the application used an Open or Save As dialog box, the path most recently selected by the user is used as the initial directory.
Otherwise, if lpstrFile contains a path, that path is the initial directory.
Otherwise, if lpstrInitialDir is not NULL, it specifies the initial directory.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
Windows 2000/XP/Vista:
If lpstrFile contains a path, that path is the initial directory.
Otherwise, lpstrInitialDir specifies the initial directory.
Otherwise, if the application has used an Open or Save As dialog box in the past, the path most recently used is selected as the initial directory. However, if an application is not run for a long time, its saved selected path is discarded.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
0373デフォルトの名無しさん
垢版 |
2020/10/28(水) 19:43:23.12ID:RpzUgl/d
comdlg32.dllのコモンダイアログ関係は >>367 のような想定外の動きをしたり
右クリックのコンテキストメニューで存在しない32bitフォルダを探しに行ったりと色々不具合を抱えてる
明らかにメンテされてない
ダイアログ内のListViewで開発者の想定外の事ができたりするから許されるなら使わない方が良い
0374デフォルトの名無しさん
垢版 |
2020/10/28(水) 20:10:50.98ID:xBovneds
コモンコントロール使ってるアプリに使うなと言ってしまうと、開発プラットフォームから見直さないとダメ案件では
0375デフォルトの名無しさん
垢版 |
2020/10/29(木) 10:55:01.44ID:XU4TLDfA
>>372
> Otherwise, the initial directory is the personal files directory of the current user.

この分岐に填まってるようですが、lpstrInitialDir が NULL でない以上おかしいですよね
とりあえず仕様ということで対応します
ありがとうございました

>>373-374
確かに他にも怪しい挙動があるので差し替えたい所ですが、そんな単純にコモンコントロール部分だけ
差し替えが可能なものがあればいいのですが・・
0376デフォルトの名無しさん
垢版 |
2020/10/29(木) 11:27:15.51ID:wwhOrfBp
XP 以前と 7 で違うんだから
10 ならさらに変更されたとかありそう
0377デフォルトの名無しさん
垢版 |
2020/10/29(木) 11:29:27.07ID:wwhOrfBp
>コモンコントロール部分だけ差し替えが可能なもの

秀丸ファイラーのdllって無かったかな
0379デフォルトの名無しさん
垢版 |
2020/11/12(木) 11:33:46.92ID:Twa29Hwt
こんにちは、お世話になります。DLLファイルの削除について質問です。
プログラム終了時にロードしたDLLファイルを削除したいのですが、
場合により削除できたりできなかったりします。

実際にはもう少し複雑ですが、大まかな処理の手順を示します。
1:  inst=LoadLibrary("tmp.dll")
2:  hook=SetWindowsHookEx(...)
3:  ...あれやこれやの処理...
4:  ret1=UnhookWindowsHookEx(hook)
5:  ret2=FreeLibrary(inst)
6:  ret3=DeleteFile("tmp.dll")

 処理部[3:]は、所望の通り動作していて、inst,hook共に正常値のよ
うです。アプリケーション終了時に[4:]以降の処理を行います。ret1,
ret2は成功値を返すのですが、ret3は失敗し、GetLastErrorの値は5で
ERROR_ACCESS_DENIED「アクセス拒否」を返してきます。アプリ
ケーション終了後はプロンプトからのDELコマンドに成功します。

 処理部[3:]をスキップすると、ret3は成功値を返しファイルもただ
しく削除されています。

FreeLibraryだけでは、DLLを開放してくれないのかと思っていますが、
少し手つまりになっています。当方、日曜プログラマレベルの知識で
す。質問などに不備等ございましたらご指摘ください。

(環境)Win10-64bit,Vs2019Comm,VC++
0380デフォルトの名無しさん
垢版 |
2020/11/12(木) 11:49:17.96ID:Twa29Hwt
追記
2: hook=SetWindowsHookEx(WH_KEYBOARD_LL,proc,inst,0)
フックにDLLインスタンスが絡みます。
0381デフォルトの名無しさん
垢版 |
2020/11/12(木) 11:54:18.15ID:fy6Pt/Zo
1〜2をやるボタンAと
4〜5をやるボタンBを配置して
ボタンBを押してから6やってみた?
0382デフォルトの名無しさん
垢版 |
2020/11/12(木) 12:09:45.05ID:Twa29Hwt
>>381 ありがと
いや、そういう処理の分解はやってないです。

ただ、[5:]と[6:]の間にSleep(10000)を挟んでみた。OSが手放してくれる時
間?が必要かと思って・・・でも、そういう事じゃないみたい。
ボタンの配置はすぐには難しいですが(汗)。でも、とりあえず、物は試しで
ユーザの入力待ちを挟んでみます。getch()あたりで・・・。
0384デフォルトの名無しさん
垢版 |
2020/11/12(木) 12:17:21.07ID:f5BAQJxF
あと 6 だけ実行する別のアプリを造っておいて
アプリ終了後にそれを呼ぶとか
0387デフォルトの名無しさん
垢版 |
2020/11/12(木) 12:31:44.05ID:Twa29Hwt
379です。進展しそうなので、この質問はいったんクローズさせてください。
グーグル先生に「dll_process_detach 呼ばれない」と聞くと、イロイロ出て
きそうです。

381、383 ありがとうございました m(_ _)m
0388デフォルトの名無しさん
垢版 |
2020/11/12(木) 17:06:23.69ID:n8RQesMu
呼び出しプロセスが終了するまではDLLの解放はされなかった気がする
つまり>>384が正解なのではないかと
0389デフォルトの名無しさん
垢版 |
2020/11/12(木) 20:28:25.76ID:g7bSPYZf
32bitアプリからShellExecuteでバッチファイルを呼ぶと当然ながら32bit環境で実行されるんだけど
これを64bitに強制できないかな
0390蟻人間 ◆T6xkBnTXz7B0
垢版 |
2020/11/12(木) 20:47:44.37ID:vr1SOjIj
>>389
Wow64DisableWow64FsRedirectionを使う痛い方法があるけど、推奨できない。64bit processを経由した方が痛みは少ない。
0391デフォルトの名無しさん
垢版 |
2020/11/12(木) 20:48:10.58ID:g7bSPYZf
でてきた
PVOID m_lpOldVar = 0;
Wow64DisableWow64FsRedirection(&m_lpOldVar);
//この間に書けばいいらしい
ShellExecute(hWnd,"open","cmd","param","dir",SW_SHOWNORMAL);
Wow64RevertWow64FsRedirection(&m_lpOldVar);
これでいいのかな?
0392デフォルトの名無しさん
垢版 |
2020/11/12(木) 20:53:06.64ID:g7bSPYZf
ほんとは32bitアプリを64bit化すりゃいいんだけど思いの外大変なので諦めた
以下バッチ側で判定する方法

@echo off

if %PROCESSOR_ARCHITECTURE%==x86 (
if "%PROCESSOR_ARCHITEW6432%" == "AMD64" (
rem 32bit WOW64
C:\Windows\sysnative\cmd.exe /c %~dp0%~n0%~x0
exit /b 0
) else (
goto :PASSX64
)
) else (
goto :PASSX64
)

:PASSX64
以降x64前提の処理
0393蟻人間 ◆T6xkBnTXz7B0
垢版 |
2020/11/12(木) 20:54:02.43ID:vr1SOjIj
リダイレクトを無効化して、system32のcmdを指定すればいけるやろ。
0395デフォルトの名無しさん
垢版 |
2020/11/15(日) 15:23:41.28ID:18uzJ+HT
379です。
LoadLibrary()でロードしたDLLが呼び出しプロセスから削除できない件のご報告。

方法が正しいのか悪いのか(不具合を発生させる可能性を持つのか)わかりませんが、
削除することには成功しました。383さんがご指摘の「DLL_PROCESS_DETACH
が呼ばれてないんじゃない?」とMSDNのFreeLibraryの文書をヒントに、
FreeLibrary()がゼロを返すまで複数回繰り返す方法で対処できました。DLLモ
ジュールへの参照数が無くなった時点でDLL_PROCESS_DETACHが発生するよう
です。また、ゼロを返した時のGetLastError()値は126(ERROR_MOD_NOT_FOUND)
です。

適当にいじりながらモニタしてみるました。すると、DLL_PROCESS_ATTACHは
1回しか呼び出されていないにもかかわらず、DLLモジュールは1または2の参照カ
ウントを持っているようです。どのタイミングで2になるのか、また3回目が発生
しないのかは、追い切れていません(汗。エラー検出で正常・・・的な行儀のよい
コードとは思えませんが、とりあえず、要モニタリングで先に進みたいとおもいま
す。

このあたり、お詳しい方がおられましたらご指導いただけると助かります。今のと
ころ困ってはいませんので、お暇なときにでも^^。ありがとうございました。
0396デフォルトの名無しさん
垢版 |
2020/11/15(日) 15:57:26.98ID:1cE4y5+G
>FreeLibrary()がゼロを返すまで複数回繰り返す

なるほど
自分以外が使ってないことが確実に言えるならこれで良いんじゃないかな
0399デフォルトの名無しさん
垢版 |
2020/11/15(日) 18:00:54.67ID:18uzJ+HT
長文で申し訳ない。

396
自分しか使っていないDLLであることは間違い無いので・・・とりあえず現状で
すすめる感じ。動いてるからOKは無能感アリアリです。リファレンスカウント
を追いかける事もできるようですが、沼入間違いなし。もし3回目が発生したら
ワーニング出してるので、報告してもらいます。ありがと。フックの時、DLLイン
スタンスを与えてるので、その時、参照が追加されるのかな、などと妄想するわけ
です。

297
判りますか!・・・さすがです。あおりでないと思ってマジレス。
ユーザの起因でLoadLibraryが2回実行される可能性として思い当たるのが:
 1.メインプロセスが終了していないうちにデバグなどで再度起動しちゃった。
 2.LoadLibrary呼び出しのの箇所をプログラムカウンタが2回通過している。
辺りでしょうか。1は、多重起動が排除されていて、かつタスクマネジャにも出て
いないので可能性が低い。2は、ブレークポイントとprintf()でモニタしてて多分
ないかなぁ。他アドバイスありましたらよろしくお願いいたしますm(_ _)m。

398
LoadLibraryをフックして、どのタイミングで呼び出されるのかを理解する感じ
ですか?APIフックかぁ・・・経験値が足りないのでハマりそうだなぁ。thx。
0401デフォルトの名無しさん
垢版 |
2020/11/15(日) 18:54:05.48ID:18uzJ+HT
400さん、レスありがとう。実際のコードはi値の制限などもちっと複雑なので
すが、感じとしては、WinMainに以下のように記されています。
 1: i=0;
 2: for(;;) {
 3:   i++;
 4:   ret=FreeLibrary(dllinst);
 5:   if(res==0) {
 6:     n=GetLastError();
 7:     break;
 8:   }
 9: }
場合によるのですが、ループを出た時のi値は2か3を示します。nは126です。
i値が2になるケース、3になるケースは、初回投稿 >>379 に示してあります。
フックの初回呼び出しにリファレンスが追加・・・かなぁ(妄想。
0403デフォルトの名無しさん
垢版 |
2020/11/15(日) 19:54:35.90ID:pziaxEZW
というか>>379でいうと
> 3:  ...あれやこれやの処理...
ここに原因があるってことでしょ
そこ次第じゃないの?
0405デフォルトの名無しさん
垢版 |
2020/11/15(日) 20:46:59.18ID:ALi3WLRE
LoadLibraryの参照カウンタって簡単に取れたっけ?
昔DDKのヘッダ持ってきてゴニョゴニョやった気がする。
しかもwin7と8以降で構造体定義が違ったり。
0406デフォルトの名無しさん
垢版 |
2020/11/15(日) 20:52:47.67ID:gutimSe2
成功するまで n回 FreeLibraryを試みて LoadLibrary しなおす?
ATTACH と DETACH が副作用おこすかもだけど
0407デフォルトの名無しさん
垢版 |
2020/11/15(日) 21:30:45.30ID:18uzJ+HT
みなさん、こんな漠然とした質問に答えてくださってありがとう。

404さん、405さん。参照カウンタの取得は、現象の理解に役に立つとは思います
が・・・なにぶん日曜プログラマなものですから。
  google先生 「win32api how to get dll reference count」
でめぼしい情報はPEB(Process environment block)のLDR_MODULE構造体がう
んちゃらで(マト違い?)、ハードルの高さを感じました。

406さん。おっしゃる通りです。ユーザーのコード内でLoadLibraryが1度だけ
呼ばれるのだけど、参照カウンタが2になっている点は重要と認識しています。
3になるかもしれないし、いつ増えるかも妄想の範囲を出ません。FreeLibrary
するループ内で参照カウンタが変化かもとかゾッとします。

というわけで、今のところ警告を出して他の現象も集めてみたいと思っています。
が、人に使ってもらうレベルでは、参照カウンタの振る舞いは押さえておかないと
いけないという認識です。
0408デフォルトの名無しさん
垢版 |
2020/11/15(日) 21:38:16.46ID:18uzJ+HT
追記:
LoadLibraryが2度呼ばれてましたとかいうオチの時は、正直に詫びを入れることを
お約束いたします。いやマジで、ユーザーコード全部で記述は1ヶ所だけし、2回通っ
てないし(大汗。
0410デフォルトの名無しさん
垢版 |
2020/11/15(日) 22:22:34.55ID:18uzJ+HT
exeと同じディレクトリに置かれたtmp.dllという名前です。DLLによっては、
参照が増える可能性があるということでしょうか。私が書いたコードですが中
身はほぼ空っぽです。たまにデバグやモニタの為にprintfします。コピペで手
加工のためtypoしてたらごめんなさい。
* tmpdll.cppの中身
01: BOOL APIENTRY DllMain(
02:   HINSTANCE hinst,
03:   DWORD reason,
04:   LPVOID rsv
05: ) {
06:   switch (reason) {
07:     case DLL_PROCESS_ATTACH:
08:       DisableThreadLibraryCalls(hinst);
09:       break;
10:     case DLL_PROCESS_DETACH:
11:       break;
12:     case DLL_THREAD_ATTACH:
13:       break;
14:     case DLL_THREAD_DETACH:
15:       break;
16:     default:
17:       break;
18:   }
19:   return TRUE;
20: }
* コンパイルコマンド:
  >cl.exe /LD tmpdll.cpp User32.lib
  >move tmpdll.dll tmp.dll
すいませんが、今日はもうレスできません。作業は停滞から抜け出れてますので、
どうかヒマつぶし程度の軽い気持ちで受け答えください(大汗。
0411デフォルトの名無しさん
垢版 |
2020/11/15(日) 23:47:17.82ID:+e2tZbOG
参照カウントは、読み込んだ・実行した回数と関係ないだろ。
複数のプロセスから、参照されていれば、2 以上になるだけだろ

自分が参照すれば1で、
OS も参照すれば、2じゃないの?

自分で参照回数を、0にすべきじゃない。
OSが使っているかも知れないし

OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
OSの勉強だけで、何十年も掛かるから
0413デフォルトの名無しさん
垢版 |
2020/11/16(月) 00:34:28.20ID:QRq3yxwv
>>411
ここで言ってるのはプロセス内の話だぞ?
LoadLibraryを2回やったらFreeLibraryも2回呼ばなきゃならんという話。

>OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
0414411
垢版 |
2020/11/16(月) 01:24:18.28ID:9JpVGitI
DLL を2回も呼ぶのか?

一々、DLLをロードしてから、フリーするとか、
そんなに厳密に、メモリを気にしなくても良いのでは?

初心者は、そんな些末な事に、時間を掛けるべきじゃないと思う。
どうせ、1MB とか、ほぼ64 bit では無意味な節約だろ

そういうのを気にしていたら、Ruby などでプログラミングできない。
皆、富豪プログラミングなのにw
0416デフォルトの名無しさん
垢版 |
2020/11/16(月) 03:56:24.82ID:+pimEm7D
LoadLibraryの参照カウンタはプロセス単位
質問者はDLL_PROCESS_ATTACHが複数回呼ばれると思ってるようだが複数回LoadLibraryしても呼ばれるのは最初の1回だけ
0417デフォルトの名無しさん
垢版 |
2020/11/16(月) 08:05:49.89ID:cFXcINFw
おはようさん。ゆるくいってもらえるとうれしい。

413さん。LoadLibraryを複数回呼べば参照カウンタはそれだけ増えます。
その場合、増えた原因がLoadLibraryと明らかなので特に問題ないと考えます。
わからないのはLoadLibraryが1度のつもりなのに、場合によって一つ増える
現象が不思議だなってあたり。

414さん。まったくその通りです。実際、削除してみたいというのは今のところ
技術的な興味だけで、参照カウンタの増加原因がコードのどの部分なのかが
わかれば自分が面白いという点だけです。対応策は削除しない策も含めて2、3
考えていて重大ではなくなっています。時間がもったいないですね。

461さん。アプリケーションが起動されたプロセスで、DLL_PROCESS_ATTACH
はLoadLibraryの時に1度、DLL_PROCESS_DETACHはFreeLibraryにより参照カ
ウンタが0になった時に1度だけです。このように理解していますが^^;。

参照カウンタはプロセス毎に持っていて、自プロセスのFreeLibraryが2回成功
するということは、自プロセスの参照カウンタが2になっていると考えていま
す。他のプロセスがtmp.dllをロードしても、自プロセスの持つ参照カウンタは
増えません。予想の範囲をでませんが、自分の書いたコードの中のあるAPI関数
が参照カウンタを増やしている、たぶん初回のフックプロシジャ起動の時に増え
てるっぽい。ですので、現象を正しく理解するには、結局の所、参照カウンタを
モニタして増減のポイントを押さえ、可否を判断するのが本道かなとも思います
・・・難しそうですよね。APIは勝手に参照カウンタ増やすよ?なんてアドバイ
スがあると、よかったのですが。

長文でくどくなって、イラついている人がいそうですね。この辺で、一度この話
題から私は離れたいと思います。アドバイスくださった方がた、どうもありがと
うございました。
0419411
垢版 |
2020/11/16(月) 09:50:44.37ID:9JpVGitI
Windows は、クローズドOS だから、何をやってるか分からない

ファイルをロックするためにとか、メモリから追い出されないために、
参照回数を増加させるかも知れない

だから、自分が1回しか呼んでいなのなら、参照回数を2回減らしてはいけない。
2回減らしても、無視されるだけかも知れないけど

自分が増やした分だけを、減らすべき!
0421デフォルトの名無しさん
垢版 |
2020/11/16(月) 12:21:40.31ID:sF1WJXNT
全部読まずにresするが
元々自分のexeの依存dllにそのdllを入れちゃってるのに
さらにLoadLibraryしてるとかかな
0423デフォルトの名無しさん
垢版 |
2020/11/24(火) 20:44:41.98ID:/h51r/r1
>>421
俺もそう思う
静的リンクと動的リンク合わせて2回呼ばれていると思う
0428デフォルトの名無しさん
垢版 |
2020/11/26(木) 20:19:49.68ID:ryn8MPPQ
なんか滅茶苦茶だな
古いMSDNライブラリ2008ではshellコントロールもCE5.0も正しい定義が出てる

メンテ止めても表示崩す必要無いだろに...
https://docs.microsoft.com/en-us/previous-versions/windows/embedded/aa453326(v=msdn.10)

久々にapi使ってコード書こうかと思ったがガックリだわ
0429デフォルトの名無しさん
垢版 |
2020/11/27(金) 18:59:42.70ID:Iha9xPer
ListView_GetItemCount


Retrieves the number of items in a list-view control. You can use this macro or send the LVM_GETITEMCOUNT message explicitly.

int ListView_GetItemCount(
HWND hwnd
);

Parameters
hwnd
Handle to the list-view control.
Return Values
Returns the number of items.
0431デフォルトの名無しさん
垢版 |
2020/12/08(火) 15:48:41.35ID:jRmhdWmE
なぜですか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13212452128

質問者からのお礼コメント
小学生でもわかるような回答ではなく、なぜそうなのかも回答できないと社会人として微妙ですよ。
わかる箇所だけ答えるのはニワカです。
0433デフォルトの名無しさん
垢版 |
2020/12/13(日) 17:26:48.55ID:/mwshU+q
AllocConsoleでコンソールを開いてそこからstdio.hのscanfしたいのですが、
ノンブロッキングではないので呼び出し側が固まってしまいます。

そこでscanf的な機能をもつノンブロッキングな関数をつくりたい。
FILE_FLAG_OVERLAPPEDでCONIN$を開いてReadFileで読むまではいいのですが
ReadFileしていない間の入力もバッファリングしてしまいます。そういう機能だから当然ですが。
このバッファリングをうまくオンオフする方法、もしくはバッファを棄てる方法はないでしょうか?

それともFILE_FLAG_OVERLAPPEDではない別の方法があるのでしょうか?
0435デフォルトの名無しさん
垢版 |
2020/12/13(日) 17:35:08.88ID:/mwshU+q
CONIN$を開いたハンドルをCloseHandleで閉じたりFlushFileBuffersしたりは試しました。
0436デフォルトの名無しさん
垢版 |
2020/12/13(日) 17:37:07.75ID:/mwshU+q
>>434
ありがとうございます
sscanfはもちろんするのですが、その前段階、文字列を読み込む部分が上手くいっていないのです。
0439デフォルトの名無しさん
垢版 |
2020/12/13(日) 18:26:49.33ID:/mwshU+q
setvbufやfreopenはcランタイムの関数で、バッファもOVERLAPPEDのバッファとは違う気がします
freopenしたstdinからのscanfがブロックされてしまうというのが443の話なので
そこからノンブロッキングのAPIを使う必要があるのでは、ということになったわけです
0440デフォルトの名無しさん
垢版 |
2020/12/13(日) 19:01:38.77ID:/mwshU+q
ReadConsoleってAPIもブロッキングなので使えないわけですが、低レベルなReadConsoleInputというのもあるらしく
OverlappedでのReadFileよりこっちの方が正攻法なようです。
ともかくやってみます。
ありがとうございました。
0441デフォルトの名無しさん
垢版 |
2020/12/13(日) 20:23:25.03ID:casXcC2M
>>433
プログラム側で「この時点以降の入力を有効とする」タイミングは管理してないの?
その時点でバッファされてる物を一旦読み捨てれば良いだけでは?
0442デフォルトの名無しさん
垢版 |
2020/12/13(日) 21:23:50.52ID:w0iK+TRN
生のコンソールは制約が多いから
コンソールアプリの入出力を奪って適当なコンソールもどき作った方が早そうだけど
0443デフォルトの名無しさん
垢版 |
2020/12/14(月) 00:15:39.66ID:pdqk93XN
スレッド作ってブロックさせておけば良いと思うんだけど
正直な話>>442
バージョンによって微妙に動きが異なるし
0444デフォルトの名無しさん
垢版 |
2020/12/14(月) 11:31:29.18ID:AspHUlaN
>>443
ありがとうございました
ブロックしないじゃなくてブロックしても大丈夫にして上手くいきました

バッファの方は事前にFlushConsoleInputBufferで解決しました
0445デフォルトの名無しさん
垢版 |
2020/12/14(月) 12:14:03.24ID:GY9gb+Ps
コマンドプロンプトのコンソールを使う案件は、スクリプト言語とのプロセス通信を使ったほうが幸せになれる確立が高い。
0446デフォルトの名無しさん
垢版 |
2020/12/19(土) 12:04:23.50ID:+WDUx37o
GetProcAddressってAやWないよね?
それでいてwcharでもcharでも機能するのは仕様?
0448デフォルトの名無しさん
垢版 |
2020/12/28(月) 00:26:19.90ID:222C9err
__declspec(thread)の変数ってスレッドごとに記憶域をもつわけですが
APIのTlsGetValue等でどうやって実現してるんでしょうか?

TLSインデックスをうまくスレッドハンドルと結び付けなけりゃならないと思うんですが。
0449デフォルトの名無しさん
垢版 |
2020/12/28(月) 02:51:22.15ID:p5Tcw1Ej
正直、このあたりは深く考えないことをオススメするのですが。
興味があるということであれば↓を参照しつつ。
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/6_6.html

コンパイラが__declspec(thread)の変数があった時に、どのようなコードを出力しているか
逆アセンブルしてみると理解が深まると思われます
0450デフォルトの名無しさん
垢版 |
2020/12/28(月) 09:50:34.64ID:222C9err
>>449
ありがとうございます
昔はTlsGetValueを使ってたのが、今はセクションが新設されてそこに作ってるんですね
0451デフォルトの名無しさん
垢版 |
2021/01/01(金) 22:20:09.03ID:kFKOiQ+I
VirtualAllocとHeapAllocの違いについてなんだけど
HeapAllocもヒープ残量以上のサイズを渡したらどの道VirtualAlloc呼ばれるって認識でいい?
0453デフォルトの名無しさん
垢版 |
2021/01/02(土) 09:33:50.89ID:Li/cNK13
>>452
ある程度大きいサイズのメモリ確保だとVirtualAllocの方が早くなるからそう勘違いしてたけどそういう訳じゃないんだね
最初に実際にアクセスした時に初めて実際にメモリ割り当てが行われるとかの挙動がHeapAllocでも走るってだけか
0454デフォルトの名無しさん
垢版 |
2021/01/02(土) 09:59:10.06ID:r4407Ytg
virtualの方がよりローレベルなので
チャンクアロケーターをMSのレベルを
超えて作れるか、ほぼ解放しない前提
のブロックを確保するとかでないと使わない。

普通のmalloc風に使うなら、ヒープ領域毎
あぼーん出来るCreateHeapの方が使い易い
0455デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:11:58.85ID:LUlB/OIG
あるstaticなlibが既存の場合(.hで関数の引数がTCHAR *使用)
それがANSI用にコンパイルされたlibなのか
それともUNICODE用にコンパイルされたlibなのか
既存のバイナリのlibだけから判断する方法はありますか?

#ソースは.cppでTCHARで書かれているものがあったので
#そこから-DUNICODEであらためてコンパイルすれば解決はしたのですが
#上の質問の解決策があるなら知りたいです
0456デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:19:23.66ID:gjvDcKpD
>>455
C++の場合なら、ライブラリをdumpbinなどで調べて関数のマングリン化名を見れば分かる。
plain Cの場合は、実際にライブラリに1文字が2バイト以上のUNICODE文字を送ってみて、
正しく動作するかどうかテストしてみると分かる。
0457デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:40:36.07ID:gjvDcKpD
>>456
plain C の場合、他の方法としては、
1. dumpbinでライブラリ関数を逆アセンブルしてみて、引数の扱いがbyteに
 なっているか、wordになっているかを調べれば分かる。
2. ライブラリの関数を呼び出すコードを書いてみて、デバッガで、ライブラリ関数の
 中を逆アセンブルする。
0458デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:41:24.71ID:LUlB/OIG
もしかしてマングリの PEB_W とかのが UNICODE 用ってことでしょうか?
0459デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:52:56.37ID:gjvDcKpD
>>458
デマングラー
なるものが(ブラウザ上アプリとして)ネットであって、関数のシンボル名
を入れると関数プロトタイプ宣言に直してくれるので試すべし。
0462デフォルトの名無しさん
垢版 |
2021/01/15(金) 15:06:23.40ID:4rSXG5WT
STDAPI と __declspec(dllexport) を同時に使うと怒られるんだけど
原因は何が考えられますか?
__declspec(dllexport) を使わずに .def ファイルで .dll を作成することは可能なのですが
.def を使わずに __declspec(dllexport) で .dll を作成しようとすると失敗します
■ このスレッドは過去ログ倉庫に格納されています

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