VS 2017でインストーラをビルドするところまで進んだ

午後2時半起床、晴れ。朝食は黄な粉のかき餅小8個。Visual Studio 2017 への移行作業がようやく軌道に乗った。しばらくは単純な書き換えを行うだけになった。多分これは今日一晩掛ければ終わるだろう。VBで何か問題が出る可能性はあるが、越えられないというほどにはならないと思う。もう少しで移行完了できるという見通しが立った。

Visual Studio 2005, 2010, 2017 は新しい環境で完全に並列実行できる態勢になっている。すでにVisual Studio 2019 の年内リリースが予告されているが、このバージョンの目標は「チームの生産性を向上させるためにクラウドをシームレスに使うメソッドの確立」にあるので、今のところ自社製品にはほとんど影響はないものと見られる。従って、現在の移行措置が完了すればしばらくは安定な開発環境が確保できると考えてよいと思う。さて、ぼちぼちと作業に掛かることにしよう。

しばらく、デバッグの「本作業」から遠ざかっていたので、ルーチンを忘れてしまう。まず、「始業時バックアップ」から開始しなくてはならない。最終的にはVS 2005, 2010, 2017を統合的に使えるような構成を組まなくてはならないが、今日のところは VS 2017 のためのレポジトリである ZELKOVA_2020 のバックアップだけを取っておくことにする。このルーチンには「緊急退避用バックアップ」も含まれ。これまではUSBに保管してきたが、USBは耐久性にやや問題があるので、むしろスマホにバックアップするのが確実なのではないかと思う。

緊急時ノートは持ち出せなかったとしても、スマホだけは常時携帯できると思われるし、そうすべきだろう。mmm… ZELKOVA フォルダをバックアップしたが異様に時間が掛かっている。容量を見たら、6.36GBもある。これは何だろう?VS 2010でビルドしている ZELKOVA_2019は560MBだ。VS 2005でビルドしているZELKOVA_2018に入っているZELKOVA は519MBしかない。

ZELKOVA_2020のZELKOVA は6.36GB、ファイル852本、フォルダ85だ。ZELKOVA_2018は519MB、ファイル数792、フォルダ数27でフォルダ数が圧倒的に少ない。ZELKOVA_2020のトップレベルには以下のような8個のフォルダがある。

  1. .vs 6.36GB, 852本、85フォルダ
  2. _UpgradeReport_Files 15.7KB、4本、0フォルダ
  3. debug 4.98MB, 12本、0フォルダ
  4. Release 0, 0, 0
  5. SetupBeta 28.4MB、6本、2フォルダ
  6. ZelkovaVB 5.04MB、229本、8フォルダ
  7. ZelkovaDLL 0.97GB、424本、6フォルダ
  8. ZelkovaGC 16.5MB、53本、4フォルダ
  9. ZelkovaZ 29.3MB、64本、3フォルダ

 

.vs という隠しフォルダがあってその中に大量のファイルが作られている。これは何だろう?内部には大量の暗号化された(ような)フォルダがあって、その中にはxxxx.IPCHというファイルが1個だけ入っている。このフォルダはすべての「モジュール」ごとに作られているように思われる。何をやっているのか?まったく見当も付かない。これが「Visual Studio 2017」なのだとしても、何のためにこんなことをやっているのだろう?どうも「インテリセンス」に関わりのあるファイルらしい。

Visual Studio 2010 の sdf と ipch

バックアップを取るたびにこの大量ファイルをコピーするのは馬鹿げている。どこか外に出してアクセスするようにできなくてはならないのだが、上記リンクにその方法が書いてあった。[ツール] – [オプション] の中の、[テキストエディター] – [C/C++] – [詳細] で設定できる。

ここで、「[常にフォールバック位置を使用] という項目をTrueに変更し、[フォールバック位置] というところにフォルダ名を指定してやれば、sdf と ipch はそっちに置いてくれるようになる」。これを除けば、従来フォルダと同程度に圧縮できるはずだ。Visual Studio は個人のドキュメントフォルダに専用領域を確保しているのだから、最初からそこに置いておけばよいような気もするのだが…

