VC++6 を VS2019 にコンバート時のポイント

VC++6 のアプリは、インストーラレスで動作させることができるため、今日でも需要があります。しかしIDEの機能が低いため、開発効率は低いです。そこで弊方では、一度Visual Studio 2019 にコンバートして開発し、最後にVC++6で検証してリリースしています。その時のポイントの覚書です。

Visual Studio 2019 の設定

VC++6の頃は.NETはまだなく、標準ライブラリは MFC でした。Visual Studio 2022となった現在でもサポートされています。2000年当時、現在も名だたる数々のアプリが作成されました。オプション機能になっいるので、以下のようにオプション追加します。尚、無償版ではサポートされていません。


Projectのコンバート

vc++6 のproject file : .dsp.dsw を、Visual Studio 2019 で開きます。後は、質問に答えていけば完了です。.sln .vcxproj が生成されます。


コードの修正

C++ のコンパイラ仕様がやや特殊であったため、(汚いコードを書いていると)修正が必要になります。

【違い1】 VC++6では関数/method内で宣言した変数は、その後スコープを跨いで使用可能となっている。

具体的には、

void founcA( )
{
    for( int i = 0; i < 10; i ++ ) {
         .....
    } 
    for(  i = 0; i < 20; i ++ ) {  /* VC++6ではOK、VS2019とC++一般ではNG */
         .....
    } 
}

【違い2】 VC++6ではcastしなくても、引数の型に合わせてくれる。

具体的には、

void funcA( int x, int y )
{
   ....
}

void funcB( )
    LONG y1;
    ...
    funcA( 100, y1 );  /* VC++6ではOK、VS2019とC++一般ではNG */

数値だけでなく、char[]CString 間でも暗黙castされているので要注意です。数値を表示用に文字として扱う場合も同様です。

【違い3】 VC++6では関数/method型を宣言しないと、intとして扱われる。

具体的には、

virtual CString methodA();
virtual methodB();    /* VC++6ではint扱いでOK、VS2019とC++一般ではNG */

また strcpy系の関数にて以下の警告がでますが、領域外の上限をコード内で実装していれば問題ないので許容します。


Build設定の変更

Debug ビルドで以下のエラーが出る場合があります。

“/Gy-” は “Gy”オプション無し の意です。 以下のように有効にします。オプションの意味合い上、実害はないでしょう。


以上これでコンバートでlinkageまでとおります。これで.NETのC++並みのデバッグ機能が使用できるようになります。最近のVisual Studioのプラグインも使用できます。

ただし生成されたexeを他PCで実行する場合は、各Visual Studio バージョンに対応した VC++再配布可能ライブラリ が必要です。mfc42.dll では動きません。

最後に一言、.NETアプリでないと「セキュリティが!!」と怒り狂う方や、.NETコンバートを強く勧めるベンダーさんももいらっしゃいますが、MFCはまだ使えるしセキュリティも配慮されています。一度作ったコードは大事に継承し続けたいですね。ただ VC++ 6の入手/環境作りがネックです。

VC++ 6のコードを最新に移植したいが手がたりない、自身がない、担当者がいなくなったなどお困りの方は、こちらよりご相談ください。


ターゲットがVC++6で、VC2019でクロス開発するとき、VC++6で正式Buildするときの注意です。

  • bool と BOOL の違いがチェックされ、合わない場合、警告になります。TRUE/true、FALSE/false も同じ。
  • MFCでWin32APIを使うとき、MFCのライブラリを参照しないよう 「::API名」と記述しますが、効かない場合あり。
  • Win32APIを使うとき、対応する .h を 明示的 include しないとエラーになる。 VC2019ではいい塩梅にひっぱってきてくれる模様。(もしくは .h の構造がちがう)
  • Win32APIを使うとき、対応する .lib を 明示的 にリンク指定しないとエラーになる。 VC2019ではいい塩梅にひっぱってきてくれる模様。

SwiftでGPS初期化完了を待つ

SwiftでGPSが位置を取得するコードはたくさんありますが、どのくらいで初期化かせ完了するかまでは他皆様の記事にはあまり書いていなかったので、記事としてのこしておきました。

