ホーム » VC (ページ 10)

VC」カテゴリーアーカイブ

2025年7月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 117,967 アクセス




コンマ演算子

古いデバッグ用のコードを見ていたら,こんなのがあった.
 while (_ftprintf(stderr,_T(“%s=”),_T(“入力してください”)) ,
  _fgetts(buf,sizeof(buf),stdin) != NULL) { … }


最近あまりこの様なコードを書くことがなく忘れていた.
 while の条件式の括弧の中に複数の文.コンマで区切られている.
 for ではインクリメントなどの変化式で使う.


MSDN コンマ演算子: ,
 次の様にすると,i には c が代入されるらしい.
   i = ( b , c ) ;
 括弧がないと b .
   i = b , c ;


MSDN コンマ演算子 (,) (JavaScript)
JavaScript でも同じ様な動作なら,今やっている所で使えそう.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 14 でビルドが止まる?

複数プロジェクトが存在するソリューションをビルドしていて,
 ビルドを「キャンセル」したら抜けれなくなった.
「タスクマネージャ」で「終了」してもう一度開き直しても,
 止まった様になってしまう.
再度終了して,今度は suo や sdf なども削除したが,
 sdf を生成する所の途中で止まる?


PC を再起動することにより,通常の動作となった.
Windows Update を保留にしていた影響?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

C2059 , C2238

あるプロジェクト VC 6 をビルドしていてエラー.VC 12 などでは OK .


——————–構成: BLCombi – Win32 Debug——————–
コンパイル中…
ComUse02.cpp
c:\program files\…\vc98\include\oaidl.h(446) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(446) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(452) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(452) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(519) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(519) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(526) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(526) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(912) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(1294) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(3258) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(3615) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(4487) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(4717) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(4810) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(5013) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(5082) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(5162) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6733) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6742) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6802) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6811) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oleauto.h(61) : warning C4091: 空白の宣言が見つかりました。
c:\program files\…\vc98\include\oleauto.h(61) : error C2143: 構文エラー : ‘;’ が ‘constant’ の前に必要です。
c:\program files\…\vc98\include\oleauto.h(61) : fatal error C1004: 予期せぬ EOF が検出されました。
cl.exe の実行エラー
ComUse02.obj – エラー 24、警告 1


ここで使用している Calc.cxx が原因.
#include <ShlObj.h> を先頭に追加して OK .

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

WinXP で VC 14 _stat

WinXP では,_stat がうまく機能しないみたい.
Visual C++ 2015 express: _stat not working on Windows XP
VC 12 などと比べると _stat 関係は大幅に変更されている?


Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3 をインストールして
 「共有 DLL で MFC を使う」とした exe は正しく動作することを確認.

i3DV.2016.07.01.zip

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 14 exe を XP でデバッグ

昨日リモートデバッグの環境を作っていったが,VC 14 では XP 上のリモートデバッグができない?
VC 11 以降 XP などについて具体的には書かれてない


今回リモートデバッグしようと思ったのは,VC 14 でビルドした exe が XP で実行できないことにあった.
Win 7 などでは問題ない.また,VC 12 などでビルドした exe なら大丈夫.
現象は,exe の起動はできるが 3D モデルを開く時,エラーメッセージも出ずに終了してしまう.


デバッグ版のプロジェクトで以下を設定.
  スタティック ライブラリで MFC を使用する
  Visual Studio 2015 – Windows XP (v140_xp)
ビルドして,リリース版と同様の現象になることを確認.


XP 環境には VC 8 が入っているので,
 デバッグ版 exe をエクスプローラなどから起動し,「ツール」-「プロセスにアタッチ」.
_tstati64 の呼び出しで,errno が 22(EINVAL 引数が無効です)となってしまう.


exe が終了してしまったのは,ファイルサイズが正しく取れなかったための無限ループ.

    bool    v_c_Save    (LPCTSTR pathName,const std::vector text)
    {
        FILE*	ofp = ::Open_File(pathName,_T("wb")) ;
        if (ofp == NULL) {
            return    false ;
            }
        if (text.size() > 0) {
            ::fwrite(&text[0],sizeof(char),text.size(),ofp) ;
            }
        ::fclose(ofp) ;
        if (text.size() > 0) {
            u_64    fSize =F_Stat::GetSize(pathName) ;
            if (fSize == 0) {
                return	v_c_Save(pathName,text) ;
                }
            }
        return  true ;
        }

