FC2ブログ


VS2017-はじめの1/10歩(7):そろそろVS6→VS2017

   プログラミング [2019/03/03]
使い慣れてないVS2017は何かとストレスになるので、
VS6である程度つくってVS2017に持ってく話なのですが、「持ってく」ところに話が辿りついてませんね。


例えば、VS6で”Hello World!”ってメインウィンドウに出すウィンドウプログラムを作ったとします。
(・・・手順は説明しませんよ。余りにも基本的なんで。)

VS6作成のプロジェクトをフォルダ毎コピーして、「元の名前vs2017」と名前を付けたとします。
フォルダ内の.dswファイルをVS2017で「開き」ます。
 →何か変換するから「元には戻せないよ」的なメッセージが表示されます。OKを応答します。
VS2017だと(さる的には違和感のある)右側にクラス/リソース/ソースファイルリスト的なものが表示されます。
 いきなりビルドします。メニューの[ビルド]-[(Xxxxプロジェクト)のビルド]ですね。注)
HelloWorldならたぶん何事もなくビルドが通るハズ。
→動かせます。

これだけです。ここしばらく書いていたメインテーマ「VS2017-はじめの1/10歩」は終了ー
ってなっちゃいますね。

注)VS2017のビルド対象・・・は、x86です。
(64bit環境しかインストールしてないとできないと思う。
 ・・・とはいうものの32/64bit環境のインストールで選べるんだっけ?)


でもね、それでもVS2017で、あれこれ付けたしでプログラムに機能追加して行こうと思うと、
使い方わかんないから大変なのよ。
アイコン1個追加しようと思うだけで、調べまくらないとできない!
(一回、調べて納得したけど忘れた。何か追加インストールしないといけなかったような・・・
先にpython環境として使い始めて、必要コンポーネント?(numpy、cmake、openCV、dlib、・・・・)のインストールとかで触りまくったのであまりよく覚えてない。

ならば、ということで

①VS6で編集/デバッグして、②VS2017でリビルドして、
③うまくいかない部分を直す

をやってます。
VS2017使い方の解説を期待して読み始めた方には申し訳ないですが、そっちは他のサイトをご覧ください。

さあ、またまた前置きが長いですが、
今回は、標準関数とかの話にします。




なんと、時代は流れて、C言語の基本的関数ですらVS2017ではワーニングがでちゃうんですね。
例えば、strcpyとかは、strcpy_sじゃないとダメとか。

かといって、strcpy_sに変更して、今度VS6でコンパイルすると、「そんな関数ねーよ」エラーになる。
使いまくってる場合は、もうワーニング出まくりです。

VS6とVS2017環境でソースコードを行ったり来たりさせるので、以下のようなマクロ定義で対応しました。
(使ってたものだけなので、全体網羅はしてませんよ。)

//--------------------------------------------------
//開発環境の移行関連:2017でwarning→2017用に修正→マクロ化でVS6対応
//******VS6向け
#if _MSC_VER < 1300
//**strxxxx→strxxxx_s
#define strcat_s(b,l,a) strcat(b, a)
#define strcpy_s(b,l,a) strcpy(b, a)
#define strncpy_s(b,l,a,m) strncpy(b,a,m)
#define _strlwr_s(b,l) strlwr(b)
//**_snprintf→_snprintf_s:但しformat中の可変部は1個固定
#define _snprintf_s(pb, sz, t, fmt, tx) _snprintf(pb, sz, fmt, tx)
#define roundf(a) (a+0.55555)
//**inline関数用共通
#ifndef errno_t
#define errno_t DWORD
#endif
//**fopen→fopen_s
inline errno_t fopen_s(FILE **pfp, PTCHAR buf, PTCHAR ac)
{*pfp = fopen(buf, ac); return ((*pfp)?0:GetLastError());};
//**localtime→localtime_s
//localtime:struct tm *pst_tm→localtime_s:struct tm st_tmが必要
#include
inline errno_t localtime_s(struct tm *ptm, time_t *psytm)
{struct tm *pgtm; pgtm=localtime(psytm); *ptm=*pgtm; return GetLastError();};
//******VS2017向け
#else
#include <math.h>
#endif
//--------------------------------------------------


ちょっと数が多いし、やり方が統一されてなくて申し訳ないです。
上記をヘッダに突っ込んどけば、2017用に作った後でVS6に.hをもってけば、
.cppは2017向けのままでコンパイルを通すことができるかと思います。

大きくは、以下2種類を定義しています。
1)#defineマクロで一部のパラメタ(バッファ長指定)を省略して、元の_sなし関数にリダイレクト
2)inline関数化して処理内容をエミュレーション
まあ、一部制限付きですが、これで_s関数がVS6でもコンパイルを通すことができました。

不思議なんですが、wsprintfを多用しているのですが、wsprintf_sとかってないんですかね。
VS2017でもワーニングにならないね。

