ホーム » メモ (ページ 18)

メモ」カテゴリーアーカイブ

2025年4月
 12345
6789101112
13141516171819
20212223242526
27282930  

カテゴリー

アーカイブ

ブログ統計情報

  • 111,745 アクセス


IIS 環境の再設定

2019/12 Win10 IIS 環境に Classic ASP のインストールと設定
2020/10 https://jml.mish.work/various/iis.html


AsTrmM_VC8 が動作しない.
—————————
Microsoft Visual C++ Runtime Library
—————————
Runtime Error!
Program: C:\Temp\…\Release.080\AsTM0129.exe
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application’s support team for more information.
—————————
OK
—————————
AsTrmM_VC6 は OK .
どうも OpenMP がうまくない?


S:\ …\PAto.exe にあると,
ASP 0177 Server.CreateObject に失敗しました 80070003


Win 7 で,Classic ASP は「World Wide Web サービス」-「アプリケーション開発機能」-「ASP」をチェック.
Win10 Classic ASP インストール
以前 XP に設定した時のメモ
Web ページの公開
WWW サービスの設定


2015/02/16
asp ファイルが存在する所を開くと,
  サーバー エラー
  500 – 内部サーバー エラーです。
  検索中のリソースに問題があるため、リソースを表示できません。
サーバ側で動かすと,
  An error occurred on the server when processing the URL. Please contact the system administrator.
  If you are the system administrator please click here to find out more about this error.
どうもデフォルトでは出力されなくなったみたい.


今度は次の様なコードで実行時エラー.
  dim oToPA
  set oToPA = Server.CreateObject(“PAto.AsXxx”)
  Microsoft VBScript 実行時エラー エラー ‘800a01ad’
  ActiveX コンポーネントはオブジェクトを作成できません。
  /Test/Test_1st/DrawVer.asp, 行 6
Win XP では ActiveX.exe を起動すれば良かったが,Win 7 では「管理者」とする必要があるので,
  「コマンドプロンプト」を「管理者として実行」して,その中で exe を起動.


アクセス権が許可されてないと,
  Server オブジェクト エラー ‘ASP 0178 : 80070005’
  Server.CreateObject アクセス エラー
  /Test/Test_1st/DrawVer.asp, 行 6
  許可を確認中に Server.CreateObject の呼び出しに失敗しました。
  このオブジェクトへのアクセスは拒否されます。
アクセス権を設定
Win 7 では IUSER
IUSER のアクセス権の設定


OS が 64 ビットの時,そのままでは ActiveX.dll が起動しない.
32 ビットアプリケーションの有効化


他の PC から,http://win7-iis:8080/ の様に接続できない(localhost:8080 は可能).
  対応方法がよくわからないが,ファイアウォールの設定で 8080 を追加してみたら通る様になった.
ファイアウォールの設定で 8080 を追加


2015/02/17
サーバのオートメーション機能で ini に設定値を保持しているが更新されない
(IUSER はフルコントロールとして存在している).
  Everyone の追加で意図した動作(ini を更新できる)にはなった.
タスクマネージャ オートメーション.exe の動作の表示

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

‘新しいテキスト ドキュメント.txt’ …

ちょっと変な状態に陥ったのでメモ.


\\DevS\Documents\MICS\Plan\MICSDat\Test_2015 01-03\9LM-2U-J6TRi-2S7M.001\
\\DevS\Documents\MICS\Plan\MICSDat\Test_2014_12\ などでは
[Window Title]
ファイルを作成できません
[Content]
ファイル ‘新しいテキスト ドキュメント.txt’ を作成できません。
開かれている共有ファイルが多すぎます。
[OK]


\\DevS\Documents\MICS\Plan\MICSDat\ だと戻ってこない(エクスプローラが応答なしになる)
\\DevS\Documents\MICS\Plan\ などでは正しく生成できる.


ログオフ時,\\DevS\Documents\MICS\Plan\MICSDat\新しいテキスト ドキュメント.txt ができていた.
再ログオン後,直後はできなかったがしばらくすると可能となった.


現象はどーってことない(再起動すれば直る)が,
問題は,MFC で作成した普通の AP でドキュメントが消失したこと.
その AP は,自動的に %Temp% にバックアップを保持するので完全に失ったわけではないが,
標準の MFC のシリアライズ動作ではうまくないのか?

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

コンソール AP でレジストリ読み取り

