Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

DoDragDrop ですぐに抜ける?

以下の様なコードで,COleDataSource::DoDragDrop の部分がすぐ抜ける.
  CStringArray sa ;
  ::ListBoxToStringArray(m_DropList,&sa,TRUE) ;
  {
    CByteArray ba ;
    ::StringArrayToString2Z(sa,&ba) ;
    int len = ba.GetSize() ;
    HDROP hDrop = (HDROP)::GlobalAlloc(GHND,sizeof(DROPFILES) + len + sizeof(TCHAR)) ;
    if (hDrop == NULL) { return ; }
    LPDROPFILES lpdf = (LPDROPFILES)::GlobalLock(hDrop) ;
    lpdf->pFiles= sizeof(DROPFILES) ;
    lpdf->pt.x = 0 ;
    lpdf->pt.y = 0 ;
    lpdf->fNC = FALSE ;
    lpdf->fWide = FALSE ;
    #ifdef _UNICODE
    lpdf->fWide = TRUE ;
    #endif
    LPCTSTR lpFileNames = LPCTSTR(LPCSTR(lpdf)+lpdf->pFiles) ;
    memmove(LPVOID(lpFileNames),ba.GetData(),len) ;
    ::GlobalUnlock(hDrop) ;
    {
      COleDataSource* ods = new COleDataSource ;
      ods->CacheGlobalData(CF_HDROP,hDrop) ;
      ods->DoDragDrop() ;
      delete ods ;
      }
    }

AfxOleInit() を呼出していなかった.


[VC50] Windows 95 標準コントロールのドラッグアンドドロップサンプル http://support.microsoft.com/kb/152092/ja


2014/08/11 追記
上のコードで,delete ods はうまくない.
データ オブジェクトとデータ ソース : 作成と破棄

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


CInternetFile::ReadString

CInternetFile::ReadString
CInternetFile::ReadString
VC 6 UNICODE.exe で,文字化けと,中身がうまく処理されない.MBCS.exe はOK.
文字化けは,CHAR から TCHAR への変換を正しく処理することにより対応.
それでも,まだ改行の位置で戻らず,終端も正しくない(デバッグ版ではゴミ ‘0xCD’ が入る).
どうも,VC 6 や 7 では,うまく処理できないみたい.VC 8 では期待した動作と思われる.

  CHttpConnection* pServer = pServer = session.GetHttpConnection (svrName) ;
  CHttpFile* pFile = pServer->OpenRequest (CHttpConnection::HTTP_VERB_GET,name) ;
  pFile-> SendRequest () ;
  {
    CString buf ;
    while (pFile->ReadString(buf)) {
      CString tmp = ::ToStringTC(LPCSTR(LPCTSTR(buf))) ;
      rBuf.Add(tmp) ;
      }
    ::StringArrayToString(rBuf,rData) ;
    }

http://support.microsoft.com/kb/329071
 PRB: CInternetFile::ReadString Does Not Convert Non-Unicode Text to Unicode Text


2019/01/31 LPCSTR , LPCWSTR からの変換
CRT_MBWC.hxx
tstrmbwc.hxx

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


MS11-025 その後

以前,KB2465367 などの影響を受けたが,その対応版 KB2538218 のコードの抜粋
typedef BOOL (WINAPI *PFNFINDACTCTXSECTIONSTRING)(DWORD, const GUID *, ULONG, LPCTSTR, PACTCTX_SECTION_KEYED_DATA);
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
 TCHAR szLangDLL[_MAX_PATH+14];
 TCHAR szLangCode[4];
 HINSTANCE hInstance = NULL;
 if (lcid == LOCALE_SYSTEM_DEFAULT) {
  Checked::tcscpy_s(szLangCode, _countof(szLangCode), _T("LOC"));
  }
 else {
  int nResult;
  nResult = ::GetLocaleInfo(lcid, LOCALE_SABBREVLANGNAME, szLangCode, 4);
  if (nResult == 0)
    return NULL;
  ASSERT( nResult == 4 );
  }
 int ret;
 ATL_CRT_ERRORCHECK_SPRINTF(ret = _sntprintf_s(szLangDLL,_countof(szLangDLL),_countof(szLangDLL)-1,pszFormat,pszPath,szLangCode));
 if(ret == -1 || ret >= _countof(szLangDLL)) {
  ASSERT(FALSE);
  return NULL;
  }
 TCHAR *pszFilename = ::PathFindFileName(szLangDLL);
 ACTCTX_SECTION_KEYED_DATA data = {sizeof(data)};
 HMODULE hKernel = GetModuleHandle(_T("KERNEL32"));
 PFNFINDACTCTXSECTIONSTRING pfnFindActCtxSectionString = NULL;
 if (hKernel != NULL) {
  #ifdef _UNICODE
   pfnFindActCtxSectionString = (PFNFINDACTCTXSECTIONSTRING)GetProcAddress(hKernel, "FindActCtxSectionStringW");
  #else
   pfnFindActCtxSectionString = (PFNFINDACTCTXSECTIONSTRING)GetProcAddress(hKernel, "FindActCtxSectionStringA");
  #endif
  }
 if (pfnFindActCtxSectionString &&
 pfnFindActCtxSectionString(0, NULL, ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, pszFilename, &data)) {
  // Load using the dll name only…
  hInstance = ::LoadLibraryEx(pszFilename, NULL, 0);
  }
 else {
  // Load using the full path…
  hInstance = ::LoadLibraryEx(szLangDLL, NULL, 0);
  }
 return hInstance;
 }

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


コンソール AP リンクエラー

——————–構成: XXxxXXxx – Win32 Debug——————–
コンパイル中…
XXxxXXxx.cpp
リンク中…
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル “__endthreadex” は未解決です
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル “__beginthreadex” は未解決です
Debug/XXxxXXxx.exe : fatal error LNK1120: 外部参照 2 が未解決です。
link.exe の実行エラー

XXxxXXxx.exe – エラー 3、警告 0

「C/C++」-「コード生成」-「使用するランタイムライブラリ」を 「マルチスレッド (デバッグ)」 に


 
——————–構成: XXxxXXxx – Win32 Debug——————–
コンパイル中…
XXxxXXxx.cpp
リンク中…
nafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) はすでに LIBCMTD.lib(dbgdel.obj) で定義されています
Debug/XXxxXXxx.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました
link.exe の実行エラー

XXxxXXxx.exe – エラー 2、警告 0

http://support.microsoft.com/kb/148652/ja
Visual C++ で CRT ライブラリおよび MFC ライブラリのリンク順序が正しくないときに LNK2005 エラーが発生する

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


ドロップしたフォルダを開く

「ドロップされたファイルのフォルダを開く」ツールの改良版

http://cid-535f5973454c1292.office.live.com/self.aspx/.Public/Tools/DropOpen.2011.08.10.zip


i_Tools

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


ListBoxDocMF の使い方で...

以前の,画像付ファイル名リストボックス(ListBoxDocMF)の利用方法の改良
前の方法では,対応する画像(EMF)が存在しない,または見つからないと,意図した動作にならない.
そのため,ファイルを登録する時に,対応画像が存在しないとそれを作成して登録する方法.
DImageS::Draw を利用している.
BOOL CDropOpenDlg::UpdateDImgLB()
{
  CWaitCursor wait ;
  ::TrimSameString(DropFiles) ;
  {
    static DelFileE dfe ;
    DImgAry.RemoveAll() ;
    long len = 0 ;
    int makeCount = 5 ;
    for (int dIndex=0 ; dIndex0) {
        dfe.Add(mfName) ;
        MetaFile mf(FALSE) ;
        CWnd* mainWnd = AfxGetMainWnd() ;
        CRect rect(0,0,100,100) ;
        if (!mf.Create(mainWnd,rect,mfName)) { return FALSE ; }
        CMetaFileDC* mfDC = mf.GetMetaDC() ;
        {
          dImg.Draw(mfDC,rect) ;
          }
        mf.Close() ;
        makeCount– ;
        dfe.Add(::GetFileDir(mfName)) ;
        }
      DImgAry.Add(dImg) ;
      len = max(len,dropFile.GetLength()) ;
      }
    m_CtrlDropFiles.ResetContent() ;
    for (int rIndex=0 ; rIndex<DImgAry.GetSize() ; rIndex++) {
      CString fileName = DImgAry.GetAt(rIndex).GetFileName() ;
      m_CtrlDropFiles.AddString(fileName,fileName) ;
      CString mfName = CacheFile::GetCF_Name(fileName,1000) ;
      if (::FileIsExist(mfName)) {
        m_CtrlDropFiles.SetAtDocMF(rIndex,mfName) ;
        }
      else {
        HICON icon = DImageS_GetIcon(fileName) ;
        m_CtrlDropFiles.SetAtIcon(rIndex,icon) ;
        }
      }
    ::SetHorizontalExtent(&m_CtrlDropFiles,len) ;
    }
  return TRUE ;
  }

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


List.exe 起動時,アプリケーションエラー

以前は通っていたデバッグ用 exe をビルドしたら,起動時にアプリケーションエラーになってしまった.

原因は,アプリケーションクラス内に確保された Profile .
なぜ宣言されていたのかは今となっては不明.
ListApp.h 内をコメントにして OK .

以下が初期化される前に Profile::GetInt が通ることによりエラーとなる.
_CriticalS_ Profile::CS ;

またこのタイミング(アプリケーションクラスのコンストラクタ)では,SetRegistoryKey が指定されていないので,Profile クラスを利用すること自体がうまくないと思われる.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


DECLARE_SERIAL を忘れると…

IMPLEMENT_SERIAL (T_BaseDoc, CObject,0) の所で
C:\…\T_BDDoc.cpp(63) : error C2039: ‘CreateObject’ : ‘T_BaseDoc’ のメンバではありません。
    c:\…\t_bd_.hpp(28) : ‘T_BaseDoc’ の宣言を確認してください。
C:\…\T_BDDoc.cpp(63) : error C2509: ‘_GetBaseClass’ : このメンバ関数は、’T_BaseDoc’ クラス内で宣言されていません。
C:\…\T_BDDoc.cpp(63) : error C2039: ‘classT_BaseDoc’ : ‘T_BaseDoc’ のメンバではありません。
    c:\…\t_bd_.hpp(28) : ‘T_BaseDoc’ の宣言を確認してください。
C:\…\T_BDDoc.cpp(63) : error C2039: ‘CreateObject’ : ‘T_BaseDoc’ のメンバではありません。
    c:\…\t_bd_.hpp(28) : ‘T_BaseDoc’ の宣言を確認してください。
C:\…\T_BDDoc.cpp(63) : error C2509: ‘GetRuntimeClass’ : このメンバ関数は、’T_BaseDoc’ クラス内で宣言されていません。
C:\…\T_BDDoc.cpp(63) : error C2039: ‘classT_BaseDoc’ : ‘T_BaseDoc’ のメンバではありません。
    c:\…\t_bd_.hpp(28) : ‘T_BaseDoc’ の宣言を確認してください。
C:\…\T_BDDoc.cpp(63) : error C2039: ‘classT_BaseDoc’ : ‘T_BaseDoc’ のメンバではありません。
    c:\…\t_bd_.hpp(28) : ‘T_BaseDoc’ の宣言を確認してください。
 

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。



    top

    %d人のブロガーが「いいね」をつけました。