まぁ、中には一つのPCで複数のプロジェクトを並行して走らせるようなこともあるだろうから、プロジェクトに付属させるというのは悪いアイディアではないかもしれないが…分かり易いのは.vsごと外に出すという仕様だろう。ZELKOVA_2020に.vsを移してそこを参照するようにしてみよう。「D:\ZELKOVA_2020\.vs\ZelkovaTree」を参照するように設定してみたところ、以下のようなパネルが出た。

image

これで問題ないと思われるが、.vsを直接使ってできるかどうか調べてみる。大丈夫なようだ。VSが「このフォルダは適切です」と言っているのだから、問題ないだろう。初回バックアップにはこのフォルダを残しておいて、ZELKOVAからは削除しておこう。_UpgradeReport_Filesは大きなフォルダではないが、移行後は不要と思われるので、これも削除しておいてよいと思う。mmm… これでも1.16GBある。これまでの倍だ。内容的にはほとんど変化していないように見えるのだが…

クリーンビルドしてみた。エラーが104個出ているが、DLLに限れば修正が残っているファイルはあと7本だけだ。ともかく、まずこれを片付けてしまおう。⇒終わったが、まだコンパイルエラーが出ている。

BugReportDialog.cppのGetOSDisplayStringで「C4996    ‘GetVersionExA’: が非推奨として宣言されました」という警告になる。以下のURLに対処策がある。

【C/C++】OSのバージョン取得

VersionHelpers.hに記載された関数を使えということのようだ。GetOSDisplayStringでは「Windows NT 4.0 SP5 以前と Windows 9x」を弾いているのだが、この場合は、IsWindowsXPOrGreater(XP以上)でよいのではないだろうか?というか、’GetVersionExA’が使えないとこの関数GetOSDisplayString自体まったく機能しないので、丸ごと差し替える必要がある。

Windowsバージョンの取得方法

上記にGetOSDisplayStringの改訂版があるので差し替えておこう。いや、これはC#で書かれている。これをC++に戻すのはちょっと手が掛かりそうだ。GetOSDisplayStringはバグレポートダイアローグにOS名を表示するために使われているが、現在はバグレポートダイアローグ自体止めてあるので、ここではパスすることにする。これでコンパイルエラーは出なくなったが、リンカーでエラーが出ている。

LNK1117    オプション ‘VERSION:1.8.0’ に構文エラーがあります

リンカーでエラーが出るというのは珍しい。そもそもリンカーのオプションなどはすべてデフォルトのままで何もいじっていないはずだが…

VS2003からのC++プロジェクトアップグレードするとLNK1117エラーが出る場合の対処

上記で見ると、VS 2017ではVERSIONというオプションはサポートされていないというように読める。リンカーオプションでバージョンの項目を空欄にしてこのエラーは解消したが、大量の未解決シンボルが出る。エラーコードはLINK2001だ。ATL::_AtlBaseModuleの実装がないということのようなので、ライブラリのパスが切れているものと思われる。

リンカーオプション→特定の既定のライブラリを無視にatls.libが含まれているのだが…ATLというのはCOMを実装するために必要な Active Template Library だ。atsld.lib は VS 2013 から atsl.lib に統合されて存在しなくなったという記事もある。オリジナルのZELKOVA_2018では「特定のライブラリの無視」はatls.libだけで、そのあとに続く%(IgnoreSpecificDefaultLibraries)は入っていない。

もともとこれで動いていたのだとすれば、外部シンボル””class ATL::CAtlBaseModule ATL::_AtlBaseModule” (?_AtlBaseModule@ATL@@3VCAtlBaseModule@1@A)” を求めるということ自体がおかしいのではないだろうか?GetOSDisplayStringも未定義になっているが、これは実装を止めたのだから当然かもしれない。_AtlBaseModuleはほとんどすべてのCPPファイルから参照されている…_AtlBaseModuleはatlimage.hのIsTransparencySupportedという関数から参照されている。

inline BOOL CImage::IsTransparencySupported() throw()
{
#if WINVER >= 0x0500
return( _AtlBaseModule.m_bNT5orWin98 );
#else  // WINVER < 0x0500
return( FALSE );
#endif  // WINVER >= 0x0500
}

