Visual C++ 関連情報 †
Visual C++ 6.0 †
Visual C++ .NET †
Visual Studio 2005 †
- Visual Studio 2005
- Visual Studio 2005 製品ラインの概要
- Visual Studio 2005 Express ベータ製品
- Visual C++ 2005 Express Edition Beta (英語版)
はてなブックマーク †
- VC++関連
#showrss: Failed fetching RSS from the server
MSDN †
MFCに関する情報 †
コーディング規約 †
テクニカルノート †
スレッド †
スレッドの使い方 †
DOC/View †
ドキュメントの新規作成 †
- テクニカル ノート 22: 標準コマンドのインプリメント
SDI で Doc/View を使わない方法。 †
IMPLEMENT_DYNCREATE(CChildView, CListView) // 追加
class CMainFrame : public CFrameWnd
{
CChildView* m_pWndView;
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
/*
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -1;
}
m_pWndView = (CChildView*)RUNTIME_CLASS(CChildView)->CreateObject();
if (!m_pWndView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -1;
}
}
#end
また、以下の方法でも可能らしい。
#code c++
void CChildView::PostNcDestroy()
{
CWnd::PostNcDestroy();
}
#end
シリアライズ †
オーナー描画(Owner Draw)に関する情報 †
- オーナー描画とは?
- コントロール別背景色変更
- オーナードローボタンの作成
- オーナードローリストビューの作成
- ビットマップメニュー(MenuEx)
- メニューのオーナードローの手順
MFCアプリケーションの仕組み †
タイトルの「無題」を変更する方法。 †
- MFC、ウィンドウタイトルの表示タイミングについて。
CodeGuru - Visual C++ †
Controls †
Data †
Windows †
Tools †
COMに関する情報 †
- [HOWTO] COM と DCOM に関するサポート技術情報を検索する方法
コンポーネント開発 †
COMイベント †
- COMからのイベントを捕まえる方法
- COM セキュリティでよく寄せられる質問
- ADO イベント モデルの例 (VC++)
- ADO - Visual C++
- コネクトポイントの使い方(イベント)
- コンパイラ COM サポートのサンプル
- CONNECT サンプル : コネクション ポイントの実装と使用例
- Dr. GUI と COM イベント:第 1 部
- Dr. GUI と COM イベント:第 2 部
- Handling HTML Element Events
- イベント処理と ATL
- ActiveX Q&A, MSJ November, 1997 - Top Ten COM Myths
- CodeGuru: COM Connection Points
ActiveX †
- [ActiveX] OLE コントロールと ActiveX コントロールの相違点
- ActiveX テクノロジの概要
- ActiveX テクノロジーの概要
Insdie OLE のサンプルの場所 †
- MSDN ライブラリ 2001 年 10 月
[Visual Studio 6.0 ドキュメント]
+[Visual C++ ドキュメント]
+[サンプル]
+[SDK Sample]
+[COM Samples]
+[COM SDK Samples]
「Click to open or copy the files for the COM samples.」のリンクをクリック。
(表示されるまでに、ちょっと時間がかかります。)
- readme.txt
COM Sample Directory Tree
The COM directory contains several sample COM applications.
Directory Description
COMMON Common code used by all the OLE samples.
INCLUDE Common include files used by all the OLE samples.
WINHLPRS Library of Windows helper functions used by MFRACT and DFVIEW.
BROWSE OLE Automation controller that controls the BROWSEH inproc server.
BROWSEH OLE Automation server that browses a type library.
BTTNCUR Genertates BTTNCUR.DLL and BTTNCUR.LIB.
CMALLSPY Sample IMallocSpy implementation.
COM OLE tutorial samples.
DEFO2V Source code for the OLE2VIEW default object viewer DLL.
DFVIEW Docfile viewer.
DISPCALC OLE Automation sample program.
DISPDEMO Sample OLE Automation controller.
DSPCALC2 OLE Automation sample program.
GIZMOBAR Generates GIZMOBAR.DLL and GIZMOBAR.LIB.
HELLO OLE automation server that implements a dual interface.
LINES OLE Automation implementing collections and subobjects.
MFRACT Custom interface sample.
OLEAPT OLE Apartment model threading sample.
OLESTD Generates OLESTD.LIB.
OUTLINE Series illustrating converting a Windows application to OLE.
SIMPCNTR Simple OLE container sample.
SIMPDND Simple drag and drop sample.
SIMPSVR Simple OLE server sample.
SPOLY OLE Automation sample polygon drawing program.
SPOLY2 OLE Automation sample polygon drawing program.
TIBROWSE OLE Automation sample type library browser.
Additional directories are created by these samples:
LIB Will contain library files generated during the build.
BIN Will contain many of the target .EXE and .DLL files.
More details on each of these samples can be found in the readme.txt
files found in these directories.
To build all of these samples, use the following command
nmake -a
構造化ストレージ †
ドラッグ&ドロップ †
- ファイルのドロップを受け取るダイアログ
- ファイルのドロップ
- OLE の背景知識
- ドラッグ アンド ドロップ (OLE)
- Drag & Drop / MFC / Programming Tips
- OLEによるDnD
- ドラッグ アンド ドロップ (ファイル名の獲得)
- CodeGuru: Drag & Drop
- エクスプローラからのコピーについて
- ドラッグ&ドロップ
- エクスプローラーへクリップボード経由でファイルをコピー、切り取りするには
- 自アプリから他アプリにDrag&Dropして起動するには
- Advanced Copy/Paste '& Drag/Drop Support
- Simple Drag and Drop for List Boxes in 32-Bit Visual C++ Applications
- Shell Drag/Drop Helper オブジェクト
- 第2章:Drag & Drop
- ドラッグの開始と view へのドロップ
- OLE Drag and Drop from scratch
- Shell Data Transfer
クリップボードに関する情報 †
- クリップボードの中身をのぞき見る方法
- Clipboard
- Clipboard articles
- Transferring Shell Objects with Drag-and-Drop and the Clipboard
- Supporting the Clipboard, DDE, and OLE in Applications
- The Code Project - ClipSpy - Clipboard
ショートカットの作成 †
- ショートカットを作成するには
- ショートカットの作成
- ショートカットを作成する
- デスクトップ上にショートカットを作成する方法
- CFileShortcut クラス
- (スタートアップに) プログラムへのショートカットを作成するには?
- How to create and resolve a shortcut
- Introduction to COM - What It Is and How to Use It.
- How To Change the Icon of a Shortcut Through IShellLink
- The Create Shortcut command truncates the source path folder names to eight characters
- Shell Links
シェル拡張 †
- シェルエクステンションって?
- Shell Instance オブジェクトによるシェル拡張の作成
- Creating a Shell Namespace Extension
- FAQ: Shell Namespace Extensions; Microsoft Internet Developer March 1999
- Create Namespace Extensions for Windows Explorer with the .NET Framework
- The Complete Idiot's Guide to Writing Namespace Extensions - Part I - Shell Programming
- An almost complete Namespace Extension Sample
- 自分だけの Web 形式フォルダ
- 新年は新しいWindows Shellで飾ろう!
- Welcome to Shell+ Home
- CodeGuru: Shell Programming
特殊フォルダ †
- 特殊フォルダ - いじくるつくーるのヘルプ
- フォルダのリダイレクト
COM の使い方 †
Visual Basic †
For Visual Basic Developers †
Visual C++ Developers (using MFC) †
C/C++ Developers (without MFC) †
IEコンポーネントの使い方 †
WMIの使い方 †
MSXMLの使い方 †
ADOの使い方 †
ADOレコードセットを配列として使う方法 †
#code c++
#include <afx.h>
#include <comdef.h>
#import "C:\Program Files\Common Files\System\Ado\msado15.dll" rename("EOF", "adoEOF")
using namespace ADODB; // 名前空間
#include <afxdisp.h> // COleSafeArray
#include <afxtempl.h> // CArray
typedef CArray< _variant_t, _variant_t& > CVariantArray;
class CSafeVariantArray : public CVariantArray
{
public:
operator LPVARIANT()
{
VariantArrayToSafeArray();
return (LPVARIANT)m_sa;
}
private:
void VariantArrayToSafeArray()
{
COleSafeArray sa;
int nSize = GetSize();
sa.CreateOneDim( VT_VARIANT, nSize );
for ( int i = 0; i < nSize; i++ )
{
long lArrayIndex = (long)i;
_variant_t vValue = GetAt(i);
sa.PutElement( &lArrayIndex, &vValue );
}
m_sa = sa;
return;
}
COleSafeArray m_sa;
};
/*
Sub FieldsAppendTest
Dim rsTmp
Set rsTmp = CreateObject("ADODB.Recordset")
With rsTmp.Fields
.Append "Field1", adVarChar, 80, adFldIsNullable
.Append "Field2", adVarChar, 80, adFldIsNullable
End With
rsTmp.Open
Dim vFieldList
vFieldList = Array( "Field1", "Field2" )
Dim vValues
vValues = Array( "aaa", "bbb" )
rsTmp.AddNew vFieldList, vValues
vValues = Array( "CCC", "DDD" )
rsTmp.AddNew vFieldList, vValues
rsTmp.MoveFirst
Dim fld
Dim strLine
Dim strName
strLine = ""
For Each fld In rsTmp.Fields
strName = fld.Name
strLine = strLine & strName & vbTab
Next
WScript.Echo strLine
Dim strValue
While Not rsTmp.BOF And Not rsTmp.EOF
strLine = ""
For Each fld In rsTmp.Fields
strValue = fld.Value
strLine = strLine & "[" & strValue & "]" & vbTab
Next
WScript.Echo strLine
rsTmp.MoveNext
Wend
End Sub
void FieldsAppendTest()
{
try
{
CoInitialize(NULL);
ADODB::_RecordsetPtr rs; // Recordsetオブジェクト
// ADOオブジェクトの生成
rs.CreateInstance( __uuidof(ADODB::Recordset) );
rs->Fields->Append( L"Field1", adVarChar, 80, adFldIsNullable );
rs->Fields->Append( L"Field2", adVarChar, 80, adFldIsNullable );
rs->Open( vtMissing, vtMissing, adOpenForwardOnly, adLockOptimistic, adCmdUnknown );
// テーブルのフィールドリスト用の配列を作成します
CSafeVariantArray vaFieldList;
vaFieldList.Add( _variant_t( L"Field1" ) );
vaFieldList.Add( _variant_t( L"Field2" ) );
CSafeVariantArray vaValues;
vaValues.Add( _variant_t( L"aaa" ) );
vaValues.Add( _variant_t( L"bbb" ) );
// 1レコード目
rs->AddNew( (LPVARIANT)vaFieldList, (LPVARIANT)vaValues );
vaValues.RemoveAll();
vaValues.Add( _variant_t( L"CCC" ) );
vaValues.Add( _variant_t( L"DDD" ) );
// 2レコード目
rs->AddNew( (LPVARIANT)vaFieldList, (LPVARIANT)vaValues );
rs->MoveFirst();
long i = 0;
long nFields = rs->GetFields()->GetCount();
// 項目名
for ( i = 0; i < nFields; i++ )
{
_bstr_t vName;
_variant_t vValue;
vName = rs->GetFields()->GetItem(i)->GetName();
_tprintf( _T("%s\t"), (LPCTSTR)vName );
}
_tprintf( _T("\n") );
_tprintf( _T("-------------------------------------------------\n") );
// レコード表示
while ( !rs->GetBOF() && !rs->GetadoEOF() )
{
for ( i = 0; i < nFields; i++ )
{
_variant_t vValue;
vValue = rs->GetFields()->GetItem(i)->GetValue();
_tprintf( _T("[%s]\t"), (LPCTSTR)(_bstr_t)vValue );
}
_tprintf( _T("\n") );
rs->MoveNext();
}
rs->Close();
}
catch ( _com_error& e )
{
_tprintf( _T("e.Description = [%s]\n"), (LPCTSTR)e.Description() );
return;
}
catch ( ... )
{
_tprintf( _T("Fatal Error!\n") );
return;
}
CoUninitialize();
}
int main( int argc, char* argv[] )
{
FieldsAppendTest();
return 0;
}
#end
文字列の配列として COleSafeArray を使うのが味噌らしい。
- Visual C++ での ADO プログラミング
- 「バリアント型 (Variant) 配列の使用」
Visual Basic では、バリアント型 (Variant) 配列は Dim ステー
トメントを使ってコーディングします。または、次のコード例にも
あるように Array 関数を使うこともできます。
Public Sub ArrayOfVariants
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
cn.Open "DSN=pubs", "sa", ""
rs = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, "authors", Empty))
For Each fld in rs.Fields
Debug.Print "Name = "; fld.Name
Next fld
rs.Close
cn.Close
End Sub
次の Visual C++ の例では、_variant_t に使う SafeArray の使用方法を示します。
注意 次の注意事項は、コード例のコメント部分に対応しています。
1. もう一度、TESTHR() インライン関数を定義して、既存のエラー処理機能を利用します。
2. 必要なのは一次元配列のみであり、汎用の SAFEARRAYBOUND 宣
言と SafeArrayCreate 関数の代わりに
SafeArrayCreateVector が使えます。次の例は、
SafeArrayCreate を使ったときのコードを示します。
SAFEARRAYBOUND sabound[1];
sabound[0].lLbound = 0;
sabound[0].cElements = 4;
pSa = SafeArrayCreate(VT_VARIANT, 1, sabound);
3. 列挙定数 adSchemaColumns で識別したスキーマは、4 つの定数
列 (TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、および
COLUMN_NAME) に関連付けられています。
したがって、4 つの要素を持つバリアント型 (Variant) の値の
配列が作成されます。
次に、3 番目の列 TABLE_NAME に対応する制約値を指定します。
返される Recordset は、さまざまな列で構成されています。こ
のサブセットが制約列です。各戻り行に対する制約列の値は、
対応する制約値と同じにします。
4. SafeArrays に慣れていると、終了前に SafeArrayDestroy() が
呼び出されないことに驚かれるかもしれません。実際、このと
きに SafeArrayDestroy() を呼び出すと実行時例外処理になり
ます。これは、_variant_t が範囲外になると SafeArray が解
除されて、vtCriteria のデストラクタが VariantClear() を呼
び出すためです。手動で _variant_t を消去せずに
SafeArrayDestroy を呼び出すと、デストラクタは無効な
SafeArray ポインタを消去しようとします。
SafeArrayDestroy を呼び出すと、次のようなコードになります。
TESTHR(SafeArrayDestroy(pSa));
vtCriteria.vt = VT_EMPTY;
vtCriteria.parray = NULL;
ただし、_variant_t で SafeArray を管理する方がずっと簡単です。
#code c++
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
// Note 1
inline void TESTHR( HRESULT _hr )
{
if FAILED(_hr)
{
_com_issue_error(_hr);
}
}
void main(void)
{
CoInitialize(NULL);
try
{
_RecordsetPtr pRs("ADODB.Recordset");
_ConnectionPtr pCn("ADODB.Connection");
_variant_t vtTableName("authors"),
vtCriteria;
long ix[1];
SAFEARRAY *pSa = NULL;
pCn->Open("DSN=pubs;User ID=sa;pwd=;Provider=MSDASQL;", "", "",
adConnectUnspecified);
// Note 2, Note 3
pSa = SafeArrayCreateVector(VT_VARIANT, 1, 4);
if (!pSa)
{
_com_issue_error(E_OUTOFMEMORY);
}
// Specify TABLE_NAME in the third array element (index of 2).
ix[0] = 2;
TESTHR(SafeArrayPutElement(pSa, ix, &vtTableName));
// There is no Variant constructor for a SafeArray, so manually set the
// type (SafeArray of Variant) and value (pointer to a SafeArray).
vtCriteria.vt = VT_ARRAY | VT_VARIANT;
vtCriteria.parray = pSa;
pRs = pCn->OpenSchema(adSchemaColumns, vtCriteria, vtMissing);
long limit = pRs->GetFields()->Count;
for (long x = 0; x < limit; x++)
{
printf("%d: %s\n", x+1, ((char*) pRs->GetFields()->Item[x]->Name));
}
// Note 4
pRs->Close();
pCn->Close();
}
catch (_com_error &e)
{
printf("Error:\n");
printf("Code = %08lx\n", e.Error());
printf("Code meaning = %s\n", (char*) e.ErrorMessage());
printf("Source = %s\n", (char*) e.Source());
printf("Description = %s\n", (char*) e.Description());
}
CoUninitialize();
}
#end
SafeArray 関連情報 †
INIファイルをADOレコードセットに格納する方法 †
CDOの使い方 †
VBScript.RegExpの使い方 †
Side-by-Side コンポーネントについて †
ATL/WTL に関する情報 †
ATL †
WTL †
その他 †
DLLの作り方 †
- 簡単なDLLサンプル
- [MS] [INFO] DLL とは
- 共有DLLの使い方
サービスの作り方 †
- EZ-NET 研究室: ATL でサービスプログラムを作ってみる
- ATL サービス
- Windowsサービスの覚書
- Win32(NT)プログラミングノウハウ集
- Win32サービス・サービス構成機能・サービスプログラム
- Windows NT サービスの作り方
- Creating a Windows NT/Windows 2000 Service
- Beginner's introductory guide to writing,installing,starting,stopping NT services - System
- An Introduction to NT Services
ホワイトペーパー †
- [MS] Windows XP 環境への既存アプリケーションの移行
- [MS] "Designed for Windows XP" ソフトウェアのテスト概要
- [MS] "Designed for Windows XP" アプリケーション仕様書 2.3 日本語版
- [MS] Microsoft Windows Server 2003 アプリケーション仕様書
- [MS] "Designed for Windows XP" アプリケーションのテスト フレームワーク 1.1.1 日本語版
- [MS] ソフトウェア用 Windows ロゴ プログラム
- [MS] アプリケーションの Windows 2000 互換性テスト
- [MS] Windows Server 2003 Managing System Services
デザインパターン †
- C++で読むデザインパターン(Design Patterns read by C++)
- C++ クラス設計に関するノート
- オブジェクト指向におけるデザインパターン
アクセシビリティ †
UI(ユーザーインターフェイス) †
コンパイルオプション †
- マクロを展開する方法
- コンパイルオプションで「/P」を指定するとプリプロセスの処理結果が「*.i」というファイルに保存される。
cl test.cpp /P
コマンドラインからのビルド †
インテリセンス †
コンソールアプリでリソースファイルを利用する方法 †
#code c++
#include "resource.h"
#include "afxres.h"
STRINGTABLE DISCARDABLE
BEGIN
IDS_TEST "Resource File Test [%s]"
END
#end
#code c++
#define IDS_TEST 1000
#end
#code c++
#include <afx.h>
#include "resource.h"
int main( int argc, char* argv[] )
{
CString strData;
strData.Format( IDS_TEST, _T("aaa") );
_tprintf( _T("strData = [%s]\n"), (LPCTSTR)strData );
return 0;
}
#end
ドキュメント自動生成 †
セキュアプログラミング †
暗号化 †
Crypto API †
- MSDN ライブラリ 2001年10月
[Platform SDK ドキュメント]
+-[Security]
+-[Cryptography]
+-[CryptoAPI]
+-[About CryptoAPI]
+-[Using CryptoAPI]
+-[CryptoAPI Reference]
- MSDN ライブラリ 2004年 4月
[Security (英語)]
+-[Security (General)]
+-[SDK Documentation]
+-[Cryptography]
+-[About Cryptography]
+-[Using Cryptography]
+-[Cryptography Reference]
- 使い方
<暗号化処理の初期化>
1. デフォルトキーコンテナの取得。
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0)
2. デフォルトキーコンテナの作成(1. の処理に失敗した場合)
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)
<暗号化処理>
1. デフォルトキーコンテナの取得。
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0)
2. ハッシュオブジェクトの作成。
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)
3. パスワード文字列のハッシュの取得。
CryptHashData(hHash, (BYTE*)szPassword, dwLength, 0)
4. パスワードのハッシュを元にセッションキーを作成。
CryptDeriveKey( hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey)
5. 暗号化処理。
CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength )
6. セッションキーの削除
CryptDestroyKey(hKey)
7. ハッシュオブジェクトの削除。
CryptDestroyHash(hHash);
7. ハッシュオブジェクトの削除。
CryptDestroyHash(hHash)
8. キーコンテナの解放
CryptReleaseContext(hProv, 0)
<復号化処理>
1. デフォルトキーコンテナの取得。
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0)
2. ハッシュオブジェクトの作成。
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)
3. パスワード文字列のハッシュの取得。
CryptHashData(hHash, (BYTE*)szPassword, dwLength, 0)
4. パスワードのハッシュを元にセッションキーを作成。
CryptDeriveKey( hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey)
5. 暗号化処理。
CryptDecrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength )
6. セッションキーの削除
CryptDestroyKey(hKey)
7. ハッシュオブジェクトの削除。
CryptDestroyHash(hHash)
8. キーコンテナの解放
CryptReleaseContext(hProv, 0)
CAPICOM †
DPAPI †
その他 †
アセンブラ †
Windowsハック †
アクセシビリティ †
コモンダイアログに関する情報 †
サーバー一覧の取得 †
- Microsoft ネットワークを解剖する第3回「ブラウジング機能」
MSDN †
PocketPC †