ホーム » 2011 (ページ 3)
年別アーカイブ: 2011
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
Microsoft KB Archive/329071
PRB: CInternetFile::ReadString Does Not Convert Non-Unicode Text to Unicode Text
2019/01/31 LPCSTR , LPCWSTR からの変換
CRT_MBWC.hxx
tstrmbwc.hxx
2022/09/09 バイナリで処理する様に変更.
CHttpFile Read
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;
}
コンソール 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://cid-535f5973454c1292.office.live.com/self.aspx/.Public/Tools/DropOpen.2011.08.10.zip
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 ;
}
List.exe 起動時,アプリケーションエラー
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’ の宣言を確認してください。
FileWait(ar) ;
FileWait::FileWait (CArchive& ar)
{
CFile* file = ar.GetFile() ;
UINT flag = ar.IsStoring() ? CFile::modeWrite : CFile::modeRead ;
CString filePath = file->GetFilePath() ;
Init(filePath,flag) ;
}
ar.IsStoring の時,書込んでいる事をレジストリにマーク(Open_WriteMode)する.
FileWait::IsOpenedWrite により,この状態を判断できる.
実際これを利用しているのは MakeCMF.cpp と,PlnCtrl.exe .
BOOL MakeCacheMF::CanMakeMF (void)
{
…
BOOL canMake = TRUE ;
if (!CheckInstall()) { canMake = FALSE ; }
else if (FileWait::IsOpenedWrite()) { canMake = FALSE ; }
else { … }
if (!canMake) {
CString stmsg = _T(“生成を中断しています.”) ;
…
}
return canMake ;
}
BOOL SleepOtherSaving (void) {
…
return FileWait::IsOpenedWrite() ;
}
LRESULT CPlnctrlDlg::FindHandler(WPARAM param1, LPARAM param2) {
…
if (::SleepOtherSaving()) { return 0 ; }
…
}
スリープする様になった?
設定を変更したつもりはないのに,…
それと,いじってしまったのかはっきりしないが,「休止状態」がなくなった.
スリープと休止状態: よく寄せられる質問
VHD の圧縮でエラー 67
DP340XPP 仮想環境
DP340XPP を移行した Virtual PC 内の環境
「Luna が有効にならない」は特に困るわけではない.Disk2VHD を使用した時はちゃんと表示できてたのにな~.
1.ブート時のChkDsk
2.Outlook Express
3.プロテクトデバイスを使用する AP
4.不要なファイルを整理,削除
5.ディスク クリーンアップ
6.デフラグ 1 回目
7.デフラグ 2 回目 ここでブルースクリーン
イベントビューアで Disk のエラーが多数あり
8.ChkDsk
9.デフラグ
10.PreCompact.exe
11.VHD の圧縮
DP340XPP-0.vhd 64.3 GB → 56.4 GB
DP340XPP-1.vhd 24.6 GB → 22.8 GB
DP340XPP 続き
「統合コンポーネントのインストール」が出来ない状態からの続き.
途中で,ロールバックしている様な動きだったので,…
デバイスマネージャで,うまく認識していないデバイスを削除(3 つあった).
今度は,インストールOK.
画面の解像度や色数が低い(VGA 程度).
再起動で,通常の設定が可能になった.
ただ,ホストとのマウスの行き来が出来ない.
一度,「プログラムの追加と削除」から「統合コンポーネント」をアンインストール.
再度,「統合コンポーネント」をインストール.
マウスの動作やフルスクリーンなど思った動作にはなった.
DP340XPP その後
不安定になっていた,DP340XPP を VHD にするために,HD を整理.
但し,不定期にリブートがかかる(どうもブルースクリーンになっている)ことがあるので,大きくて他の環境に存在してもいいファイルを他環境に移動.
本来はディスクのクリーンアップやデフラグなどを行った方が良かったのかもしれないが,環境が不安定なためスキップ.
Disk2VHD
開始したのが 05/02 21:00 頃.C ドライブだけで,05/03 3:00 頃となったためそのまま放置.
05/03 8:30 頃見ると,リブートがかかっている.
VHD のタイムスタンプが 5:08 ,リブートがかかった時間は 5:30 頃と思われセーフ(イベントビューアで確認).
仮想マシンを作成して,2 つの VHD を割り当て.
仮想マシンとして起動.
ライセンス認証.
ここまでは良かったが,「統合コンポーネントのインストール」が出来ない.
続きは今度,…
MS11-025 の影響?
2011/06/16 追記
2011/06/15 に MS11-025 が更新されたので,以下は古い情報になります.
どちらかというと,以下の影響
Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ (KB2467175)
Microsoft Visual C++ 2008 Service Pack 1 再頒布可能パッケージ (KB2467174)
MS11-025
Win 7 で,AFX_IDS_~ の表示が英語になってしまう.
Open , Save As , 印刷プレビューのボタン
All Files (*.*)
Failed to create empty document.
C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\l.jpn
AppCore.cpp の _AfxLoadLangDLL と思うが,うまく確かめられない.
ここが呼ばれる前のコードを切り出して lcid は 1041 で,JPN が求まっている所までは確認.
デバッグ版では,MFC90JPN.dll がロードされている(デバッガやリソースモニターで確認).
C:\Windows\WinSxS\x86_microsoft.vc90.mfcloc_1fc8b3b9a1e18e3b_9.0.30729.5570_none_4977a39175471b31\MFC90JPN.DLL
リリース版に,デバッグ情報を付加して動作を見ると
SXS: Invalid parameter(s) passed to FindActCtxSection*()
dwFlags = 0x00000001
ReturnedData = 0018F58C
->cbSize = 0
FindActCtxSection を検索すると,
Visual C++ MFC and ATL FindActCtxSection
そこからのリンクは Martin’s Blog 自動翻訳
_AfxLoadLangDLL のコードを比べると,
Microsoft Visual Studio 2005 Service Pack 1 (KB2465367) 適用前
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
…
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;
}
hInstance = ::LoadLibrary(szLangDLL);
return hInstance;
}
適用後
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
…
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;
if (FindActCtxSectionString( FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, NULL,
ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,pszFilename, &data) ) {
// Load using the dll name only…
hInstance = ::LoadLibraryEx(pszFilename, NULL, LOAD_LIBRARY_AS_DATAFILE);
}
else { // Load using the full path…
hInstance = ::LoadLibraryEx(szLangDLL, NULL, 0);
}
return hInstance;
}
FindActCtxSectionString によって,Win 2K では動作しなくなるらしい.
2011/05/10 追記
Ted’s Blog Fixing problems with FindActCtxSectionString in MFC security updates
static.exe での Win2K 対応と,ACTCTX_SECTION_KEYED_DATA の初期化など
比べてもあまり意味はないが,VC 2010 では
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
TCHAR szLangDLL[_MAX_PATH+14];
TCHAR szLangCode[4];
HINSTANCE hInstance;
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;
}
hInstance = ::LoadLibraryEx(szLangDLL, NULL, 0);
return hInstance;
}
pszPath は “C:\Windows\system32\” になっている.