コンソール AP で,レジストリを読み取るために以下の様な関数を用意した.


  int Reg_GetInt (HKEY hKey,LPCTSTR subKey,LPCTSTR ent,const int defValue=0)
  {
     DWORD value = defValue ;
  #ifdef _ATL_VER
     {
       CRegKey reg ;
       reg.Open(hKey,subKey) ;
     #if (_ATL_VER >= 0x700)
       reg.QueryDWORDValue(ent,value) ;
     #else
       reg.QueryValue(value,ent) ;
     #endif
       }
  #else
     {
       HKEY hSecKey = NULL ;
       LONG openStatus = ::RegOpenKeyEx(hKey,subKey,0,KEY_READ,&hSecKey) ;
       if (hSecKey == NULL) { return value ; }
       DWORD type = REG_NONE ;
       DWORD count = sizeof(DWORD) ;
       LONG queryStatus = ::RegQueryValueEx(hSecKey,ent,NULL,&type,(LPBYTE)&value,&count) ;
       ::RegCloseKey(hSecKey) ;
       }
  #endif
     return int(value) ;
     }
*::Reg~ などのエラーチェックは省いている.
呼出すのはこんな感じ.
  int value = ::Reg_GetInt(HKEY_CURRENT_USER,_T(“Software\\Iwao\\Test\\RegAcc”),_T(“T_RegKey_DW”)) ;


CWinApp::GetProfileInt などが使えないかとやってみたが,…
1. AfxGetApp() を呼びだしても,NULL で戻ってくる.
  次の様に領域を確保.
    CWinApp theApp;
2. SetRegistryKey(key) が直接呼びだせないので,
  class C_SRK_WinApp : public CWinApp {
  public:
       void SetRegKey (LPCTSTR key) { SetRegistryKey(key) ; }
     } ;
  変数の確保は次の様に変更.
    C_SRK_WinApp theApp ;
3. SetRegistryKey の中で ASSERT(m_pszAppName != NULL)
  以下を追加して,CWinApp を初期化.
     AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0) ;
4. これで CWinApp::GetProfileInt は利用できるようになるが,CWinApp::m_pszProfileName が邪魔.
   C_SRK_WinApp* app = (C_SRK_WinApp*)AfxGetApp() ;
   int val = app->GetProfileInt(_T(“Test\\RegAcc”),_T(“T_RegKey_DW”),0) ;
  HKCU\Software\Iwao\(m_pszProfileName)\Test\RegAcc となってしまう.
5. m_pszProfileName を _T(“”) とすることにより,意図した値を取得できる様にはなった.
   C_SRK_WinApp* app = (C_SRK_WinApp*)AfxGetApp() ;
   if (app != NULL) {
     AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0) ;
     app->SetRegKey(_T(“Iwao”)) ;
     free((void*)app->m_pszProfileName) ;
     app->m_pszProfileName = _tcsdup(_T(“”)) ;
     int val = app->GetProfileInt(_T(“Test\\RegAcc”),_T(“T_RegKey_DW”),0) ;
     }


コンソール AP で CWinApp::GetProfileInt などを使うことは,やめ.

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

GetDIBits

GetDIBits を利用していて,最初うまく取れなかったのでメモ.


lpvBits に NULL が指定できるとのことなので,
  ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, &bmif,DIB_RGB_COLORS) ;
しかしうまく取れない.原因は,biSize の指定がされてなかったため.
  bmif.bmiHeader.biSize = sizeof(BITMAPINFOHEADER) ;


以下の様に,BITMAPINFO を求めてから,もう一度呼び出し情報は取れる様になった.
    ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, &bmif,DIB_RGB_COLORS) ;
  if (::GetDIBits(hDC,hbm,0,bmap.bmHeight,&bits[0], &bmif,DIB_RGB_COLORS) != 0) {
    ….
    }
が,bmif の部分を stack としていて,オーバーフローしている.
  BITMAPINFO bmif ; memset(&bmif, 0, sizeof(BITMAPINFO)) ;
デバッグ用に,次の様に 0xfe で初期化して渡してみると
  v_char bmif ; bmif.resize(sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256,-2) ;
   memset(&bmif[0],0, sizeof(BITMAPINFO)) ;
  BITMAPINFO* pbmi = (BITMAPINFO*)&bmif[0] ;