atlimage.hというファイルはc:\program files (x86)\microsoft visual studio 8\vc\atlmfc\include\atlimage.hにあるが、このファイルはVS 2017では参照されていないはずなのだが…検索を掛けるとMicrosoft Visual Studio 8 のファイルが出てくるのだがどういうことだろう?このエラーはどこかに_AtlBaseModuleというオブジェクトを実装してやれば消えるような気がするのだが…

CAtlBaseModule _AtlBaseModule;

を設置し、さらにCAtlBaseModule のコンストラクタとデストラクタを実装してみたが、エラーは消えない。atls.libを除外しないようにリンカーオプションを変更してエラーはすべて解消した。これまでは問題なく動作していたのに何がどう変わったのかよく分からないが、ともかくこれで進んでみよう。ZelkovaGC.cppでも上と同様「を宣言すると、クラス メンバーが隠蔽されます」のエラーが出ている。⇒GCはビルドできたが、OCXで下記のエラーが発生する。

エラー    MIDL2338    switches are contradictory  -no_robust vs. -target    ZelkovaZ3    D:\ZELKOVA_2020\ZELKOVA\ZelkovaZ\midl    1
エラー    MIDL1024    Errors on command line–Aborting    ZelkovaZ3    D:\ZELKOVA_2020\ZELKOVA\ZelkovaZ\midl    1

よく分からないが、プロジェクトのプロパティ→MIDL→詳細設定→パラメータの確認を「いいえ(/no_robust)」から「はい(/robust)」に変えてみた。これでこのエラーは解決した。

Build fails from from msbuild command line with Errors MIDL2338 and MIDL1024. Works in VS2017

まだエラーが残っている。

警告    C4793    COleControl::`vcall'{544}”: ネイティブ関数としてコンパイルされました:    ZelkovaZ3    D:\ZELKOVA_2020\ZELKOVA\ZelkovaZ\ZelkovaCtrl.cpp    1
警告    C4793    CZelkovaCtrl3::`vcall'{572}”: ネイティブ関数としてコンパイルされました:    ZelkovaZ3    D:\ZELKOVA_2020\ZELKOVA\ZelkovaZ\ZelkovaCtrl.cpp    1
エラー    LNK1117    オプション ‘VERSION:1.8.0’ に構文エラーがあります。    ZelkovaZ3    D:\ZELKOVA_2020\ZELKOVA\ZelkovaZ\LINK    1

C4793は以前にも出ていた。なぜだろう?LNK117のバージョンオプションを空欄にしたら、C4793も出なくなった。GCが認識されていなかったが、VBの参照にGCのプロジェクトを追加してエラーは消えた。ただし、VBではまだエラーが残っている。

エラー        署名中にエラーが発生しました: ..\debug\app.publish\ZelkovaTree2018.exe の署名に失敗しました。SignTool Error: The signer’s certificate is not valid for signing.
SignTool Error: An error occurred while attempting to sign: ..\debug\app.publish\ZelkovaTree2018.exe    ZelkovaVB3

VBのプロパティ→署名で「ClickOnce マニフェストに署名する」をオフにしてこのエラーは回避できたが、まだもう一つ警告が残っている。

1>  COM 参照 ‘ZelkovaZ3Lib’ は ActiveX コントロール ‘AxZelkovaZ3Lib’ の相互運用アセンブリですが、コンパイラによって /link フラグでリンクされるように設定されています。この COM 参照は参照として処理され、リンクされません。

この警告は無視してもよいだろう。しかし、起動時エラーがかなり出ている。一番多いのは「….dll’ が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。」で、これはシンボルファイルが読めなかったというものなので無視してよい。「シンボルの読み込みをスキップしました。モジュールは最適化されていて、デバッグ オプションの [マイ コードのみ] 設定が有効になっています。」も出る。どこで発生しているのか分からないが、

Invalid parameter passed to C runtime function.

というエラーが7件発生している。

0x752CAB32 (KernelBase.dll) で例外がスローされました (ZelkovaTree2018.exe 内): 0x000006BA: RPC サーバーを利用できません。

というエラーも出るが、これは前から出ていたものだ。

mincore\com\oleaut32\typelib\tlibapi.cpp(2279)\OLEAUT32.dll!76806C31: (caller: 767EA33C) ReturnHr(2) tid(3bb0) 8002801D ライブラリは登録されていません。