無限ループにならない様に,ループカウンタを追加.
exe が抜ける現象は解消されて 3D モデルが表示できる様にはなったが,stat の部分の対応はこれから.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

リモートデバッグ

以前仮想マシンの XP にリモート環境を作って,その当時はそれなりに使ったと思う.


どうも起動が不安定だったが,複数のアダプターが影響していた?


リモート PC は,TestInst . 
ローカルは DevXP と T54W7U64 .


VC 6
プロジェクトの設定で,スタティックにするなどして,対象 exe 以外の dll などがなくても動作する様にしている.

リモート側で \\DevXP\….\Debug.060\i3DV.exe を実行できる様にする.
ローカル側でも同様の指定で実行可能な設定にしている.

VC 6 の設定で,メニューの「ビルド」-「デバッガリモート接続」でリモート PC を設定.

デバッグモニタの設定は,


VC 8
プロジェクトの設定は,場所が違うだけで内容は VC 6 と同じようなもの.

リモート側では exe はこの様に見える.

デバッグモニタの設定は,

デバッガで実行すると,i3DV.exe が起動する.


VC 10
リモートデバッガのインストールから.DVD 内の rdbgsetup_x86.exe を実行してインストール.

他は,VC 8 などと同様.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

_MBCS _tcspbrk

MBCS.exe で _tcspbrk を使用していて,ファイルパスの 0x5c の認識がうまくなかった.


_tcs… の関数を MBCS exe としてデバッガで見てみると
30: LPTSTR result1 = _tcschr (_T(“Test”),_T(‘s’)) ;
0040238A push 73h
0040238C push offset string “Test” (0048b0b0)
00402391 call @ILT+985(__tcschr) (004013de)
00402396 add esp,8
00402399 mov dword ptr [ebp-10h],eax
31: LPTSTR result2 = _tcsstr (_T(“Test”),_T(“sp”)) ;
0040239C push offset string “sp” (0048b0ac)
004023A1 push offset string “Test” (0048b0b0)
004023A6 call strstr (0042d170)
004023AB add esp,8
004023AE mov dword ptr [ebp-14h],eax
32: LPTSTR result3 = _tcspbrk(_T(“Test”),_T(“sp”)) ;
004023B1 push offset string “sp” (0048b0ac)
004023B6 push offset string “Test” (0048b0b0)
004023BB call strpbrk (0042d130)
004023C0 add esp,8
004023C3 mov dword ptr [ebp-18h],eax
33: size_t result4 = _tcsspn (_T(“Test”),_T(“sp”)) ;
004023C6 push offset string “sp” (0048b0ac)
004023CB push offset string “Test” (0048b0b0)
004023D0 call @ILT+1260(__tcsspn) (004014f1)
004023D5 add esp,8
004023D8 mov dword ptr [ebp-1Ch],eax


Afx.h をインクルードすると?
576: int CString::FindOneOf(LPCTSTR lpszCharSet) const

579: LPTSTR lpsz = _tcspbrk(m_pchData, lpszCharSet);
5F42E312 mov edx,dword ptr [lpszCharSet]
5F42E315 push edx
5F42E316 mov eax,dword ptr [this]
5F42E319 mov ecx,dword ptr [eax]
5F42E31B push ecx
5F42E31C call _tcspbrk (5f4012b0)
5F42E321 add esp,8
5F42E324 mov dword ptr [lpsz],eax
 
35: LPTSTR result1 = _tcschr (_T(“Test”),_T(‘s’)) ;
00401D14 push 73h
00401D16 push offset string “Test” (004230b0)
00401D1B call @ILT+485(__tcschr) (004011ea)
00401D20 add esp,8
00401D23 mov dword ptr [ebp-14h],eax
36: LPTSTR result2 = _tcsstr (_T(“Test”),_T(“sp”)) ;
00401D26 mov esi,esp
00401D28 push offset string “sp” (004230ac)
00401D2D push offset string “Test” (004230b0)
00401D32 call dword ptr [__imp__strstr (00426668)]
00401D38 add esp,8
00401D3B cmp esi,esp
00401D3D call _chkesp (0040e246)
00401D42 mov dword ptr [ebp-18h],eax
37: LPTSTR result3 = _tcspbrk(_T(“Test”),_T(“sp”)) ;
00401D45 mov esi,esp
00401D47 push offset string “sp” (004230ac)
00401D4C push offset string “Test” (004230b0)
00401D51 call dword ptr [__imp__strpbrk (0042666c)]
00401D57 add esp,8
00401D5A cmp esi,esp
00401D5C call _chkesp (0040e246)
00401D61 mov dword ptr [ebp-1Ch],eax
38: size_t result4 = _tcsspn (_T(“Test”),_T(“sp”)) ;
00401D64 push offset string “sp” (004230ac)
00401D69 push offset string “Test” (004230b0)
00401D6E call @ILT+655(__tcsspn) (00401294)
00401D73 add esp,8
00401D76 mov dword ptr [ebp-20h],eax
 

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 11 以降の ODMenu