00036C40  28 00 00 00 02 00 00 00 02 00 00 00 01 00 20 00  (............. .
00036C50  03 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00  ................
00036C60  00 00 00 00 00 00 00 00 00 00 FF 00 00 FF 00 00  ................
00036C70  FF 00 00 00 FE FE FE FE FE FE FE FE FE FE FE FE  ................


どうも,1 回目の GetDIBits で,pbmi->bmiHeader.biCompression が BI_BITFIELDS となっている.
  … the color table consists of three DWORD color masks that specify the red, … とある.
以下の様に,BI_RGB を再設定する様にした.
    ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, pbmi,DIB_RGB_COLORS) ;
    pbmi->bmiHeader.biCompression = BI_RGB ;
  if (::GetDIBits(hDC,hbm,0,bmap.bmHeight,&bits[0], pbmi,DIB_RGB_COLORS) != 0) {
    ….
    }
HBM_Fn.hxx
i_DIB_Fn.hxx

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

MessageBar クラスと OpenMP

新しい Message クラスを使用して,OpenMP 対応の動作のテスト.
void CTSttBView::OnTestDrawBar2()
{
  Message tmp ;
  ElapseTick et ;
  #define BAR_COUNT_2 1000000
  #ifdef _OPENMP
    #pragma omp parallel for
  #endif
  for (int i=0 ; i<100 ; i++) {
    Message bar ;
    bar.SetBar (_T(“Test Message 1 M * 100”),BAR_COUNT_2,RGB(0,255,0)) ;
    for (int index=0 ; index<BAR_COUNT_2 ; index++) {
      bar.SetBarInc() ;
      }
    }
  DWORD elapseT = et.GetElapse() ;
  CString str ; str.Format(_T(“%.2f 秒”),elapseT/1000.) ;
  AfxMessageBox(str) ;
  }
1 億回 SetBarInc を呼出していて,10 秒程度だったのが,#pragma omp parallel for で 20 秒程度になってしまった.


inline bool MessageBase::SetBarInc (void)
{
  if (GetBarMax() == 0) { return false ; }
  if (GetBarCount() < GetBarMax()) { B_Counter++ ; }
  else { B_Counter = 0 ; } // reset
  IncCounterR() ;
  {
    long lastPos = long(100*(GetBarCount()-1)/GetBarMax()) ;
    long new_Pos = long(100*(GetBarCount()-0)/GetBarMax()) ;
    if (lastPos == new_Pos) { return true ; }
    }
  #ifdef _WINDOWS
  #ifdef _MFC_VER
  #ifdef _OPENMP
    if (AfxGetMainWnd() == NULL) { return false ; }
  #endif
  #endif
  #endif
  return SetBarCount(B_Counter) ;
  }
AfxGetMainWnd() を呼出す回数を減らすことにより,3 秒程度に.

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

デバッグビルドで C2061 ‘_DebugHeapTag_func’

以前(2014/04/25 の exe が存在する)は通っていたのに,…


------ ビルド開始: プロジェクト: BLCombi, 構成: Debug Win32 ------
ComPrj01.cpp
c:\program files (x86)\microsoft visual studio 9.0\vc\include\xlocmon(283) : error C2061: 構文エラー : 識別子 '_DebugHeapTag_func'
c:\program files (x86)\microsoft visual studio 9.0\vc\include\xlocmon(281): クラス テンプレート のメンバ関数 'size_t std::moneypunct<_Elem,_Intl>::_Getcat(const std::locale::facet **,const std::locale *)' のコンパイル中
with
[
_Elem=char,
_Intl=true
]
c:\program files (x86)\microsoft visual studio 9.0\vc\include\xlocmon(908) : コンパイルされたクラスの テンプレート のインスタンス化 'std::moneypunct<_Elem,_Intl>' の参照を確認してください
with
[
_Elem=char,
_Intl=true
]
BLCombi - エラー 1、警告 1