あと、トピックスとして、
a)ビルドの際に、「/ZIと/Gy-は併用できませんよ。」とか出ますよね。
 自分で明確に指定したつもりもないので、/ZI指定をVS2017側の設定から探して、消してます。

b)VS6でヘルプ表示機能を有効にしようと思って、
#include <htmlhelp.h>
#pragma comment(lib, "htmlhelp.lib")

とかヘッダに入れてたら、sphelper.h/sysinfoapi.hでGetVersionExAが古いとか出てきました。
MSからダウンロードしてきたものそのままなのに・・・
上記は、今のところ放置してます。

c)いずれ、ここでも紹介するかと思うのですが、
ブラウザをダイアログ上で表示して、その操作イベントを取得しようとして、
#import <shdocvw.dll>
を追加したら、VS2017ではワーニングが出ました。
#pragma warning(disable:4192)	//ワーニング対策
#import <shdocvw.dll>
#pragma warning(default:4192)

として逃げてます。ワーニングを出さないようにしているだけだそうです。

まあ、VS6でコーディング/テストをやりながら、VS2017でビルドして問題ないか試して、
どっちでも行けるように作るっていうことなんですが、
それ必要?って感じですよね。

こんなことやってる間にVS2017環境に慣れてくるかと、思ってはいるのですが、
まずは、作りたいものをさっさと作るを優先した結果、こんなハメになっているって話です。

次回以降は、タブレット用っぽい見栄えとか、操作性の作り込みの話に行きたいと思ってます。

では、この辺で。m(__)m



■追伸:
VS6からVS2017への移行に失敗?することがありました。

▼エラー:「CrypytSample.sln: バックアップ ファイル ・・・・\CrypytSample_vs2017\Backup\CrypytSample.sln の作成中にエラーが発生しました」
▼ワーニング:「CrypytSample.sln: このプロジェクトを Visual Studio 2010 SP1 より新しいリリース バージョンの Visual Studio で開けるように、プロジェクトの動作には影響しない非機能的な変更をプロジェクトに加える必要があります。」

???
構わずDebugビルドすると以下のエラーでビルドは行われない。
▼「error MSB8036: Windows SDK バージョン 8.1 が見つかりませんでした。必要なバージョンの Windows SDK をインストールするか、プロジェクト プロパティ ページで SDK バージョンを変更するか、ソリューションを右クリックして [ソリューションの再ターゲット] を選択してください。」

???ちょっと何言ってのかわかんない。一旦VS2017を終了させます。
問題なくVS2017に移行できた環境の.dspファイルとエラーになってしまった.dspファイルを比較すると

以下の定義の"/D ..."が、うまく移行:"_DEBUG"で、移行エラー:"NDEBUG"になってました。
# ADD BASE CPP ・・・
# ADD CPP ・・・
# ADD BASE RSC ・・・
# ADD RSC ・・・
取り合えず、全部"_DEBUG"に変更しました。

移行時に新たに作成された、.vcxprojファイルも比較すると、中身はXML形式で、
<PropertyGroup Label="Globals">配下の<ProjectGuid>タグの下に、<WindowsTargetPlatformVersion>指定がありませんでした。
なので、うまく移行した方の記述から、<ProjectGuid>タグの下に以下をコピペして保存。
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>

今度は、移行作業で作成された.slnファイルをダブルクリックして、VS2017を起動します。
注)間違って、.dswを再度ダブルクリックすると、VS2017への移行動作が再度行われるようです。

プロジェクトのビルドを実行すると。
▼「cl : コマンド ライン error D8016: コマンド ライン オプション '/ZI' と '/Gy-' は同時に指定できません」
が出ます。

[プロジェクト]ー「プロパティ」メニューをクリックするとダイアログが表示されます。
右側の「構成プロパティ」リストから、「C/C++」-「全般」を選択します。
左側に表示されるプロパティの中の「デバッグ情報の形式」がたぶん「<別のオプション>」になっています。
そこのプルダウンメニューから、「・・・(/ZI)」となっているもの以外(さるは、/Zi)を選択して[適用]ボタンをクリックします。
ダイアログを閉じて、再ビルドすると、ビルドは成功しました。

では。m(__)m
スポンサーサイト





コメントの投稿

非公開コメント

カレンダー
10 | 2019/11 | 12
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール

さるもすなる

Author:さるもすなる
さるです。別HPサイト「さるもすなる」から侵食してきました。 山菜/きのこ、それとタイトルにしたPPバンド籠のことをメインに徒然に・・・・暇を持て余したさるの手仕事:男手芸のブログってことで。

最新記事
最新コメント
月別アーカイブ
カテゴリ
天気予報

-天気予報コム- -FC2-








本家のHPのトップ
山菜や茸の話です
PPバンドの籠作品と作り方です
投稿をお待ちしております



ブログランキング・にほんブログ村へ にほんブログ村 ハンドメイドブログへ



マニュアルのお申し込み



検索フォーム
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR