ダブルクリックで開かない
MDI exe で,ドキュメントをダブルクリックして開けないものがある.
exe が起動された後,もう一度ダブルクリックすると開ける.
VC のバージョンによる違いかと思っていたが,他にも何か条件がありそう.
VC6 exe は問題なさそう.VC12 でうまくないことはあった.VC 2022 exe は今は開けない.
いろいろやっていると開けるようになることもある.
この動作をデバッガで確認したいと思ったが…
最初 DebugBreak() を追加してみたが,うまく止められなかった.
それで,次のようにメッセージボックスを表示して停止し,デバッガからアタッチしてテストすることにした.
BOOL CGLSmthApp::InitInstance()
{
if (!AfxOleInit()) {
AfxMessageBox(_T("OLE の初期化に失敗しました。")) ;
return FALSE ;
}
#ifdef _DEBUG
// DebugBreak();
AfxMessageBox(_T("Wait")) ;
#endif
// ...
}
これでデバッグ自体はできるようにはなったが DDE の動作部分はうまくデバッグできない.
結局どうすれば良いのかはわかっていないが,DDE が動作するときに時間がかかるとうまく開けない?
レジストリに文字化けしたキー
先日から CDocManager::RegisterShellFileTypes 関係を調べている.
以前やった時は,MFC に依存した自前のコードが多かったのと,もう少し使いやすくできないかと…
それでいろいろとやっていると,レジストリの HKCU\Software\Classes\ の下に文字化けしたものができてしまった.
REG_SZ の (ext)_auto_file となっている.
これは,ドキュメントをダブルクリックして「常に使う」を選んだ時と思うが,はっきりしない.
Win10 環境でも同様?
レジストリの直接編集によるファイルの拡張子と関連づけ
Windows 11とレジストリに非ASCII文字を利用するアプリに非互換問題 ~BSoDが発生
特定のレジストリ キーを削除できません。キーの削除中にエラーが発生する
error D8016 : /clr /RTC1
VC 6 で作成して VC 2022 まで順に上げた MFC プロジェクトで /clr を有効にしてビルド.
22:39 でビルドが開始されました...
1>------ ビルド開始: プロジェクト: GLSmth, 構成: Debug Win32 ------
1>cl : コマンド ライン error D8016: コマンド ライン オプション '/clr' と '/RTC1' は同時に指定できません
1>プロジェクト "GLSm143.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 成功 0、失敗 1、最新の状態 0、スキップ 0 ==========
=========== ビルド は 22:39 で完了し、00.707 秒 掛かりました ==========
通常はプロジェクトの設定で「C/C++」-「コード生成」-「基本ランタイムチェック」で「既定」を選択すれば良い.
が,今回はそれだけではエラーのまま.
vcxproj をエディタで開いてみると EnableFastChecks という部分が存在している.
<ClCompile Include="GLSmth.cpp">
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
</ClCompile>
error C3010: ‘return’: OpenMP
以前,OpenMP を有効にしないで使用していたコード.
最近のコードで,OpenMP を有効にしたプロジェクトが増えてきた.
それでビルドしていると C3010 のエラーになってしまう.
関連する部分を,単体テスト用の cpp に張り付けてビルド.
11:21 でビルドが開始されました...
1>------ ビルド開始: プロジェクト: C_drv, 構成: Debug Win32 ------
1>C_drv.cpp
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(60,36): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(64,45): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(67,4): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(69,3): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>プロジェクト "C_drv.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 成功 0、失敗 1、最新の状態 0、スキップ 0 ==========
=========== ビルド は 11:21 で完了し、06.452 秒 掛かりました ==========
OpenMP のコードの部分を一つの関数とすることで対応.
bool NET_is_valid (LPCTSTR path)
{
tstring net_root = ::Path_Get_net_root(path) ;
bool is_valid = false ;
#ifdef _OPENMP
#pragma omp critical (NET_is_valid)
#endif
{
is_valid = ::NET_is_valid_critical(net_root) ;
}
return is_valid ;
}
何故か,VC 2015 と 2017 ではエラーにならなかった.
Win11 コンソール AP で DC
今まで Win10 をメインで使用していたので気づかなかったが…
Win10 でうまく使えていた GDI の描画が Win11 ではうまく行われない?
どうも,デフォルトの設定では新しい「ターミナル」が使用されることによるみたい.
ターミナルの「設定」から入って「Windows コンソール ホスト」を選択して「保存」する.
シンボリックリンクがない?
先日から ZIP を扱うコードを書いている.
いつも exe を作成するのは,VC 6 と VC 2015 以降が多い.
今回は,幾つかの環境(Win7 など)での動作を確認したかったので,VC 9 でビルドしたものもテストしていた.
Win10 環境では特に問題なかったが,Win11 環境でうまく機能しない動作がある.
VC 6 や VC 8 でビルドしたものは OK .また,VC 2015 以降も良さそう.
リリース版とデバッグ版での違いはなさそう.
VC 9 と VC 10 でビルドしたものがうまくないことがわかった.
VC 9 で,デバッガで追いかけていくと,stat の _tsopen_s で見つからないとなってしまう.
VC 8 以前ではその部分はなく,VC 11 以降では _O_OBTAIN_DIR が設定されている.
検索するとシンボリックディレクトリリンクがサポートされていないみたい.
FIX”_stat”または”_wstat”関数が失敗した ENOENT エラーとディレクトリのシンボリック リンクのパスは、Visual C++ 2010 アプリケーションに渡されたとき
Update: “_stat” oder “_wstat”-Funktion nicht mit ENOENT Fehler, wenn ein symbolische Verknüpfung Verzeichnispfad zu Visual C++ 2010 Anwendung übergeben wird
“_stat ファミリ” の関数呼び出しでは、Visual Studio 2013、2012、または 2010 の C ランタイム ライブラリ関数のシンボリック ディレクトリ リンクはサポートされていません
Function calls of “_stat-family” do not support Symbolic Directory Links for C Runtime Library functions from Visual Studio 2013, 2012, or 2010
対応は VC 2015 以降を使用する必要がある?
fatal error C1001
MFC SDI プロジェクトを /clr を有効にして,ビルド.
さらに OpenMP を有効にしてビルドすると …
ビルドを開始しました...
1>------ ビルド開始: プロジェクト: MBPV, 構成: Release Win32 ------
1>MBPVDc.cpp
1>enumfile.hxx MessageBar No Support
1>BDocCSV Draw No Support
1>_WIN32 1
1>_WINDOWS 1
1>_OPENMP 200203
1>_UNICODE 1
1>_MSC_VER 1929
1>_MSC_FULL_VER 192930157
1>_MFC_VER 0x0E00
1>_ATL_VER 0x0E00
1>__CLR_VER 40809290
1>_MSVC_LANG 201402L
1>WINVER 0x0A00
1>__cplusplus_cli 200406L
1>_AFXDLL 1
1>_M_CEE 001
1>_MANAGED 1
1>__DATE__ "Jan 10 2025"
1>__TIME__ "13:39:57"
1>UndoRedo::UpdateUI No Support ODMenu
1>T:\Develop\_.SRC\__CPR_\enumfile.hxx(597): fatal error C1001: 内部コンパイラ エラーが発生しました。
1>(コンパイラ ファイル 'D:\a\_work\1\s\src\vctools\Compiler\Utc\src\p2\main.c'、行 213)
1> この問題を回避するには、上記の場所付近のプログラムを単純化するか変更してください。
1>可能な場合、再現手順をこちらに入力してください: https://developercommunity.visualstudio.com
1>詳細については、Visual C++ ヘルプ メニューのサポート情報コマンドを
1>選択するか、サポート情報ヘルプ ファイルを参照してください
1> CL!RaiseException()+0x62
1> CL!RaiseException()+0x62
1> CL!InvokeCompilerPass()+0xc17f1
1> CL!CloseTypeServerPDB()+0x16cc3
1>プロジェクト "MBPV142.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
デバッグビルドは通る.また,/clr や OpenMP を外すと通る.
VC 2017 や 2022 などでは問題ない.
何かの更新で解消されるかもしれないので,このままとする.
MFC + System:: … ::ZipFile
先日から作成しているテスト exe で,ZIP に圧縮する動作を…
主要な exe では,izip.exe を呼出したり,シェルの機能を利用している.
ただ,同期のタイミングなど少し時間がかかるので,試しに直接呼出す方法に変更.
プロジェクトの設定で「共通言語ランタイム サポート (/clr)」に.
そのままビルドすると
cl : コマンド ライン error D8016: コマンド ライン オプション ‘/ZI’ と ‘/clr’ は同時に指定できません
cl : コマンド ライン error D8016: コマンド ライン オプション ‘/clr’ と ‘/Gm’ は同時に指定できません
cl : コマンド ライン error D8016: コマンド ライン オプション ‘/clr’ と ‘/RTC1’ は同時に指定できません
T:\…\zip_CLI.hxx(16,9): fatal error C1107: アセンブリ ‘System.IO.Compression.dll‘ がみつかりませんでした: /AI または LIBPATH 環境変数を使用してアセンブリ検索パスを指定してください。
L:\Document\…\ComPrj01.cpp : fatal error C1128: セクションの数がオブジェクト ファイル形式の制限を超えています: /bigobj と共にコンパイルしてください
「プログラム データベース (/Zi)」に.
/Gm と /RTC1 は「<親またはプロジェクトの既定値から継承>」に.
「追加の #using ディレクトリ」を「C:\Windows\Microsoft.NET\Framework\v4.0.30319」に.
「C/C++」-「コマンド ライン」の「追加のオプション」に「 /bigobj 」の追加.
これでビルドはできる様になったが,あまり見慣れない warning が…
ComPrj01.obj : warning LNK4248: 未解決の typeref トークン (0100001B) (‘_TREEITEM’) です。イメージを実行できません。
ComPrj01.obj : warning LNK4248: 未解決の typeref トークン (0100001F) (‘GLUtesselator’) です。イメージを実行できません。
これに関しては,ちょっとわからず.
error LNK2001: unresolved …
空のコンソール AP プロジェクトを作成して,_tmain を含む cpp を追加してビルドすると
--------------------Configuration: t_MBP - Win32 Debug--------------------
Linking...
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
c:\Temp\MBP\t_MBP\Debug.060/t_MBP.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
t_MBP.exe - 3 error(s), 0 warning(s)
この cpp では MFC を使用しているので,「共有 DLL で MFC を使用」に変更する.