------ ビルド開始: プロジェクト: BLCombi, 構成: Debug Win32 ------ ComPrj01.cpp c:\program files\microsoft visual studio 8\vc\include\xlocmon(273) : error C2061: 構文エラー : 識別子 '_DebugHeapTag_func' c:\program files\microsoft visual studio 8\vc\include\xlocmon(271): クラス テンプレート のメンバ関数 'size_t std::moneypunct<_Elem,_Intl>::_Getcat(const std::locale::facet **)' のコンパイル中 with [ _Elem=char, _Intl=true ] c:\program files\microsoft visual studio 8\vc\include\xlocmon(887) : コンパイルされたクラスの テンプレート のインスタンス化 'std::moneypunct<_Elem,_Intl>' の参照を確認してください with [ _Elem=char, _Intl=true ] BLCombi - エラー 1、警告 0
------ ビルド開始 : プロジェクト : BLCombi, 構成 : Debug Win32 ------ ComPrj01.cpp c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xlocmon(249) : error C2061: 構文エラー : 識別子 '_DebugHeapTag' c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xlocmon(247): クラス テンプレートのメンバ関数 'size_t std::moneypunct<_Elem,_Intl>::_Getcat(const std::locale::facet ** )' のコンパイル中 with [ _Elem=char, _Intl=true ] c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xlocmon(828) : コンパイルされたクラスのテンプレートのインスタンス化 'std::moneypunct<_Elem,_Intl>' の参照を確認してください with [ _Elem=char, _Intl=true ] BLCombi - エラー 1、警告 0
------ ビルド開始 : プロジェクト : BLCombi, 構成 : Debug Win32 ------ ComPrj01.cpp c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\xloctime(539) : error C2061: 構文エラー : 識別子 '_DebugHeapTag' c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\xloctime(539) : error C2143: 構文エラー : ';' が ')' の前にありません。 BLCombi - エラー 2、警告 0

VC 6 や VC 10 , 11 , 12 では 通る.
検索すると, #define new DEBUG_NEW の定義の様であるが,この ComPrj01.cpp でどうすべきかが不明.


本来は,ComPrj01.cpp でインクルードしているファイルを変更すべきなのだろうが,いい方法がわからない.
ComPrj01.cpp でインクルードしているものの順番を変更することで,通る様にはなった.


2024/11/11
https://dev.mish.work/wordpress/?s=C2061

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

Afx.h 追加でメモリリーク

コンソール AP を作成していて,ある時からメモリリークが.
Afx.h の関係とはその時予想がついたが,無意識にコードを変更して解消していたので整理.


Afx.h より前に iostream があるとリークが発生.
同じことをこの時にも書いてた.

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

on error …

久々に VBS を書いていて,少し時間がかかったのでメモ
コードを修正して,実行しても意図した動作で実行されない.
原因は on error resume next などとしていたため.

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

無効なパスが含まれています

VC 8 のプロジェクトのリリース版でビルド,実行したら,
—————————
MSW_0924
—————————
無題のファイル には無効なパスが含まれています。
—————————
OK
—————————
AFX_IDP_FILE_BAD_PATH
リビルドで正しく起動する様になった.
原因はよくわからないが,リソース辺りか?

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

xcode + glut

「Command Line Tool」としてプロジェクトを作成.
「GLUT」を追加.


10.9 になったこと?により出力される次の様なワーニングをでない様にするために 10.8 に.
/Users/Iwao/…/main.cpp:116:2: ‘glutInit’ is deprecated: first deprecated in OS X 10.9

インクルードパス設定場所は,「Build Settings」−「Search Paths」−「Header Search Paths」
glut.h のインクルードは以下の様にしている.
  #ifdef __APPLE_CC__
    #include <GLUT/glut.h>
  #else
    #include <GL/glut.h>
  #endif

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

OpenGL Programing Guide

何年も前に買った本(1995年8月10日第4刷となってる)で,中に含まれるサンプルを実行できる様にしてみた.
OpenGL Programing Guide
サンプルのソースで,<gl\glut.h> のインクルードは最初に移動.


glut
opengl.org
  GLUT and OpenGL Utility Libraries
    GLUT – The OpenGL Utility Toolkit
      Nate Robin’s GLUT for Windows page
glut32.dll は,system32 などへ.
glut.h は,~\Include\gl へ.
glut32.lib は,~\Lib へ.


セレクション
::glRenderMode(GL_SELECT) の後の ::glRenderMode(GL_RENDER) で,セレクションヒット数が得られる.
::glGetIntegerv(GL_RENDER_MODE) で現在のモードを取得可能.
セレクションバッファの内容
  名前の深さ?
  Z min
  Z max
  名前 …


2014/09/04
時間がかかったがなんとか GLUT ではできた.