通常は、CLLocationManager の初回イベントが発生するまで待てばいいのですが、アプリ起動時の位置をなるはやで知りたい場合があります。初回イベントが発生するまで待たせると「反応しない」とコンプレインにつながる場合もあります。

CLLocationManager に初期化完了のイベントは見当たらず。(調べきれていないかも…) 具体的なGPS初期化時間は公称されていないし、端末や処理負荷によって変わってしまうかもしれません。そこで以下のようなコードにしてみました。

	public var	NowLatitude  = 0.0
	public var	NowLongitude = 0.0	
	private var myLocMgr: CLLocationManager	
		
		var  i:Int = 0
		while( i < 30 /* 約1.5分  */ ) {
				
			if let startLoc = myLocMgr.location {
				// 自クラス用にコピー
				NowLatitude  = startLoc.coordinate.latitude
				NowLongitude = startLoc.coordinate.longitude
				break
			}
			
			Thread.sleep(forTimeInterval:3)
			i += 1
		}

とれるまでぐるぐる回すしかない。iPad 6thでは大体このくらいで収まっていました。初期GPS位置が取れなかった場合のリスクに応じて、whileの回数を調整するばよいかなと思います。

Drawioの勧め

visio を使わなく、見かけることもなくなって久しいですが、、、(まだ存在するようですが) UMLやフローチャートを書きたい場面はしばしばです。最近は、Drawio というフリーソフトがあるようです。コードはjavaのようです。

売り物のUMLツールほど、強力、厳格ではないのですが、ダイアグラムが書けて、操作も直感的で使いやすいです。きちんと日本語化もされています。以下シーケンス図の例です。

「UMLからコード生成したい」というわけでもなければ十二分です。売り物のUMLツールより記述に自由度があります。描画も割と軽い。フローチャートの例です。

クラス図は、

エクスポートもSVGがサポートされていています。

SVGから、inkscape で編集したり、eps に変換してWordに読ませWord図形にしたり応用も広がります。

その他図のもりだくさん。

ExeclはA3までですが、こちらはページサイズをA0サイズまで拡大できる。(試してませんが図面プロッターにも出せる!!) いくらでかい図を描いてもOK。

気づき点、テクニックを以下に列挙します。

  • PDFへのエクスポートは崩れるので、PDFプリンタに印刷したほうがよい。
  • スナップ( 線を図形に自動的繋ぐ機能 ) がOFFできない。
  • 図形のグリッド位置への補正ががOFFできない。
  • ( 以降、随時更新中 )

nRF52840の開発環境を作成する’24.10月編

二年前、Nordic Semiconductor社のBluetoothマイコン: nRF52832 のプログラムを作成しました。国内メーカのBluetoothマイコンより安価で多機能、豊富なライブラリ、処理スペックも上で弊方の中では高評価でした。(ただし情報が全て英語にはなってしまいますが、、、) 今回新しい企画でBluetooth通信を行うため、上位マイコンnRF52840 を選定しました。こちら Long Range に対応しており離れた車両と通信接続時間の長さ期待できます。 2年前とは手順も増えて複雑、違いも大きかったのでその覚え書きです。基板は nRF52840 DK を使います。


2年前は、汎用の組込み用IDE: SEGGER (セッジャーと呼びます、セッガーかもしれません) のNordic Version 5.60 が使えていました。現在Version 5.68としてここで配布はされていますが、以下のようには、エラーが出たり、ライセンス発行画面が真っ白です。

WEB上の一般記事に、VS Code + Nordic Extension のみになったと記載がありました。


環境セットアップには python が必要です。指定されたエディションを使う必要があるようです。少なくとも Microsoft Store で配布しているものは以下エラーが出ました。


DevZone : ユーザ登録システム、登録しましたが、ログインしてなくてもインストールは可能でした。

Zephyr : 標準ライブラリ?


基本は以下のとおりですが、公式手順を見ると、どこまでが自動でどこが手動か分かりにくいです。弊方では一部エラーが出ていたため手入力でも一通り実施しました。