というエラーも出る。これは見たことがないような気がする。

‘ZelkovaTree2018.exe’ (Win32): ‘D:\ZELKOVA_2020\ZELKOVA\debug\Interop.ZelkovaZ3Lib.dll’ が読み込まれました。モジュールがシンボルなしでビルドされました。

というのも出る。これはOCXのシンボルデバッグができないという意味だろうか?いや、問題なくできそうだ。これでビルドしたモジュールが走るところまで来た。例のLoadNamePropertyで「値ゼロはValueに対して有効ではありません」というメッセージが出ている。ここまで来れば「日常のデバッグ」に戻れる。

現行ではサンプルはプログラムフォルダのCommon Files\ゼルコバの木系図に入っているが、ドキュメントフォルダの方がよいのではないだろうか?プログラムフォルダはシステムフォルダなのであまり適切ではないように思われる。ここに置いたのは複数のユーザIDからアクセスできるようにするという理由だったと思うのだが、系図データはやはり個人領域に置くべきだろう。

▲系図データサンプルは個人領域にインストールする。テーマファイルなどもそうした方がよい。

mmm… 動作が少しおかしくなっている。どこかで修正をミスっている可能性がある。デバッグするしかなさそうだ。

▲起動してTOPOLOGY::TribeDecompositionで(forefather->klist.senzo > 0)により停止する。forefatherには森田家曽祖父#113が入っている。ビルドしようとしたら、SBRファイルがないというエラーになった。DLLに書き込めなかったのでdebug内のファイルをすべて破棄したためと思われる。クリーンビルドはエラーなしで完了したが、このフォルダにはSBRファイルは入っていない。SBRはZelkovaDLLに入っている。このフォルダの中身はまったく操作していない。何か言い掛かりを付けられたような感じがする。

修正ミスがあったので、修正した。今度はwntdll.pdbが読み込まれていませんというエラーで停止した。オプションで「ソースファイルが見つからない場合に常に逆アセンブリを表示する」をオンに切り替えた。このような場合、マイクロソフトはAzureでソースを提供しているようだ。どうも何かまだおかしなところがあるようだ。

image

これは時間が掛かり過ぎているという意味だが、タモリんちを読み込むのにそれほど時間が掛かるはずはないので何か状態がおかしくなっているものと思われる。というか、暴走ないし迷走しているように思われる。BuildSameGeneMarriageGraphでハングしているようだ。ステージ【4】複数の親を持つ終端カードを節点とする自己ループを追加するでループしているようだ。⇒もう一つ修正ミスがあった。

いずれもループカウンタのローカル変数の修正に失敗している。Visual Studio 2017 のコンパイラはブロック内で同一変数名を使うことを禁止している。この仕様変更は確かに意味があるし、実際この修正で潜在していたバグを少なくとも3つ取り除くことができたが、同時に複数のバグを作り込んでしまう結果となった。

修正は別の名前を付ければよいというだけの簡単なものだが、ブロックが大きくて見通せない場合には修正を誤る可能性がある。この種のミスは簡単に発生しそうなのでまだ出てくるかもしれない。取り敢えず問題なく動作しているようだが、源氏テスト9で描画上の瑕疵が出ている。

▲源氏テスト9を開いて※2の脚下垂線に繋がる水平線がない。左中弁 (椎本)に繋がらなくてはならないのだが…かなりおかしな状態になっている。

image

※2の直下にある大将は親なしのはずなのに頭部垂線が入っている。左中弁 (椎本)に入る親子連結線はこの余分な垂線から伸びている。もし、これが今回の修正で起きているのでないとすれば、見落とされていたバグということになるのだが…この図面で※2でソートするとMPLCレッドラインを踏むことになるが、避けられないのだろうか?

このデバッグは後回しにして、一応動作しているのでリリース版を起こしてインストールして動作確認することにする。2018年12月27日にライセンスを発行し、Version 2.0.2.260としている。このときは「Windows10でビルド32ビット版」だったが、これは VS 2005でビルドしたものと思われる。このあと、VS 2005 ないし VS 2010 でビルドする必要はなくなると思われるが、VS 2017 でビルドしたバージョンは2.1.0から始めることにする。