2014/09/08
今度は,VXxxxView を使用した SDI.exe での手順.
ビューの OnDropFiles で,ファイルの種類により glRenderMode GL_SELECT , GL_RENDER を呼ぶ様に変更.
  CMainFrame::OnDropFile で条件により CXxxxView::OnDropFile を呼び出し.
  glGetIntegerv(GL_RENDER_MODE,…) で GL_SELECT が返ってこない.
    wglMakeCurrent を呼んでなかったので,効果がなかった.
  今度は,GL_SELECT にならない.GL_INVALID_OPERATION となる.
    ヘルプにある様に,glSelectBuffer を呼んでなかった.
CPickSView::OnDropFiles
  GetOpGLP()->MakeCurrent(TRUE) ;
  if (…) {
    ::glSelectBuffer(BUFSIZE,selBuf) ;
    ::glRenderMode(GL_SELECT) ;
    }
  else {
    ::glRenderMode(GL_RENDER) ;
    }
  GetOpGLP()->MakeCurrent(FALSE) ;


2014/09/10

PickS.2014.09.09.zip
マウスの Y 方向の位置が合ってない.
その exe を Win 7 環境で動かすと,

デバッグ用に ::glGetIntegerv(GL_RENDER_MODE,…) のために GetOpGLP()->MakeCurrent(…) していた.
  MakeCurrent(FALSE) で SwapBuffers を呼んでいる.


マウスの Y 方向は,縦長だと合っていそう.横長だとその長い分だけ Y 方向にずれている?

コの字型の平面方向で,座標はそれなりにとれている.::gluUnProject の z は Depth / 0xffffffff .
gulUnProject の y の与え方が違っていた.
viewPort[3] – pt.y としていたが,それではダメみたいで,GetClientRect の Height() としてうまくいってそう.
PickS.2014.09.10.zip
まだ ::gluPickMatrix の方がうまくできてない.


2014/09/11
平面図にして,1 つの直方体がウィンドウいっぱいに表示される状態で選択すると,

どうもピック領域のサイズが,ウィンドウの大きさになっているような感じ.
20 Picking and Using Selection 20. ピッキングとセレクションの使い方 を参考にしているが,…


::gluPickMatrix を呼ぶタイミングが悪かったのが原因.
ある程度予想はしていたが,OpGL::Projection の中のため,その関数を分割する必要がありそう.
その関数内の OpenGL の呼び出しは,
  ::glMatrixMode(GL_PROJECTION) ;
  ::glLoadIdentity() ;
  //  ここ
  ::glOrtho(r.l,r.r,r.b,r.t, zNear,zFar) ;  /  ::gluPerspective(deg(angle),aspect, zNear,zFar) ;
  ::glViewport((GLint)win.l,(GLint)win.b,(GLint)(win.r-win.l),(GLint)(win.t-win.b)) ;
glLoadIdentity() の後に ::gluPickMatrix を呼ばなければならない.
PickS.2014.09.11.zip


2014/09/18
汎用的なコードにするため,コードを見直しているがなかなか進まない.
例えば,マウスの移動で選択されているものを表示しようとすると,テクスチャありでは遅くて使えない.
また,その時の表示で PgonsA の描画を抜き出したコードだと何とか見れるが PartsA::Draw 相当だと遅い.
PickS.2014.09.18.zip


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

COleDataSource を利用した Drag

以前 DoDragDrop で少し調べたが,その時は途中になっていた.
その時の内容で,例えば CListBox に表示されてるファイルリストのすべてを,CListBox の外側でドラッグするすることはできる.
  void CDragLBDlg::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CStringArray sa ;
    ::ToStringArray(FileNames,&sa) ;
    ::StringArrayToDoDragFiles(sa) ;
    }


CListCtrl であれば,OnBegindragXxxx が利用できるので,
  void CDragLVDlg::OnBegindragListFiles(NMHDR* pNMHDR, LRESULT* pResult)
  {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    {
      CStringArray sa ;
      for (int index=0 ; index<m_ListFiles.GetItemCount() ; index++) {
        if (m_ListFiles.GetItemState(index,LVIS_SELECTED) == LVIS_SELECTED) {
          tstring str = FileNames[index] ;
          sa.Add(str.c_str()) ;
          }
        }
      if (sa.GetSize() > 0) {
        ::StringArrayToDoDragFiles(sa) ;
        }
      }
    *pResult = 0;
    }