自前の UndoRedo テンプレートで,VC 11 以降メニューの表示が更新されなくなった.
対応は,アプリケーションクラスのヘッダで,ODMRoot.hxx のインクルードを追加すれば良い.


これとは別の動的なメニューも正しく表示できてないが,こちらはまだ原因を特定できてない.
CCmdUI::SetText

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

コンストラクタで static

次の様なクラスで,VC 14 ではコンストラクタ内の static を呼出した段階で止まってしまう?
VC 12 まででは OK .


  class T_static {
  public:
    T_static () ;
    } ;
  T_static::T_static ()
  {
    {
      static T_static root ;
      }
    std::tout << _T("T_static") << std::endl ;
    }


コンストラクタの初期化動作を次の様に変更.
  T_static::T_static ()
  {
    static bool Initialized = false ;
    if (!Initialized) {
      Initialized = true ;
      static T_static root ;
      }
    std::tout << _T("T_static") << std::endl ;
    }

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 6 コンソール AP を VC 11 で…

VC 6 コンソール AP を順にアップしたプロジェクトを VC 11 でビルドすると,
—— すべてのリビルド開始: プロジェクト: T_DbgCls, 構成: Debug Win32 ——
T_DbgCls.cpp
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\sal_supp.h(57):
  warning C4005: ‘__useHeader’ : マクロが再定義されました。
  c:\program files (x86)\microsoft visual studio 11.0\vc\include\sal.h(2872) :
    ’__useHeader’ の前の定義を確認してください
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77):
  warning C4005: ‘__on_failure’ : マクロが再定義されました。
  c:\program files (x86)\microsoft visual studio 11.0\vc\include\sal.h(2882) :
    ’__on_failure’ の前の定義を確認してください