1. J-Link (PCとマイコンと接続するためのインターフェイス ) は nRF Connet SDK でインストールされるため事前インストールは不要。

2.VS Code のインストール。最新でOK。

3. nRF Connet Desktop をインストール。

4. nRF Connet Desktop からnRF Connet SDK をインストール。この時、VS Code の未インストールだと進めません。v2.7.0は以下のエラーが発生、v2.6.2をインストール。なお2年前とくらべ SEGGER のインストールメニューは消えています。

5. nRF Connet Desktop からnRF Command LineTool をインストールを促され、ダウンロードベージに飛ぶので、D/Lしてインストールします。後から入れてもOK。

6. chocolatey というWindow用のパッケージマネージャをインストールします。まずnuget.exe (Visual Studio用機能追加の仕組みのコマンドライン版)をダウンロードし、以下のコマンドをたたきます。

7. chocolatey を用いて、python など必要パッケージをインストールします。何なのかは理解していません。

phtyon は、nRF Connet SDK で自動で以下にインストールされている模様。今回は公式手順どおりに、chocolatey で入れたものを使用しました。

8.python の pip3 を用いて、指定されたパッケージをインストール。以下コマンドラインシーケンスです。

9.ARM 用gccをダウンロードして、指定場所に配置。弊方は配置自由度のあるzip版を選択。

10.Windows上で、gccのパスを通す。

11.VS Code に Nordic 用Extensionを追加します。nRF Connect For VS Code Extension Pack でまとめられています。それを開いて追加します。

以上、たいへんな長旅でした。


1.VS Code に左ペインの nRF Connet アイコンを選択し、現れるツリーからProjectを作成します。

2.以下のようにProject名を入力。

3.APPLICATIONのツリーから、Build構成以下のように生成します。

4.生成されたProject全体の様子は以下のとおりでした。2年前 nRF52832 で SEGGER で作成したコードを流用しようと考えていましが、ライブラリの構成が全くちがうように見えます


今回はプロトで過去のHowToを流用して手早く準備したい。ゆくゆくは製品化時に最新化することとし、既存のSEGGERにて nRF52832 の.Project file を、nRF52840 の.Project file に手動マージし対処しました。

SAMPLEコードのnRF52840 のセットをマージします。

SEGGERでビルドして、nRF52840 DK基板のスイッチを以下のように変更し、USB接続し、J-Linkが現れるのを確認します。

SEGGERで以下のように J-Link と接続します。

以下のようにデバックを開始します。ターゲット基板への手動ダウンロードは必要ありません。(行った方がなにかおかしな状態になる)

今回はBuletoothマスター側なので、Android端末でペアリング検索してみます。うまくいきました。

SEGGERで以下のメッセージがでましたが、取り急ぎそのまま続行して問題なかったです。

以上です。Nordicマイコンの使い方でお困りの方、急いで動かしたい方は、ぜひこちらよりご相談ください。

WinCvsのpserver設定

現在WinCvsの設定情報中々ないので、その設定覚書です。

Windowsのコンピュータ名とアカウント名を設定します。リポジトリエリアス名は次のように設定します。

コントロールパネルから、CVS For NT を選びます。CVSNT画面から「設定変更」ボタンを押したあと、リポジトリタブを開きます。そこでWindowsパス名に対するエリアス名を設定します。

コントロールパネルから、CVS For NT を選びます。サービスの状態タブを開き、開始ボタンを押します。CVSサービス CVSロックサービス の2つがあります。 ロック の方は開始できないときがあるようですが気にしない。

開始状態は、Windowsサービス画面でも確認できます。

リポジトリがローカルであってもログインしないアクセスできません。WinCvsのメニュー 管理 -> ログインを選びます。ログイン画面からOKボタンをおし、パスワード画面を出します。ここでWindowsアカウントのパスワードを入力します。CVSは、UNIX系の産物なので別設定するのかと深読みをしないこと。

成功すると何もメッセージがでません。エラー時のみメッセージがでます。