今回やりたかったのは,CListBox の項目のドラッグ.
ドラッグ部分は CListCtrl とほぼ同様となると思われるが,ドラッグ開始のタイミングが取れない.
CDragListBox と開始時の動きは似ているが,MFC のコードを見るとちょっと難しそう.
いろいろと検索すると,CListBox のサブクラス化で対応するみたいとわかったが,手順が...
動的なサブクラス化と言うらしい.
Inside Visual C++ には,囲み記事に CNonNumericEdit がある.
利用する手順はわかるが,作成する手順がわからない
今も利用はしている CView からの VXxxxView ファミリがあるが,10 年以上前で手順は覚えてない.


いろいろ探して「MFC クラスウィザード」を利用することがわかった.
今まで,よく見ていたダイアログなのに...

後は,WM_LBUTTONDOWN を処理する様にして,
  void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CListBox::OnLButtonDown(nFlags, point);
    int sel = GetCurSel() ;
    if (sel == LB_ERR) { return ; }
    CString str ;
    GetText(sel,str) ;
    CStringArray sa ;
    sa.Add(str) ;
    ::StringArrayToDoDragFiles(sa) ;
    }
ダイアログに追加したリスボックスで,これを利用する様にダイアログのヘッダを修正.


MSDN CTRLTEST サンプル
テクニカル ノート 14
標準コントロールからのコントロールの派生
[MSVC] MFCを使用しての動的サブクラス化
Create Client Windows, Drag and Drop Between Listboxes


2014/08/11 追記
COleDataSource を利用して,他の AP に CF_HDROP で渡そうとすると,
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Assertion Failed!
Program: …Documents\Visual Studio 2010\Projects\TestVC10\Debug\T_SC.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp
Line: 43
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
—————————
中止(A) 再試行(R) 無視(I)
—————————

COleDataSource の使い方が間違っていた.
開放する時に delete ではうまくない.
データ オブジェクトとデータ ソース : 作成と破棄

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

VC のビルド時間

  A-T-r A-T-b A-E-r A-E-b B-I-r B-I-b
VC 6 35 6 160 12 380 21
VC 7 52 6 180 15 476 27
VC 7.1 73 11 295 24 745 41
VC 8 80 15 275 24 535 30
VC 9 25 9 100 12 220 15
VC 10 143 24 470 34 542 42
VC 11 150 21 475 31 505 38
VC 12 30 11 100 15 130 20

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

モードレスダイアログの動作が,…

VC 7 以降,MDI AP のモードレスダイアログが独立して動作してしまう現象があった.
その AP は,VC 4 の頃作成したもので CMainFrame::OnCreate 内でモードレスダイアログを作成している.
VC 6 までは特に問題なかったが,VC 7 以降タスクバーにアイコンが 2 つ存在する状態になってしまっていた.
過去に何度か対応方法を調べたが,わからずそのままとなっていた.


今日別の事を調べていて,「モードレスダイアログで親子にならなくする」方法が目に留まった.
CDialog::Create で,デフォルトの NULL ではなく,GetDesktopWindow() を与えるというもの.
VC 7 AP のダイアログの情報を,Spy++ で見ると,親ウィンドウが (なし) になっている.
今度はデバッガで,Create の付近を追いかけると AfxGetMainWnd() で NULL がかえっている.
ThrdCore.cpp より
CWnd* CWinThread::GetMainWnd()
{
  if (m_pActiveWnd != NULL)
    return m_pActiveWnd;
  if (m_pMainWnd != NULL)
    return m_pMainWnd;
  return CWnd::GetActiveWindow();
}


CXxxApp::InitInstance で以下の部分を修正.
  CMainFrame* pMainFrame = new CMainFrame;
  m_pMainWnd = pMainFrame;   // ここを追加
  if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;
  m_pMainWnd = pMainFrame;

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

CSplitterWnd – 2

SDI で,MDI の「新しいウィンドウを開く」で 4 つのビューを表示した様な動作が欲しかったので,調べてみた.
動的な分割ウィンドウである程度の所まではできそう.


1. MainFrm.h の CMainFrame に以下を追加.
    CSplitterWnd m_wndSplitter;
    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
2. CMainFrame::OnCreateClient の追加.
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
      {
        if (!m_wndSplitter.Create(this,2, 2,CSize(10, 10), pContext,
            WS_CHILD | WS_VISIBLE /* | WS_HSCROLL | WS_VSCROLL */ | SPLS_DYNAMIC_SPLIT))	{
          TRACE0("Failed to create split bar ");
          return FALSE;
          }
        return TRUE;
        }
      }
    スクロールバーを付加したくなかったので,6 つ目のウィンドウスタイルを変更している.
