¥¥(コンピュータ名) を開く
\\(ComputerName) を開きたいと思い,次の様なコードを書いた.
{
tstring self_name = _T("\\\\") + ::GetComputerName() + _T("\\") ;
S_Exec se ;
se.SetFile(self_name.c_str()) ;
se.Execute() ;
}
これはこれでうまく動作するが,それを perplexity に問い合わせると
#include <windows.h>
#include <shellapi.h>
int main()
{
TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size = sizeof(computerName) / sizeof(computerName[0]);
// コンピューター名を取得
if (GetComputerName(computerName, &size))
{
// ネットワークパスを構築
TCHAR networkPath[MAX_PATH];
wsprintf(networkPath, TEXT("\\\\%s"), computerName);
// ShellExecuteを使用してエクスプローラーを起動
ShellExecute(NULL, TEXT("open"), TEXT("explorer.exe"), networkPath, NULL, SW_SHOWNORMAL);
}
return 0;
}
そのままで動作するコードが表示されている.
コンソール AP のアイコン
以前,コンソール AP にアイコンなどのリソースを追加する方法はいろいろとやった.
それを今回,動作時にアイコンを変更できないかと…
最初 Copilot で問合わせたがうまい情報は引っ掛からなかった.
それで今度は最近利用し始めた perplexity で…
「Windows cpp で コンソール AP のアイコンを指定する方法と動的に変更する方法」と入力.
kernel32 にある SetConsoleIcon が使えるらしい.
それで次の様なコードを書いてみたが…
BOOL WINAPI SetConsoleIcon(HICON hIcon)
{
typedef BOOL (WINAPI *SetConsoleIconFn)(HICON);
static SetConsoleIconFn setConsoleIcon = NULL;
if (setConsoleIcon == NULL)
{
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
if (hKernel32 == NULL) return FALSE;
setConsoleIcon = (SetConsoleIconFn)GetProcAddress(hKernel32, "SetConsoleIcon");
if (setConsoleIcon == NULL) return FALSE;
}
return setConsoleIcon(hIcon);
}
bool test (c_tstring& str)
{
std::terr << str << std::endl ;
::pause(10) ;
HICON hIcn2 = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON2)) ;
HICON hIcn3 = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON3)) ;
{
HWND hWnd = ::GetConsoleWindow() ;
::SendMessage(hWnd,WM_SETICON,TRUE, (LPARAM)hIcn2) ;
::SendMessage(hWnd,WM_SETICON,FALSE,(LPARAM)hIcn2) ;
}
::pause(20) ;
{
SetConsoleIcon(hIcn3) ;
}
::pause(30) ;
return true ;
}
Win7 や 8.1 ではうまく変更できたが,Win10 や 11 では変更できなかった.
FBX SDK 2020.3.7
FBX SDK のダウンロードページを見ると 2020.3.7 があった.
インストールしてみると,今までと lib 以下が異なる.
2020.3.4 までは VS のバージョンでわかれていたのに,今回は lib\x64\debug\ などになっている.
ビルドしてのテストなどはまた今度落ち着いた時に …
設定などは次の所に書いています.
https://jml.mish.work/index.php/cpp/fbx-sdk-setting.html
FBX Review は exe が置いてあった.
Autodesk FBX Review – Windows 64 Bit
QNAP AI Core 3.4.1
先日から QNAP NAS のパッケージのアップデートがある.
幾つかは問題なく更新できるのに AI Core 3.4.0 のみが更新に失敗する.
今までは特に問題なく更新できていた(関連するものは自動で更新されていた)のに…
イベントログを見ると,次の様になっている.
エラー 2024-06-29 18:35:45 Iwao 192.168.1.xx Qmanager Qmanager/2... App Center App Installation [App Center] Failed to install QuMagieCore. You must first install container-station.
エラー 2024-07-09 15:58:59 Iwao 192.168.1.xx Web Desktop Mozilla/5.0 App Center App Installation [App Center] Failed to install QuMagieCore. You must first install container-station.
どうも Container Station を先に更新しないといけないみたい.
Container Station を更新してから AI Core の更新でうまくいった.
warning C4786
VC 6 でビルドしているとよく出力される C4786 .
--------------------Configuration: T_prm_c - Win32 Debug--------------------
Compiling...
T_prm_c.cpp
c:\program files (x86)\microsoft visual studio\vc98\include\utility(21) : warning C4786: 'std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char> > con
st *>::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *>' : identifier was truncated to '255' characters in the debug information
Linking...
T_prm_c.exe - 0 error(s), 1 warning(s)
最初の頃は場所が限定てきていたので #pragma warning (… : 4786 ) で切り替えていた.
がそのうち,プロジェクトによっては StdAfx.h で対応する様になった.
古くからのプロジェクトで,直接はこれらの対応を行っていない(共通のヘッダでの対応)プロジェクトが幾つもある.
コンパイル単位ではほとんど C4786 は出力されないが,一部のソースで出力され,また限定できたのでそのメモ.
--------------------Configuration: BlockIn - Win32 Debug--------------------
Compiling...
SMastSel.cpp
c:\program files (x86)\microsoft visual studio\vc98\mfc\include\afxtempl.h(63) : warning C4786: 'std::vector<std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char
>,std::allocator<char> > > >,std::allocator<std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > >' : identifier was truncated to '
255' characters in the debug information
SMastSel.obj - 0 error(s), 1 warning(s)
ソースに #pragma warning (disable : 4786 ) を追加して,更にそのヘッダがインクルードしているものをソースに追加.
これで AfxTempl.h をインクルードしているヘッダファイルが限定できた.
iostream を使用している場合も,その前に disable : C4786 が必要みたいだが,その場合は簡単には見つけられない?
他には fstream ,string .
robocopy エラー 87
IO DATA SSPA-USC500K が手に入ったので,テストを兼ねてソースなどをバックアップ.
自前の「ディレクトリ以下のコピー」ツールでコピーしていると…
100% 新しいファイル 1300 Vxx_P_A_.hxx
2024/06/23 15:44:41 エラー 87 (0x00000057) ファイル属性を変更しています \\DS220\Public\Document\Develop\_.SRC\__Iwao\P_A_gnsa.hxx
パラメーターが間違っています。
5 秒間待機しています... 再試行しています...
全てのファイルがこの様になるわけではない.
原因は,恐らくコピー先が exFAT のため?
ちゃんと調べたわけではないが,更新日時が古い(最近編集していない)ファイルでエラーになる模様.
これらのファイルは,昔 NT サーバなどで管理していたものを NAS に移して運用している.
その後,その NAS 上のものを編集する様になり,更新したものはエラーにはなっていない?
コピーはできているのと,同じコマンドの再実行ではエラーにはならないのでこのままとする.
エラーになったファイルは「作成日時」と「アクセス日時」がコピーしたタイミングに更新されてしまっている.
2024/07/10
改めて調べてみると,コピー元のアクセス日時が正しくない.
::ShellExecute
「インデックスのオプション」を開くために ::ShellExecute などから開けないかと…
検索するとコマンドプロンプトなどで「control.exe /name Microsoft.IndexingOptions」とすれば良いことがわかった.
この動作の cpp のコード.
CString Error_FormatMessage(const DWORD error)
{
CString message ;
LPVOID lpMessageBuffer = NULL ;
if (::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,error,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&lpMessageBuffer,0,NULL)) {
message = LPTSTR(lpMessageBuffer) ;
::LocalFree(lpMessageBuffer) ;
}
return message ;
}
void CShellEDlg::OnExecute()
{
UpdateData(TRUE) ;
HINSTANCE hInst = ::ShellExecute(this->GetSafeHwnd(),m_StrOper,m_StrFile,m_StrPara,NULL,SW_SHOW) ;
if (UINT64(hInst) > 32) { return ; }
DWORD error = ::GetLastError() ;
CString str ;
{
str.Format(_T("%d\r\n%d"),DWORD(hInst),error) ;
str += _T(" ") + ::Error_FormatMessage(error) ;
str += _T("\r\n") + m_StrOper ;
str += _T("\r\n") + m_StrFile ;
str += _T("\r\n") + m_StrPara ;
}
AfxMessageBox(str) ;
}
SetWindowPos で最前面に
以前から CWnd::SetWindowPos などを使用してウィンドウを最前面にしているツールがいくつかある.
ほとんどの場合これでうまくいっているが,先日テストしていて最前面に移動しない現象を確認.
2 つの exe があり,A.exe から B.exe を起動している.
B.exe はダイアログベースで,そのウィンドウを A.exe のウィンドウより前面に表示するもの.
Spy++ で見ると最前面に移動できた時は WS_EX_TOPMOST がある.
が,うまくいかない場合には WS_EX_TOPMOST がない状態.
いろいろと操作してみたが,なかなか現象が絞れなかった.
結局は B.exe を起動する時,他のウィンドウにフォーカスが移っている?と,最前面にならないみたい.
B.exe の起動をエクスプローラなどから行い,ウィンドウが表示される前にブラウザなどに切替えると最前面にならない.
今回対象のものは,最前面に移動しなくても問題ないと思われるのでこのままとする.
CXxxxDlg::OnCreate が 2 回
「ある操作を行ったとき exe が 2 つ起動する」と報告があった.
言い訳になるが,通常この動作は年に 2 回程度しか通らないもの.また,他の操作により通らないこともある.
その条件になる様に環境を設定して試すと,確かに…
その部分のコードは,何年も変更はしていない.
いろいろと動作を確認していると,VC 10 以前では問題ないが,11 以降で 2 つ起動することがわかった.
その動作の部分のみを抜き出して動作を試した.
int CT_DlG_1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: ここに特定な作成コードを追加してください。
{
HWND HWnd = NULL ;
{
CWnd* mainWnd = AfxGetMainWnd() ;
if (mainWnd != NULL) {
HWnd = mainWnd->GetSafeHwnd() ;
}
}
HINSTANCE hInst = ::ShellExecute(HWnd,NULL,_T("NotePad.exe"),NULL,NULL,SW_SHOWNORMAL) ;
return -1 ;
}
return 0;
}
MFC の動作が変わったのか,CXxxxDlg::OnCreate が 2 回呼ばれるようになったみたい.
https://itl.mish.work/i_Tools/Doc/blog/vc/TDlg0614.zip
2 回目に呼ばれた時は,何もしないで return -1 とする様に変更予定.
高 DPI 環境の CToolBar
複数のツールバーに対応するために CBitmap を new で生成する様に.
そのために新たに作成しようかと思ったが,既存のままでも良さそうなのでそれを少し修正.
また,次の様に予めボタンの背景を変更してみたが,うまくいかなかった.
{
CDWordArray orgBits ;
DWORD orgBmpSize = bm.bmWidthBytes * bm.bmHeight ;
orgBits.SetSize(orgBmpSize) ;
DWORD orgBitsSize = tb_img.GetBitmapBits(orgBmpSize,orgBits.GetData()) ;
for (DWORD index=0 ; index<orgBitsSize ; index++) {
if (orgBits[index] == 0xc0c0c0) {
orgBits[index] = col3D ;
}
}
tb_img.SetBitmapBits(orgBitsSize,orgBits.GetData()) ;
}
何かの手順が違っているみたいで,環境により?うまくいっている様に見えることもある.
CToolBar ボタン画像
先日の内容で残っているのが,ボタン画像の背景の色.
リソースエディタで 0xC0C0C0 を指定している所が,ボタンの色(::GetSysColor(COLOR_3DFACE))にならない.
何年も前に作成したコードを見ると,0xC0C0C0 を COLOR_3DFACE に置き換えている部分がある.
それでMFC のコード afxtoolbarimages.cpp を眺めていると CMFCToolBarImages::TransparentBlt があった.
その中で ::TransparentBlt を呼出している.
先日のコードの次の部分を ::TransparentBlt に変更してテストすると,
dstDC.StretchBlt(0,0,imageSize.cx,imageSize.cy,&srcDC,0,0,org_size.cx,org_size.cy,SRCCOPY) ;
::TransparentBlt(dstDC.GetSafeHdc(),0,0,imageSize.cx,imageSize.cy,
srcDC.GetSafeHdc(),0,0,org_size.cx,org_size.cy,0xC0C0C0) ;
0xC0C0C0 の部分が描画されていない(透明になっている)ことが確認できたので,
dstDC.FillSolidRect(0,0,imageSize.cx,imageSize.cy,0xf0f0f0) ;
::TransparentBlt(dstDC.GetSafeHdc(),…,0xC0C0C0) ;
::SetStretchBltMode(…,HALFTONE) が効かない?
仮の DC を用意して ::TransparentBlt(そのまま) してそれを ::StretchBlt(リサイズ) の様にしてもダメだった.
TransparentBlt HALFTONE で検索したがあまり有用な情報は引っ掛からなかった.
リサイズして転送する(StretchBlt)前に CBitmap::GetBitmapBits で取り出し 0xC0C0C0 を書き換えるしかないか?
CToolBar ボタンのリサイズ
リサイズ部分を組み込んでみたが
ボタン画像の位置がズレている,DDB に対する操作が何か違っている.
試しに,新しいボタン画像サイズを次の様に求めるとそれなりの高さになった.
newImgSize.cy = newBtnSize.cy – 7 ;
newImgSize.cx = newBtnSize.cx – 7 ;
newImgSize.cy = newBtnSize.cy – 6 ;
これでサイズは良さそう.
{
CSize imageSize = newImgSize ;
imageSize.cx*= btnCount ;
static CBitmap newImg ; // CBitmap* newImg = new CBitmap ;
{
CBitmap tb_img ;
tb_img.LoadBitmap(idr) ;
{
BITMAP bm = {0} ; tb_img.GetBitmap(&bm) ;
CSize org_size = CSize(bm.bmWidth,bm.bmHeight) ;
CDC* wndDC = toolBar->GetDC() ;
newImg.CreateCompatibleBitmap(wndDC,imageSize.cx,imageSize.cy) ;
CDC srcDC ; srcDC.CreateCompatibleDC(wndDC) ;
CDC dstDC ; dstDC.CreateCompatibleDC(wndDC) ;
CBitmap*oldSrcBmp = srcDC.SelectObject(&tb_img) ;
CBitmap*oldDstBmp = dstDC.SelectObject(&newImg) ;
::SetStretchBltMode(dstDC.GetSafeHdc(),HALFTONE) ;
dstDC.StretchBlt(0,0,imageSize.cx,imageSize.cy,
&srcDC,0,0,org_size.cx,org_size.cy,SRCCOPY) ;
srcDC.SelectObject(oldSrcBmp) ;
dstDC.SelectObject(oldDstBmp) ;
}
}
toolBar->SetBitmap(newImg) ;
}
static CBitmap newImg としているため,複数のツールバーには対応していません.
CBitmap* newImg = new CBitmap の様にして終了時開放する必要があります.
CBitmap のコピー
次の所を参考に CBitmap のリサイズ …
How do you scale a CBitmap object?
1 回はリサイズできているが,コピー動作の部分が違っているみたいで正しく表示できない.
検索してみたがあまりわかりやすいコードに引っ掛からなかった.
Copilot で問合わせると
// 元のビットマップ
CBitmap originalBitmap;
// ... (originalBitmap を適切に初期化)
// コピーするビットマップ
CBitmap copiedBitmap;
// 元のビットマップの情報を取得
BITMAP bitmapInfo;
originalBitmap.GetBitmap(&bitmapInfo);
// コピーするビットマップを作成
copiedBitmap.CreateBitmap(bitmapInfo.bmWidth, bitmapInfo.bmHeight, bitmapInfo.bmPlanes, bitmapInfo.bmBitsPixel, NULL);
// 元のビットマップのビットを取得
BYTE* pBits = new BYTE[bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight];
originalBitmap.GetBitmapBits(bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight, pBits);
// コピーするビットマップにビットを設定
copiedBitmap.SetBitmapBits(bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight, pBits);
// メモリを解放
delete [] pBits;
関数として書き直し.
CBitmap* Copy_CBitmap (CBitmap* src)
{
CBitmap* dst = new CBitmap ;
BITMAP bm ;
src->GetBitmap(&bm) ;
dst->CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,NULL) ;
BYTE* pBits = new BYTE[bm.bmWidthBytes*bm.bmHeight] ;
src->GetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits) ;
dst->SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits) ;
delete[] pBits ;
return dst ;
}
何とかコピーを表示できた.
https://itl.mish.work/i_Tools/Doc/blog/migrate/T_CB0606.zip
mfc140ud.dll が見つからない …
「mfc140u.dll が見つからない…」の場合は
Microsoft Visual C++ 再頒布可能パッケージ
VC 2019 でデバッグビルドして実行すると,
—————————
Test.exe – システム エラー
—————————
mfc140ud.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。
—————————
OK
—————————
ファイル名の所は MSVCP140D.dll などもある.
また exe は VC 2015 以降でデバッグビルドしたもの.
原因はわかっている.先日 VS 2022 のアップデートがあった.
その時 Win11 環境はうまくできたが Win10 環境では何故か失敗したため.
どうしたものか…
「VS Installer」の「VS 2022」で「変更」を選択,そのまま進めるとダウンロード,インストールが始まった.
「修復」の方が良かったみたいだが …
CBitmap の表示
ツールバーのビットマップをリサイズするために CBitmap を調べ始めた.
Inside VC++ Version 5 を参考に次の様に書いてみた.
プログラミング Visual C++ .NET では省かれている?
void CT_CBmpView::OnDraw(CDC* pDC)
{
// CT_CBmpDoc* pDoc = GetDocument();
// ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
{
CDC dc_mem ; dc_mem.CreateCompatibleDC(pDC) ;
CBitmap bitmap ; bitmap.LoadBitmap(IDR_MAINFRAME) ;
BITMAP bm = {0} ; bitmap.GetBitmap(&bm) ;
{
CRect rect(0,0,0,0) ;
GetClientRect(&rect) ;
rect.DeflateRect(100,100,200,200) ;
::SetStretchBltMode(pDC->GetSafeHdc(),HALFTONE) ;
dc_mem.SelectObject(&bitmap) ;
// pDC->BitBlt (rect.left,rect.top,rect.right,rect.bottom,&dc_mem,0,0,SRCCOPY) ;
pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,
&dc_mem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY) ;
}
}
}
そのまま貼り付けてテスト可能な様に View の OnDraw に書いています.
これを参考に実装する場合,リソースの読込み部分などは OnInitialUpdate などで行ってください.
https://itl.mish.work/i_Tools/Doc/blog/migrate/T_CB0604.zip
欲しかった CBitmap のリサイズのコードは次の所にあった.
How do you scale a CBitmap object?
高 DPI 環境での CToolBar
vC 6 MFC プロジェクトを VC 2010 以降に更新すると,高 DPI 環境でツールバーがうまくない.
CMFCToolBar であれば OK .
個人的には 2005/06 に作成したコードを改良したものを使用している.
どこを参考にしたのかはちょっとわからない.
「MFCによるWindows95プログラミング」や「INSIDE VISUAL C++ 5TH ED」などと思う.
それを簡単に利用できる様にできないかと…
コードは次の様な感じ.
BOOL ToolBar__Resize (CToolBar* toolBar,UINT idr)
{
double dpi_s = 1. ;
{
dpi_s = ::GetDPI_scale(toolBar->GetSafeHwnd()) ; // ::GetDpiForWindow() / 96.
}
if (dpi_s == 1.) {
return TRUE ;
}
CToolBarCtrl& tbCtrl = toolBar->GetToolBarCtrl() ;
CSize btnSize(0,0) ;
CRect bdrRect(0,0,0,0) ;
{ // ボタンなどのサイズを取得
DWORD dwSize = tbCtrl.GetButtonSize() ;
{
btnSize.cx = LOWORD(dwSize) ;
btnSize.cy = HIWORD(dwSize) ;
}
bdrRect = toolBar->GetBorders() ;
}
CSize newBtnSize = btnSize ;
CRect newBdrRect = bdrRect ;
{ // サイズを調整
newBtnSize.cx = int(btnSize.cx *dpi_s) ;
newBtnSize.cy = int(btnSize.cy *dpi_s) ;
newBdrRect.left = int(bdrRect.left *dpi_s) ;
newBdrRect.top = int(bdrRect.top *dpi_s) ;
newBdrRect.right = int(bdrRect.right *dpi_s) ;
newBdrRect.bottom= int(bdrRect.bottom*dpi_s) ;
}
{ // サイズを指定
tbCtrl.SetButtonSize(newBtnSize) ;
toolBar->SetBorders(newBdrRect) ;
}
return TRUE ;
}
ツールバーボタンのビットマップのリサイズはまだ書換えができていない.
https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0603.zip
VC6 から VC2019 への移行
今回は VC 6 ds? の VC 2019 への更新.
VS 2022 では,VC 6 からのアップグレードがなくなった.
VS 2019 で dsw を開き 2019 に更新.
設定は VC 8 の時の手順とほとんど変わらない(設定値が微妙に異なる部分あり).
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(Configuration).142\」に.
「文字セット」を「Unicode 文字セットを使用する」に.
「プリコンパイル済み…」を「$(IntDir)$(TargetName).pch」に.
「C/C++」の「出力ファイル」を「$(IntDir)」に.
「リンカ」の「出力ファイル」を「$(OutDir)$(ProjectName).exe」に.
「ブラウザ情報」の「出力ファイル」を「$(OutDir)$(ProjectName).bsc」に.
そのままビルドすると,デバッグ版では D8016 エラーになる.
「C/C++」-「すべてのオプション」の「関数レベルでリンクする」をブランクに.
https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0526.zip
2024/07/30
VC 6 から VC 2022 への移行
2024/08/21
VC 2010 などでも同じように指定することで移行が可能なことを確認.
Hyper Backup 設定
今日 Synology NAS のパッケージ MariaDB 10 の更新があった.
更新は他のパッケージと同様に行えばよい.
更新後ちょっと気になったのが「もし失敗したら?」ということ.
Hyper Backup でバックアップしておけば良さそうなので,その設定.
保存先として,ローカルディスクや USB ドライブも指定できるが,他社 NAS を対象とした.
ASUSTOR NAS の設定は「サービス」-「Rsyncサーバー」にある.
「Rsyncサーバーを…」をチェックして「追加」で保存先を指定すれば良い.
モジュールの「名前」は,Hyper Backup の「バックアップモジュール」で指定する名称になる.
QNAP NAS は「HBS 3」-「Rsyncサーバー」にある.
保存先の指定は特になさそうで「共有フォルダー」が「バックアップモジュール」で指定する名称になるみたい.
Hyper Backup の「バックアップ ウィザード」で「フォルダとパッケージ」を選択.
「ファイル サーバー」の「rsync」を選択して,今回は「単一バージョン」を選択.
バックアップ先の設定でサーバの IP やユーザー名などを設定して「次へ」.
今回「データ バックアップ」は特に指定しないで「次へ」.
「アプリケーション」にチェックをつけて「次へ」.
あとはそのまま受け入れてバックアップした.
バックアップされたデータは次の様になっている.
VC 6 プロジェクトの移行
今更の内容ではあるが,VC 6 プロジェクトを VC 8 などに移行する手順のまとめ.
私の場合,VC 6 からプロジェクトを作成して VC 2017 などでビルドした exe をリリースすることが多い.
他にも,コードの単体テストのためにコンソール AP を作成する時も VC 6 がお手軽.
Win11 でも MFC42*.dll などは入っているので,テストも exe をコピーすれば可能となる.
以前は VC 7 なども対象としていたが,関係するプロジェクトで必要がなくなり,今は使っていない.
また VC 7 形式を通すと vcproj を直接編集しないといけない状態になることがある.
プロジェクトのバックアップをしやすい様に exe などの出力先は,別の所を指定している.
VC 6 で MDI プロジェクトとして作成.プロジェクト名はなるべく 5 文字以下にしている.
出力ディレクトリを変更.この時 VC のバージョンごとに出力先を分けている.
C:.
└─Test
├─Debug.060
├─Debug.080
├─Release.060
└─Release.080
VC 8 で Test.dsw を開く.
文字セットを「Unicode 文字セットを使用する」に.
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(ConfigurationName).080」に.
「プリコンパイル済み…」を「$(IntDir)/$(TargetName).pch」に.
「C/C++」の「出力ファイル」を「$(IntDir)/」に.
「リンカ」の「出力ファイル」を「$(OutDir)/$(ProjectName).exe」に.
「プログラム データベース…」を「$(OutDir)/$(ProjectName).pdb」に.
「ブラウザ情報」の「出力ファイル」を「$(OutDir)/$(ProjectName).bsc」に.
ツリーに「MIDL」が表示されている場合は「タイプライブラリ」を「$(IntDir)/$(ProjectName).tlb」に変更.
必要に応じて,それぞれの「コマンド ライン」で 060 のままの所がないか確認.
ビルドすると次のワーニングになる.
1>------ ビルド開始: プロジェクト: Test, 構成: Debug Win32 ------
1>コンパイルしています...
1>Test.cpp
1>o:\document\vc_test\migrate\test\test.cpp(61) : warning C4996: 'CWinApp::Enable3dControls': CWinApp::Enable3dControls is no longer needed. You should remove this call.
1> c:\program files (x86)\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4477) : 'CWinApp::Enable3dControls' の宣言を確認してください。
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>Test - エラー 0、警告 1
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========
削除,または次の様に修正する.
#if(_MFC_VER >= 0x0700)
#else
#ifdef _AFXDLL
Enable3dControls(); // 共有 DLL 内で MFC を使う場合はここをコールしてください。
#else
Enable3dControlsStatic(); // MFC と静的にリンクする場合はここをコールしてください。
#endif
#endif
個人的によく変更する設定として
「C/C++」-「言語」-「OpenMP サポート」を「はい」に.
「リンカ」-「システム」-「大きい…アドレス」を「2GBを超える…サポートする」に.
Test.sln と Test.vcproj を Test_80.sln と Test_80.vcproj としてコピー.
Test_80.sln をエディタで開いて,Test_80.vcproj に.
vC 9 以降に更新する場合は Test.sln を開く.
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(ConfigurationName).090」などに.
VC 8 の時と同様に
Test.sln と Test.vcproj を Test_90.sln と Test_90.vcproj としてコピー.
Test_90.sln をエディタで開いて,Test_90.vcproj に.
vcproj をエディタで開くと TypeLibraryName が c:\Temp\…\Test\Debug.060/Test.tlb として残っている.
そのままでも問題はなさそうだが,修正するとすれば $(IntDir)/$(ProjectName).tlb か.
https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0520.zip
2024/07/26
VC 10 以降でビルドした MDI.exe で「引数が正しくありません。」となることがある.
対応方法は InitInstance に AfxOleInit() の呼出しを追加する.
「Windows 検索」設定
Windwos Search の「インデックスのオプション」を開きたいと問い合わせが入った.
以前の Windows であれば「コントロールパネル」から入ると「インデックスのオプション」があった.
Win10 以降?は「コントロールパネル」も簡単には開けない.
Windows の検索ボックスで “インデックスのオプション” と入力すれば良かったのだが…
それが思い出せず,”Windows サーチ” や “Windows 検索” と入力して,うまくたどり着けない.
“Windows Search” と入力しないとうまくないみたい.
「Windows 検索」の「クラッシック」の下の「…検索場所をカスタマイズ…」を選ぶと表示できる.
Windows の設定などは,キーワードを英語で入力する方が良いのかもしれない.
2024/06/19
「スタート」で表示される「検索ボックス」に何か入力すると「…」(オプション メニュー)が表示される.
それを選択すると「インデックス オプション」などがある.
2024/06/20
「インデックス オプション」は次の様なコマンドでも可能なので,::ShellExecute で呼び出す様にした.
control.exe /name Microsoft.IndexingOptions