c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(638):
  error C2039: ‘SetDefaultDllDirectories’ : ‘`global namespace” のメンバーではありません。
c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(638):
  error C2065: ‘SetDefaultDllDirectories’ : 定義されていない識別子です。
c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(640):
  error C2065: ‘LOAD_LIBRARY_SEARCH_SYSTEM32’ : 定義されていない識別子です。
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========


プロジェクト設定の,「プラットフォームツールセット」を「Visual Studio 2012 (v110) 」とすれば通る.


さらに,VC 12 では,
—— ビルド開始: プロジェクト:T_DbgCls, 構成:Debug Win32 ——
T_DbgCls.obj : warning LNK4075: /EDITANDCONTINUE は /OPT:LBR の指定によって無視されます。
LINK : fatal error LNK1104: ファイル ‘mfc120d.lib’ を開くことができません。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 6 Release inline

次の様な呼出しで,Release ビルドでうまく動作しないことがあった.
…\PntFnc\TCrossL\TCrossLD.cpp 2 円の交点のエラー時の動作
  Vd2 cp1 = ::get_point_on_line (l1c,l2c,l1r) ;
デバッグ版では意図した動作となる.
inline Vd2 get_point_on_line ( const Vd2& ls, const Vd2& le, const double d )
{
   if (ls == le) { return ls ; }
   Vd2 unit = (le-ls).Normalized() ;
   Vd2 pos = ls + unit * d ;
   return pos ;
   }
ls と le を比較している部分で抜けてしまっている?
VC 7 では OK.


よくわからないので,間接的に呼出す様に変更.
inline Vd2 get_point_on_line(const Vd2& ls,const Vd2& le,const double d) { return get_point_on_line_(ls,le,d); }

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC2015

MSDN にあった C++ を使った “hello world” アプリの作成 (Windows 10) をやっていて,…


実行すると,
—————————
Microsoft Visual Studio
—————————
Windows ストア アプリ ‘5a7750b3-af94-47d7-a064-b9adc49f8813_7r65t4tynye04!App’ をアクティブにできません。アクティベーション要求がエラー ‘Windows はターゲット アプリケーションと通信できませんでした。これは通常、ターゲット アプリケーションのプロセスが中断されたことを示します。詳細については、[出力] ウィンドウ ([デバッグ]->[ウィンドウ]->[出力]) の [デバッグ] ペインで確認できます’ で失敗しました。
この問題のトラブルシューティングについては、ヘルプを参照してください。
—————————
OK ヘルプ
—————————


リビルドしたら通るようになった?が,今度は
—————————
Microsoft Visual Studio
—————————
Windows ストア アプリ ‘5a7750b3-af94-47d7-a064-b9adc49f8813_7r65t4tynye04!App’ をアクティブにできません。アクティベーション要求がエラー ‘アプリは必要な時刻に開始されませんでした’ で失敗しました。
この問題のトラブルシューティングについては、ヘルプを参照してください。
—————————
OK ヘルプ
—————————


全く実行されてないわけではないので,もっと別の所に原因があるのかもしれない.


VB のプロジェクトを生成して,ビルド,実行すると
—————————
Microsoft Visual Studio
—————————
Windows ストア アプリ ‘b4f551ca-330f-478f-ab2e-c23232b2918c_7r65t4tynye04!App’ をアクティブにできません。アクティベーション要求がエラー ‘アプリは開始されませんでした’ で失敗しました。
この問題のトラブルシューティングについては、ヘルプを参照してください。
—————————
OK ヘルプ
—————————

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC include lib のパス

VC 6
  HKCU\Software\Microsoft\DevStudio\6.0\Build System\Components\Platforms\Win32 (x86)\Directories
VC 7 , 7.1 , 8 , 9
  C:\Users\Iwao\AppData\Local\Microsoft\VisualStudio\…\VCComponents.dat
VC 10 , 11 , 12
  C:\Users\Iwao\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp. … .user.props

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 10 でビルドした exe を XP で…

以前から VC10 以降でビルドした exe が Win XP 環境で起動できてなかった(ビルド環境の Win 7 では OK).


—————————
M—.exe – エントリ ポイントが見つかりません
—————————
プロシージャ エントリ ポイント K32GetProcessMemoryInfo がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。
—————————
OK
—————————

日本語化された GetProcessMemoryInfo には書かれてないが,
こちら (GetProcessMemoryInfo function) には,Win 7 以降変わっているような記述がある.


対応としては App.h(アプリケーションクラスのヘッダファイル)に以下を追加した.
  #ifndef PSAPI_VERSION
    #define PSAPI_VERSION 1
    #pragma comment (lib, “PSAPI.Lib”)
  #else
    #pragma message (“defined PSAPI_VERSION *************”)
  #endif

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

fatal error LNK1112

確か前にもどこかに書いているが…


Win 32 プロジェクトを「構成マネージャ」で x64 にコピーしてビルドすると,
 fatal error LNK1112: モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'X86' と競合しています。
対応方法は
 プロジェクトのプロパティで「リンカ」-「コマンドライン」の「追加のオプション」にある "/MACHINE:I386" を削除

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

IIS での ActiveX.exe

次の様なコードで,環境により?サーバの exe が終了されないことがある.
  dim oHV
  set oHV = Server.CreateObject(“AsHVXxx.Application”)
  Response.Write “AsHV….App ” & oHV.GetVersion & “<br>” & vbCrLf
  set oHV = Nothing
AsHVxx.exe   ~.Application のみ
  Win XP , 7 とも正しく終了する.
PAtoXx.exe
  Win XP 環境で,デバッグ版 exe は OK .
  Win 7 では正しく終了している.


2015/02/19
PAtoXx.exe の OnInitDialog で,環境設定用のダイアログが表示されて止まってしまっていた.
で,単純にメッセージボックスなどを表示しているならばすぐわかったはずだが,…
  普通の exe としての起動の場合は,ダイアログは表示されない.
  ASP のオートメーションとして起動された場合は,見えないがダイアログが表示されて止まっている.
ダイアログが表示される条件は,設定値が正しいフォルダをさしていない場合.
  c:\ProgramData\… の様にローカルをさしている場合は,どちらの起動でもダイアログが表示されないで処理を継続.
  \\T54W7U64\Documents\… の場合,当然であるが単純起動の exe では OK でダイアログは表示されない.
  これが ASP から起動されると _taccess で正しく判断できず,ダイアログが表示されて止まっている.
CFile::GetStatus でもうまく判断できない?


2015/02/24
MFC クラスウィザードからの「クラスの新規作成」で 「CCmdTarget」 「タイプ ID で作成」したものも終了されない?
利用している所は次の様な感じ.
  set oM_P_ = Server.CreateObject(“AsXxxxX.Path”)
デフォルトで作成されている ~.Application を利用することで終了できる.
  set oM_S_ = Server.CreateObject(“AsXxxxx.Application”)
この動作は,vbs でも同様に確認できる.


2015/03/05
AsXxxS.exe を修正していて Win 7 環境で,
  Server オブジェクト エラー ‘ASP 0177 : 80080005’
  Server.CreateObject に失敗しました
  /Test/Test_3rd/D_Path_1.asp, 行 7
  80080005
XP 環境では OK .
設定関連の漏れがあると思うが,それまで通っていたのでコードを変更.
  以下が新しく追加した部分
   {
     #if defined _UNICODE
       folder = ::FolderAddLastSP(folder) + _T(“WC”) ;
     #elif defined _MBCS
       folder = ::FolderAddLastSP(folder) + _T(“MB”) ;
     #endif
   // ::CreateFolder(folder) ;
     if (::FolderIsNothing(folder)) {
       if (::CreateDirectory(folder,NULL)) { folder = folder+_T(“\\”) ; }
       }
     }
  最初 CreateFolder としていた所を,CreateDirectory に変更することで対応.
この関数は,デバッグ情報をファイルに出力しているが,Win 7 環境ではファイルが生成されてない.


%Temp% (c:\Windows\Temp) 以下に AsImgCnv….\EMF などのフォルダを作成して,生成した emf を保持している.
綺麗な状態に戻そうとして,EMF フォルダを削除して実行すると,
   エラー ‘80010105’
  /Test/Test_2nd/CallAS/E/SelectPage.asp, 行 148
AsImgConv… フォルダのアクセス権を変更してしまった事が原因か?
どの様に設定すべきかわからず,AsImgCnv… フォルダをエクスプローラで削除して対応.


もう一回,うまく行っている状態で EMF フォルダを削除.
どうも設定ではなくコードが悪いみたいで,影響していそうな所を見てみると,
  CacheFile::GetFolder で ::CreateFolder を呼んでいる.
::CreateFolder を MFC を使用していない ::Folder_Create に置換えてみた.
  停止(’ASP 0177 : 80080005’)することはなくなったが,まだ何かありそう.
  EMF のフォルダが生成されない.


2015/03/10
結局,%Temp% は利用しない様に変更した.
どういう条件かわからないが,c:\Windows\Temp\DbgDump\ にはデバッグ情報が正しく出力されてなかった.
(Win XP では意図した動作だったと思う)


2015/03/30
%Temp% でなく Public\Documents\ 以下にしたが,それだけでは完全ではなさそう.
アクセス権の関係と思うが,パブリックフォルダの共有設定が必要?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VC 6 UNICODE C2664 , C2679 …

VC 6 コンソール AP で _UNICODE とした時,部分的に効いていない?様なエラー.

--------------------構成: T_RegKey - Win32 Release--------------------
コンパイル中...
T_RegKey.cpp
...\_s_func.hxx(71) : error C2664: 'wcscpy' : 1 番目の引数を 'char *' から 'unsigned short *' に変換できません。
...\_s_func.hxx(72) : error C2664: 'wcslen' : 1 番目の引数を 'const char *' から 'const unsigned short *' に...
...\StringFn.hxx(277) : error C2679: 二項演算子 '=' : 型 'unsigned short [3]' の右オペランドを扱う演算子は定義...
...\StrAryFn.hxx(118) : error C2665: 'wcspbrk' : 2 のオーバーロードは 1 番目の引数を 'char *' から要求の型に変換...
...
T_RegKey.obj - エラー 86、警告 0

先頭で #include <Afx.h> などとすればコンパイルは通る.
または,次の様に UNICODE を定義すれば良いみたい.
  #ifdef _UNICODE
    #ifndef UNICODE
    #define UNICODE
    #endif
  #endif
以前にも同じことを書いていた.


#include <Afx.h> などを追加した場合は,

--------------------構成: T_RegKey - Win32 Release--------------------
リンク中...
uafxcw.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__endthreadex" は未解決です
uafxcw.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__beginthreadex" は未解決です
c:\...\Release.060/T_RegKey.exe : fatal error LNK1120: 外部参照 2 が未解決です。
link.exe の実行エラー

T_RegKey.exe - エラー 3、警告 0

「プロジェクトの設定」-「一般」の「M..F..C..」で「共有 DLL で MFC を使用」などとする.


UNICODE の定義は,(VS12)\VC\AtlMFC\Include\AfxV_W32.h を参照して i_Define.hxx に追加した.
Windows.h より前に UNICODE が定義されてない場合は,i_Define.hxx をインクルードすれば良い.


2020/09 コンソール AP での define

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

コンテキストメニューが表示されない

あるダイアログベースの exe をテストしていて,右クリックでメニューが表示されない現象となった.
ボタンによる動作のメニューは表示される.
デバッガで追いかけると,次の様なコードの CMenu::LoadMenu が FALSE となっていた.
  void CXxxxDlg::PopupSingleSel(CPoint pt,CWnd *wnd)
  {
     CMenu menu ;
     if (!menu.LoadMenu(IDR_SINGL_SEL)) { return ; }
     CMenu* pPopup = menu.GetSubMenu(0);
     …
     }
ボタンによるメニュー表示は次のコード.
  void CXxxxDlg::OnOther()
  {
     CMenu menu ;
     if (!menu.LoadMenu(IDR_OTHER)) { return ; }
     CMenu* pPopup = menu.GetSubMenu(0);
     …
     }


メニューが表示されない原因はリソース不足.
不要なエクスプローラのウィンドウを閉じて,意図した動作となることを確認.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

double -> long

double の値を long にキャストした時,VC 8 で思った動作ではなかったので調べてみた.
テストに使用したのは次の様な単純なコード.


// T_DtoI.cpp
#include <iostream>
int main(int argc, char* argv[])
{
  double d8 = 1/7. ;
  for (int index=0 ; index<25 ; index++) {
    d8 = (d8 * 7) ;
    __int64 i8 = __int64(d8) ;
    long l4 = long(d8) ;
    printf ((“%15g\t%25I64d\t%20I64x\t%15ld\t%15x\n”),d8,i8,i8,l4,l4) ;
    }
  return 0;
  }


d8 の値を /7 と *7 としているのはあまり意味はない.


C:\Users\Iwao>\\DevXP\C_Drive\Temp\TestCPP\T_DtoI\Release.060\T_DtoI.exe
              1                         1                          1                  1               1
              7                         7                          7                  7               7
             49                        49                         31                 49              31
            343                       343                        157                343             157
           2401                      2401                        961               2401             961
          16807                     16807                       41a7              16807            41a7
         117649                    117649                      1cb91             117649           1cb91
         823543                    823543                      c90f7             823543           c90f7
    5.7648e+006                   5764801                     57f6c1            5764801          57f6c1
   4.03536e+007                  40353607                    267bf47           40353607         267bf47
   2.82475e+008                 282475249                   10d63af1          282475249        10d63af1
   1.97733e+009                1977326743                   75db9c97         1977326743        75db9c97
   1.38413e+010               13841287201                  339014821          956385313        39014821
    9.6889e+010               96889010407                 168f08f8e7        -1895237401        8f08f8e7
   6.78223e+011              678223072849                 9de93ece51         -381759919        e93ece51
   4.74756e+012             4747561509943                45160b7a437         1622647863        60b7a437
   3.32329e+013            33232930569601               1e39a5057d81        -1526366847        a5057d81
   2.32631e+014           232630513987207               d39383266e87        -2094633337        83266e87
   1.62841e+015          1628413597910449              5c908960d05b1        -1777531471        960d05b1
   1.13989e+016         11398895185373144             287f3c1a5b27d8          442181592        1a5b27d8
   7.97923e+016         79792266297612000            11b7aa4b87e16e0        -1199696160        b87e16e0
   5.58546e+017        558545864083283968            7c05a810b72a000          192061440         b72a000
   3.90982e+018       3909821048582987776           3642798750226000         1344430080        50226000
   2.73687e+019      -9223372036854775808           8000000000000000                  0               0
   1.91581e+020      -9223372036854775808           8000000000000000                  0               0
  
C:\Users\Iwao>\\DevXP\C_Drive\Temp\TestCPP\T_DtoI\Release.080\T_DtoI.exe
              1                         1                          1                  1               1
              7                         7                          7                  7               7
             49                        49                         31                 49              31
            343                       343                        157                343             157
           2401                      2401                        961               2401             961
          16807                     16807                       41a7              16807            41a7
         117649                    117649                      1cb91             117649           1cb91
         823543                    823543                      c90f7             823543           c90f7
    5.7648e+006                   5764801                     57f6c1            5764801          57f6c1
   4.03536e+007                  40353607                    267bf47           40353607         267bf47
   2.82475e+008                 282475249                   10d63af1          282475249        10d63af1
   1.97733e+009                1977326743                   75db9c97         1977326743        75db9c97
   1.38413e+010               13841287201                  339014821        -2147483648        80000000
    9.6889e+010               96889010407                 168f08f8e7        -2147483648        80000000
   6.78223e+011              678223072849                 9de93ece51        -2147483648        80000000
   4.74756e+012             4747561509943                45160b7a437        -2147483648        80000000
   3.32329e+013            33232930569601               1e39a5057d81        -2147483648        80000000
   2.32631e+014           232630513987207               d39383266e87        -2147483648        80000000
   1.62841e+015          1628413597910449              5c908960d05b1        -2147483648        80000000
   1.13989e+016         11398895185373144             287f3c1a5b27d8        -2147483648        80000000
   7.97923e+016         79792266297612000            11b7aa4b87e16e0        -2147483648        80000000
   5.58546e+017        558545864083283968            7c05a810b72a000        -2147483648        80000000
   3.90982e+018       3909821048582987776           3642798750226000        -2147483648        80000000
   2.73687e+019      -9223372036854775808           8000000000000000        -2147483648        80000000
   1.91581e+020      -9223372036854775808           8000000000000000        -2147483648        80000000

VC 7 , 7.1 は VC 6 と同等.VC 12 までは VC 8 と同等.
Mac 64 ビットでは,long が 64 ビットのため?そのままだと VC 6 と同等になる.
long を int として 32 ビットとすると VC 8 と同等.


ここまでは,long の範囲を超えたためと理解できるが,unsigned long の場合はまた動作が異なる.
    long l4 = long(d8) ;
    ULONG u4 = ULONG(d8) ;
    printf ((“%15g %25I64d %20I64x %12ld %10x %12ld %10x\n”),d8,i8,i8,l4,l4,u4,u4) ;

今回表面化したバグは,次のコード.
  long now_Tick = long(GetTickCount_s()*1000) ;
得た値を覚えておき,次のタイミングで 1 秒以上の開きがあるかを計測したかった.
最初の頃はわからなかったが,
 先日 25 日(0x7FFFFFFF 2,147,483,647)を過ぎて 0x80000000 となってしまっていた.
MSDN 浮動小数点型からの変換

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

コンボボックスで文字化け

「今まで CHS で使用していた環境を日本語に切替えたのに,一部 “漢字” で表示されたままになっている」と問合せ.
UNICODE.exe なので,MultiByte との変換の時には問題が発生することは知っていたが,…
メニューやダイアログのタイトルなどは問題ないが,コンボボックスで文字化けしていた.
「コントロールパネル」-「地域と言語」-「管理」タブ-「Unicode 対応…」-「システム ロケール…」が「日本語」でなかった.


UNICODE.exe でも,コンボボックスでは文字化けすることは知らなかったので,exe を作って調べてみた.
MBCS.exe .半角カタカナなども文字化けしてしまう.


UNICODE.exe .コードで追加している場合は,正しく表示される.
m_ComboD.AddString(_T(“1234567890”)) ;
m_ComboD.AddString(_T(“12345”)) ;
m_ComboD.AddString(_T(“ABCDEFGHIJ”)) ;
m_ComboD.AddString(_T(“ABCDE”)) ;
m_ComboD.AddString(_T(“あいうえお”)) ;
m_ComboD.AddString(_T(“亜意卯絵尾”)) ;


VC 2013 で同様に作成してみたが,

最初,リソースエディタで複数指定する方法がわからなかったが,セミコロンで区切れば OK .


コンボボックスの表示データを,リソースで指定している場合に文字化けしてしまう.
ComboBox.zip


これらに関して検索してみると,
UNICODEアプリケーションで文字化けが発生する
リソースファイルの文字列のUNICODE化

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.