テスト用に分割動作をコマンドとして実装.
    void CMainFrame::OnSplit() 
    {
      if (IsSplit)	{
        if (m_wndSplitter.GetColumnCount() > 1) {	m_wndSplitter.DeleteColumn(1) ;	}
        if (m_wndSplitter.GetRowCount() > 1) {     	m_wndSplitter.DeleteRow   (1) ;	}
        IsSplit = !IsSplit ;
        }
      else {
        CRect	rect ;
        m_wndSplitter.GetClientRect(&rect) ;
        if (m_wndSplitter.GetColumnCount() == 1) {	m_wndSplitter.SplitColumn(rect.Width ()/2) ; }
        if (m_wndSplitter.GetRowCount() == 1) {		m_wndSplitter.SplitRow   (rect.Height()/2) ; }
        IsSplit = !IsSplit ;
        }
      }

2 x 2 の分割ウィンドウのコントロールの ID (Spy++ で確認)
  左上(0,0)  E900  AFX_IDW_PANE_FIRST
  右上(0,1)  E901
  左下(1,0)  E910
  右下(1,1)  E911


ビューの OnDraw を以下の様に書き換えると

  void CSpltWView::OnDraw(CDC* pDC)
  {
    int		row = -1 ;
    int		clm = -1 ;
    CMainFrame*		mw = (CMainFrame*)AfxGetMainWnd() ;
    CSplitterWnd*	sw = &mw->m_wndSplitter ;
    CString			str ;
    if (sw->IsChildPane(this,&row,&clm)) {
      int	id = sw->IdFromRowCol(row,clm) ;
      CString	tmp1 ;	tmp1.Format(_T("row = %d  ,  clm = %d"),row,clm) ;
      CString	tmp2 ;	tmp2.Format(_T("IdFromRowCol = %04X"),	id) ;
      str += tmp1 + _T("\r\n") ;
      str += tmp2 + _T("\r\n") ;
      }
    {
      UINT	nID = GetDlgCtrlID() ;
      CString	tmp ;	tmp.Format(_T("GetDlgCtrlID  = %04X"),nID) ;
      str += tmp + _T("\r\n") ;
      }
    {
      CWnd*	pw = GetParent() ;
      CString	tmp1 ;	tmp1.Format(_T("Splitter = %08x "),sw->GetSafeHwnd()) ;
      CString	tmp2 ;	tmp2.Format(_T("Parent  = %08x "),pw->GetSafeHwnd()) ;
      str += tmp1 + _T("\r\n") ;
      str += tmp2 + _T("\r\n") ;
      }
    CRect	rect ;
    GetClientRect(rect) ;
    rect.top = rect.left = 10 ;
    pDC->DrawText(str,rect,0) ;
    }


MFC の ソースを眺めていると CView::GetParentSplitter があったので,間接的にはそれを使えば良さそう.


ビューでどの位置かを求めるだけなら,
    short	texNo = 0 ;
    {
      UINT	nID = GetDlgCtrlID() ;
      switch	(nID)	{
        case	AFX_IDW_PANE_FIRST + 0x00 :	texNo = 1 ;		break ;
        case	AFX_IDW_PANE_FIRST + 0x01 :	texNo = 2 ;		break ;
        case	AFX_IDW_PANE_FIRST + 0x10 :	texNo = 3 ;		break ;
        case	AFX_IDW_PANE_FIRST + 0x11 :	texNo = 4 ;		break ;
        }
      }
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

‘THIS_FILE’ がシンタックスエラーを…

今まで通っていたプロジェクトで,
  ComPrj03.cpp
  c:\…\memory(16) : error C2061: 構文エラー : 識別子 ‘THIS_FILE’ がシンタックスエラーを起こしました。
  c:\…\memory(17) : error C2091: 関数は関数を返せません。
  c:\…\memory(17) : error C2809: ‘operator new’ に仮引数リストがありません。
  c:\…\memory(20) : error C2954: テンプレートの定義はネストできません。
  cl.exe の実行エラー
  ComPrj03.obj – エラー 4、警告 0


ソースの先頭付近に #include <memory> を追加.
  #include “StdAfx.h”
  #include “ComPrj00.hpp”
  #include <memory>
 