公開時には思い切って3.0としてもよいのではないか?リリース版では上記のエラーがまた蒸し返されている。プロジェクト単位でビルドしてみよう。DLLでは_countが未定義になった。なぜだろう?この変数はデバッグモード時にのみ定義されている。GCでは2つ警告が出る。

1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2729,5): warning MSB3284: タイプ ライブラリ “f10efde4-db94-11d2-b863-289605c10026” バージョン 1.0 のファイル パスを取得できません。ライブラリは登録されていません。 (HRESULT からの例外:0x8002801D (TYPE_E_LIBNOTREGISTERED))
1>LINK : /LTCG が指定されましたが、コードの生成は必要ありません。リンク コマンド ラインから /LTCG を削除し、リンカーの性能を改善してください。

後者のエラーは構成→リンカー→最適化→リンク時のコード生成を空欄にすることで解消した。「ライブラリが登録されていない」というのはDLLのことだろうか?これは登録しないことにしているのだが… この警告はデバッグモードでも出ている。実害はなさそうなので、無視しておくことにしよう。OCXでは「switcheds are contradictory –no_robust vs. -target」が出る。上記と同様、構成→MIDL→詳細設定→パラメータの確認を「はい(/robust)」に切り替えて解消した。

リンカーがまた、「オプション VERSION…に構文エラーがあります」を出している。また、

警告    C4793    COleControl::`vcall'{544}”: ネイティブ関数としてコンパイルされました:    ZelkovaZ3    D:\ZELKOVA_2020\ZELKOVA\ZelkovaZ\ZelkovaCtrl.cpp    1

という警告も出ているが、「警告を無視する」設定の前にもう一つ別の警告があるので見ておく必要がある。

警告    MSB8012    TargetPath(D:\ZELKOVA_2020\ZELKOVA\Release\ZelkovaZ3.dll) が Linker の OutputFile プロパティ値 (D:\ZELKOVA_2020\ZELKOVA\Release\ZelkovaZ3.ocx) と一致しません。このため、プロジェクトが正常にビルドされない可能性があります。この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Link.OutputFile) で指定されている値と一致することを確認してください。    ZelkovaZ3    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets    1216
警告    MSB8012    TargetExt(.dll) が Linker の OutputFile プロパティ値 (.ocx) と一致しません。このため、プロジェクトが正常にビルドされない可能性があります。この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Link.OutputFile) で指定されている値と一致することを確認してください。    ZelkovaZ3    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets    1217

いや、この警告もデバッグモードで出ていた。構成プロパティ→全般→全般→ターゲットの拡張子を.ocxに変えて解決した。これで実行できるようになった。Version 2.1.0.001  Release 2019-01-07 となった。これを Windows 7 にインストールして動作を確認してみよう。製品名はZelkova Tree 2019とした。

インストールしてみたが、エラーが出ている。ZelkovaZ3.ocxの登録に失敗している。カスペルスキーがブロックしている可能性がある。いや、「アプリケーションが弱い制限付きグループに追加されました」とあるのでパスしているのではないか?アンインストールしてからインストールし直してみる。やはり同じエラーになる。

リソースのVS_VERSION_INFOでFILEVERSIONとPRODUCTVERSIONを更新しても元に戻ってしまう。なぜだろう?FileVersionとProductVersionは更新できる。いや、今度は戻らなくなった。プログラムのインストール位置をbabalabo\Zelkova Tree 2018と決定しているのはどこだろう?⇒Launch Conditions→ApplicationFolderのプロパティで決めている。

DefaultLocation = [ProgramFilesFolder][Manufacturer]\[ProductName]
[Manufacturer] = babalabo
[ProductName] = Zelkova Tree 2019

インストール時にエラーが発生したが、無視して強行してインストール完了にはなった。起動すると.NET Frameworkのエラーが発生したが、より新しいバージョンの.NETでエラーが発生しているためVisual Studioではデバッグできないというメッセージが出た。.NETは4.5を使うようになっている。lenovoには.NET 4が入っている。手動でregsvr32を実行してもエラーになる。

読み込みに失敗

これはもしかすると、デバッグモードのOCXを参照している可能性があるので、作り直してみることにする。あるいは、Windows 10にインストールしてみてもよいが…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA