::GetDpiForWindow
高 DPI 関連でいろいろと調べてみると ::GetDpiForWindow を使う必要がありそう.
ただ使えるのが Win10 1607 以降みたいで,その辺りをどうしたものか?
次の様に呼出せば 指定した hwnd の値が取れることは確認 .
#if (_MSC_VER >= 1900)
{
UINT dpi = ::GetDpiForWindow(hwnd) ;
std::terr << dpi << std::endl ;
}
#endif
ただ,旧 Windows では存在しないため実行時エラーになる.
そのため ::GetProcAddress を 利用した方法に .
// UINT GetDpiForWindow ( [in] HWND hwnd ) ;
typedef UINT (WINAPI* P_GDFW)(HWND) ;
UINT GetDPI (HWND hwnd)
{
UINT dpi = 96/2 ;
HMODULE user32 = ::GetModuleHandle(TEXT("user32.dll")) ;
P_GDFW p_GetDpiForWindow = (P_GDFW)::GetProcAddress(user32,"GetDpiForWindow") ;
if (p_GetDpiForWindow != NULL) {
dpi = p_GetDpiForWindow(hwnd) ;
}
else {
HDC hdc = ::GetDC(hwnd) ;
dpi = ::GetDeviceCaps(hdc,LOGPIXELSX) ;
::ReleaseDC(hwnd,hdc) ;
}
return dpi ;
}
解像度と DPI の関係が,まだうまく理解できていない.
::GetDpiForWindow は,指定した hwnd の DPI が取得できている.
::GetDeviceCaps では,プライマリの情報が取れる.
「非対応」の場合はスケーリングされた値,「モニターごと」の場合は 100% での値?
FBX SDK 2020.3.2
FBX SDK が更新されていた.
https://help.autodesk.com/view/FBX/2020/ENU/?guid=FBX_Developer_Help_welcome_to_the_fbx_sdk_what_new_fbx_sdk_2020_html
今は区切りが良くないので,ダウンロードまで.
2023/02/14
追加のインクルードとライブラリを変更.
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\include;%(AdditionalIncludeDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\lib\vs2019\x86\$(Configuration);%(AdditionalLibraryDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\lib\vs2019\x64\$(Configuration);%(AdditionalLibraryDirectories)
buf = string ( buf.c_str () )
先日の共通のコードでのバグ.
tstring ask_cli (LPCTSTR msg=_T(""))
{
tstring cli ;
while(true) {
tstring buf ;
buf.resize(1000) ;
std::terr << msg ;
std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
// buf = ::QuotM_Del_All(buf.c_str()) ;
if (buf == _T("q")) { break ; }
else if (buf == _T("Q")) { break ; }
if (buf.empty()) { continue ; }
cli = buf.c_str() ;
break ;
}
return cli ;
}
ループを抜けるために “q” や “Q” と比較している部分が機能しない(break しない).
原因は “q\0\0\0…” と “q\0” を比べているため.
そのため,比較する前に次の様にするとうまく機能する.
{
tstring tmp = buf.c_str() ;
buf = tmp ;
}
MFC であれば CString::ReleaseBuffer(-1) が使えるが…
buf = tstring(buf.c_str()) とすることで対応.
::GetDeviceCaps(dc,HORZRES)
先日のコード を利用して,Windows API の動作のテスト.
#include <clocale>
#include <iostream>
#include "_tdefine.hxx"
#include "cmd_line.hxx"
#include "ask_cli.hxx"
//#include "ask_path.hxx"
#include <Windows.h>
bool test (c_tstring& str)
{
// std::terr << str << std::endl ;
HDC dc = ::GetDC(NULL) ;
if (dc != NULL) {
int hres = ::GetDeviceCaps(dc,HORZRES) ;
int vres = ::GetDeviceCaps(dc,VERTRES) ;
std::terr
<< _T("HORZRES=") << hres << _T("\t")
<< _T("VERTRES=") << vres << _T("\t")
<< std::endl ;
}
return true ;
}
int _tmain (int argc,TCHAR* argv[])
{
_tsetlocale(LC_ALL,_T("")) ;
{
::reg_argv (argc,argv) ;
}
{
// ::call_func(argc,argv) ;
}
{
::test(_T("Test")) ;
}
::ask_wait() ;
return 0 ;
}
::GetDpiForWindow を追加して FHD と 4K 環境で実行.
bool test (c_tstring& str)
{
HWND hwnd = ::GetConsoleHwnd() ;
{
HDC dc = ::GetDC(hwnd) ;
if (dc != NULL) {
int hres = ::GetDeviceCaps(dc,HORZRES) ;
int vres = ::GetDeviceCaps(dc,VERTRES) ;
std::terr
<< _T("HORZRES=") << hres << _T("\t")
<< _T("VERTRES=") << vres << _T("\t")
<< std::endl ;
}
}
// #ifdef DPI_AWARENESS_UNAWARE
{
HWND hwnd = ::GetConsoleHwnd() ;
UINT dpi = ::GetDpiForWindow(hwnd) ;
std::terr << dpi << std::endl ;
}
// #endif
return true ;
}
コンソール AP のための最初のコード
API などをテストするために,個人的に使用している C++ のコード.
#include <clocale>
#include <iostream>
#include "_tdefine.hxx"
#include "cmd_line.hxx"
#include "ask_cli.hxx"
//#include "ask_path.hxx"
bool test (c_tstring& str)
{
std::terr << str << std::endl ;
return true ;
}
inline bool call_func (int argc,TCHAR* argv[])
{
if (argc > 1) {
for (int index=1 ; index<argc ; index++) {
tstring av = argv[index] ;
::test(av) ;
}
}
else {
while(true) {
tstring path ;
{
#ifdef OFN_filter_All
path = ::ask_path(false) ;
#else
path = ::ask_cli(_T("file ... ? =")) ;
#endif
}
if (path.empty()) { break ; }
::test(path) ;
}
}
return true ;
}
int _tmain (int argc,TCHAR* argv[])
{
_tsetlocale(LC_ALL,_T("")) ;
{
::reg_argv (argc,argv) ;
}
{
::call_func(argc,argv) ;
}
{
::test(_T("Test")) ;
}
::ask_wait() ;
return 0 ;
}
//#include "messbar.cxx"
インクルードしているファイルは cpp6_hxx.zip にある.
上のコードを test.cpp などとして保存し,同じ所に zip を展開.
g++ test.cpp などでコンパイル可能.
これらを使用したコード.
https://dev.mish.work/wordpress/?s=reg_argv
Win11 22H2
昨日 Win11 環境に VS 2005 から 2022 をインストール .
その後,幾つかのコードをビルドして動作を確認.
仮想環境の Win11 22H2 で,KB5019509 の更新があった.
幾つか試したいことができたので,ホストの Win11 も 22H2 にしたくなった.
次の所から入って 22H2 をインストール.
https://www.microsoft.com/ja-jp/software-download/windows11/
1 時間程度かかった.
先日インストールした VC 6 を起動してみると…
うまく起動する.ビルドも問題なさそう.仮想マシンで動作していたのは 22H2 だったからか?
ステップ実行できない現象はあるが,何とか使える.
2022/10/23
ステップ実行した場合のメッセージが,仮想マシンと異なる.
仮想マシンは
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は i3DV.exe (OLE32.DLL) にあります: 0xC0000005: Access Violation。
—————————
OK
—————————
ホストは
—————————
Microsoft Visual C++
—————————
OLE リモート呼び出しデバッグには管理者権限が必要です: この機能は使用できません。.
—————————
OK
—————————
「Win10 VC6 OLE」で検索すると,次の所が見つかった.
Windows10でVC6を使いたい
どうも「ツール」-「オプション」-「デバッグ」の「OLE RPC デバッグ」のチェックを外す必要があるらしい.
チェックを外す操作は,一度「ジャスト イン タイム デバッグ」にチェックを入れてから操作する必要がある.
RC4005: ‘IDR_MANIFEST’ : redefinition
VC6 から順に更新してきたプロジェクトをビルドしていると,warning RC4005: ‘IDR_MANIFEST’ : redefinition .
...
6>------ ビルド開始: プロジェクト:ClipView, 構成:Debug Win32 ------
6>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\afxres.h(32): warning RC4005: 'IDR_MANIFEST' : redefinition
6>
6> Clip140.vcxproj -> c:\Temp\MICSTool\ClipView\Debug.140\ClipView.exe
6> Clip140.vcxproj -> c:\Temp\MICSTool\ClipView\Debug.140\ClipView.pdb (Full PDB)
========== ビルド: 6 正常終了、0 失敗、16 更新不要、0 スキップ ==========
resource.h を見ると,確かに IDR_MANIFEST が定義されている.
どのタイミングで追加したのかは覚えてないが,resource.h での定義は不要と思われるので削除.
Win11 に VS 6 のインストール
先日,Win11 環境に VS6 をインストールした.
手順は Win10 の時と同様 で,DB 関係が入らない様に.
VB6 は起動した.
が,VC6 は起動できない.
昨日,Win10 上の仮想マシンの Win11 に VS6 と SP6 をインストール.
この時 VC 6 は起動可能で,ビルド,デバッグなども動作した.
今日,それを確認すると,デバッグができなくなっている.
全くできないわけではないが,ブレークするとその後がうまくない.
何かが更新されて動作しなくなったのか?
Win11 上の仮想マシンとしての Win11 も,起動はできるがデバッグがうまくない.
Win10 の時もそうだったが,何かとの相性? … Win11 21H2 だったため.
2022/10/18
以前使っていた WinXP の VHD があったので,それを Win11 上の仮想マシンとして追加.
最近使ってなかったので,いろいろと問題が…
SMB1 や mklink .
なかなかいい運用が見つからない.
2022/10/23
22H2 に上げて うまく動作する様になった.
2023/10/30
VC 6 は,Win 10 ,11 で特に困ることはなく利用できている.
たまに使用する機能でうまくないのは「コンポーネントギャラリ」くらい?
Win11 はシステムドライブが SSD のため,$(OutDir) は「シンボリック リンク」にしている.
Win11 に入っている MFC*.DLL
先日手に入った Win11 には,予め幾つかの AP が入っていた.
その中には,MFC140u.dll などが入っていたので,改めて新規インストールした環境で調べてみた.
Win11 Pro
Win11 Ent
やはり MFC40 と MFC42 みたい.
https://jml.mish.work/index.php/cpp/ref-vcredist-xxx-exe.html
Win11 VHD
新しく手に入った Win11 を VHD としてバックアップ.
Disk2vhd.exe で VHD に.
zip をダウンロードして解凍すると 3 つの exe になっている.x86,x64,arm で分かれた?
使用する exe は disk2vhd64.exe .
ViritualBox 6.1.38 を Win11 環境にインストール.
先ず,以前とっておいた Win7 vhd 6.5 GB を起動させてみると,
これは,以前書いていて,今回追記した.
https://dev.mish.work/wordpress/2019/05/01/virtualbox-win7-vhd-0x0000007b/
バックアップした VHD で起動.
特に設定を変更していなかったので,起動にはかなりの時間(10 分程度)がかかった.
今度は,仮想マシンに Win11 の iso を利用して OS のインストールから.
起動するとうまく動作しない.
もう一度.次の表示が出ている時に何かのキーを押すと iso の読込みが始まる.
Press any key to boot from CD or DVD…
が,「この PC では Windows 11 を実行できません」.
戻って「コンピューターを修復する」を選択.
「トラブルシューティング」-「コマンドプロンプト」.
\HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig を作成して次のものを追加しなければならないらしい.
BypassTPMCheck と BypassSecureBootCheck で,値は DWORD 1 .
レジストリエディタを終了して,コマンドプロンプトで setup.exe .
あとはいつも通り.
2022/10/06
「この PC では Windows 11 を実行できません」となった時の一般的に書かれている方法.
「Shift」+「F10」でコマンドプロンプトが表示される.
RegEdit を入力.
BypassTPMCheck と BypassSecureBootCheck の追加.
レジストリエディタや「この PC では Windows 11 を実行できません」を閉じる.
「本当に終了しますか?」を「はい」で閉じる.
「今すぐインストール」の画面に戻り「今すぐインストール」で続ける.
これらのことをやっていて,ひょっとして今までメインで使用していた Win10 環境でも動くのでは?
CPU が i5-6400 で少し古いため動作対象外となっている.