2019/01/18

--------------------構成: MkZIP2 - Win32 Release--------------------
コンパイル中...
MkZIP2.cpp
リンク中...

MkZIP2.exe - エラー 0、警告 0
--------------------構成: MkZIP2 - Win32 Debug--------------------
コンパイル中...
MkZIP2.cpp
c:\program files\microsoft visual studio\vc98\include\memory(16) : error C2061: 構文エラー : 識別子 'THIS_FILE' がシンタックスエラーを起こしました。
c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2091: 関数は関数を返せません。
c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2809: 'operator new' に仮引数リストがありません。
c:\program files\microsoft visual studio\vc98\include\memory(20) : error C2954: テンプレートの定義はネストできません。
cl.exe の実行エラー

MkZIP2.exe - エラー 4、警告 0

#include “stdafx.h”
#include “MkZIP2.h”
#include <ShlObj.h>
#import <Shell32.dll> // named_guids
//#include <memory>


エラーになるのはデバッグ版のビルド.リリース版では通る.
#include <memory> を有効に.


2023/03/24
#define new DEBUG_NEW より後にインクルードしているとうまくない error C2061 , C2091 , C2809 , C2556

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

~iDocText でダウン

先日作成した TextureToPath 関係でダウンする様になってしまった.
場所は,iDocText のデストラクタ付近.
呼出し元をたどると,#pragma omp parallel for .


TextureCopy::GetDrawName に #pragma omp critical (TextureCopy_GetDrawName) を追加.

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

LAN-GTJU3H3 追加

LAN-GTJU3H3 を追加.
何が悪いのかわからないが 100 M で接続されているみたい.今の用途では遅さはそれほど気にならない.
付属のマニュアルはちょっと古いみたいで,ここからマニュアルを参照.

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

時刻の同期

6/20 に HDL-Z2WM2C2 を追加した.
ソースファイルの保管のサーバとしての利用で,Win7 USB 2 HDD と比べても遜色ない.
ひとつ気になることが,思っていたよりファンの音がうるさい.


先日,クライアントの PC と WSS で,時間が少しずれていたので time.windows.com で時刻を合わせた.
今日時刻を見てみると 10 秒位の差ができてしまっている.
もう少し精度が欲しかったので検索すると,
インターネット時刻機能のポーリング間隔を調整する方法
Windowsの時計がずれる / 自動で正確に合わせる小技 (Windows 7/8.1編)
これらを参考にさせてもらって,1 日に 1 回程度の設定とした.

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

Polymorphism

class iDocCSV1 : public iDocText {

virtual long GetFieldNo (c_tstring& fieldName) const { return FNoNOP ; }

} ;
c_tstring fieldName となっていた.


TextureTo_1::MakeCSV1 でタプルクォーテーションでうまく括られない.閉じる ‘\”‘ が付加されない.
   da.push_back(::QuotM_Add_Auto( GetPath () ) ;
原因はよくわかってないが,LPCTSTR 版を利用することで対応.
   da.push_back(::QuotM_Add_Auto( GetPath ().c_str()) ) ;
MakeCSV1 を切り出してコンソール AP としてテストしたが,期待した動作となり原因は掴めてない.


2014/06/25
また次の様なコードで,STL 版ではうまく動作していない.
{
tstring str ;
str += tt1->GetName() + _T(“\r\n”) ;
str += tt1->GetPath() + _T(“\r\n”) ;
str += tt1->GetPathPNG()+ _T(“\r\n”) ;
str += tt1->GetPathTGA()+ _T(“\r\n”) ;
m_TexPath1 = str.c_str() ;
}
MFC 版では OK .
{
CString str ;
str += tt1->GetName ().c_str() + CString(_T(“\r\n”)) ;
str += tt1->GetPath ().c_str() + CString(_T(“\r\n”)) ;
str += tt1->GetPathPNG ().c_str() + CString(_T(“\r\n”)) ;
str += tt1->GetPathTGA ().c_str() + CString(_T(“\r\n”)) ;
m_TexPath1 = str ;
}


2014/06/27
また,::String_Join_Line でうまく結合されなかった.
デバッガで調べると,サイズは確保されいる.メモリの内容をよーく見てみると,途中に ” が入っている.
原因は,MFC を利用しない方法で書き直した ::DropFilesTo のバグ.
ファイル名の最後に余分な ‘\0’ が付加されていた.

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