以前作られたソースを解析中ですが、
読んでも分からないです、困っています。
int CDataView::GetDataList( ...)
{
AFX_MANAGE_STATE( AfxGetStaticModuleState())
HRESULT hr;
// Fetch the IRecordInfo interface describing the UDT
ITypeLib *pTypelib = NULL;
ITypeInfo *pTypeInfo = NULL;
IRecordInfo *pRecInfo = NULL;
hr = LoadRegTypeLib( LIBID_DATAVIEWCOMLib, 1, 0, GetUserDefaultLCID(),
&pTypelib);
_ASSERT(SUCCEEDED(hr) && pTypelib);
hr = pTypelib->GetTypeInfoOfGuid( __uuidof(DATA_LIST), &pTypeInfo);
_ASSERT(SUCCEEDED(hr) && pTypeInfo);
hr = GetRecordInfoFromTypeInfo( pTypeInfo, &pRecInfo);
_ASSERT(SUCCEEDED(hr) && pRecInfo);
pTypeInfo->Release();
pTypelib->Release();
// Create Safe Array
LPSAFEARRAY psa = NULL;
DATA_LIST * lpDATA_LIST = NULL;
psa = SafeArrayCreateVectorEx( VT_RECORD, 0, 100, pRecInfo);
hr = SafeArrayAccessData( psa, (void HUGEP**)&lpDATA_LIST);
...
SafeArrayUnaccessData( psa);
}
その内、
1.LPSAFEARRAY は SAFEARRAY へのポインタです。
2.LIBID_DATAVIEWCOMLib はロードされるライブラリの GUID です。
3.lpDATA_LIST は 構造体 DATA_LIST へのポインタです。
4.上述のコードはDLLのメンバー関数の一つです。
質問:
1.最初の AFX_MANAGE_STATE( AfxGetStaticModuleState()) は
何の処理ですか?実行しないと、何のエラーとかが起こるんですか?
2.以降のコードは何のための処理でしょうか?
MSDNを読んでも、さっぱり分かりません。
分かる方がいらっしゃったら、
少し分かりやすく教えていただきませんか。
開発環境:
OS:Win2000
言語:VC++6.0 SP5
>最初の AFX_MANAGE_STATE( AfxGetStaticModuleState()) は
>何の処理ですか?
MSDNには
DLL のエクスポートされた関数を保護します。このマクロが起動されると、pModuleState
は直接保持しているスコープにとどまる限り有効なモジュール状態になっています。ス
コープから離れると、直前の有効なモジュール状態に自動的に戻ります。
AFX_MODULE_STATE 構造体には、モジュールのグローバル データ、つまり、モジュール状
態のうちプッシュまたはポップされた部分が含まれます。
デフォルトでは、MFC はメイン アプリケーションのリソース ハンドルを使用して、リ
ソース テンプレートをロードします。DLL でダイアログ ボックスを起動する場合のよう
に、DLL でエクスポートされた関数がある場合、このテンプレートは DLL モジュールに
保存されます。適切なハンドルを使用するには、モジュール状態を切り替える必要があり
ます。関数のはじめに以下のコードを追加することによって、切り替えを実行することが
できます。
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
...とありますがこの文章のどこが解らないのでしょう?
>実行しないと、何のエラーとかが起こるんですか?
実際にやってみる、という方法もありますよ。
>以降のコードは何のための処理でしょうか?
// Fetch the IRecordInfo interface describing the UDT
でしょう。
tibさん、ご返事ありがとうございます。
色々と調べたり勉強したりした結果、
モジュールの最初にAFX_MANAGE_STATE( AfxGetStaticModuleState()) が
追加されることから、このDLLの種類は「MFCの共用 DLL」だと分かりました。
そして、実際にこのタイプで DLL プロジェクト(名前はD1とします)を作成
した後、D1.cppを開いて見たら、次のコメントがありました。
。。。
。。。
// メモ!
//
// この DLL が MFC DLL に対して動的にリンクされる場合、
// MFC 内で呼び出されるこの DLL からエクスポートされた
// どの関数も関数の最初に追加される AFX_MANAGE_STATE
// マクロを含んでいなければなりません。
//
// 例:
//
// extern C BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 通常関数の本体はこの位置にあります
// }
//
// このマクロが各関数に含まれていること、MFC 内の
// どの呼び出しより優先することは非常に重要です。
// これは関数内の最初のステートメントでなければな
// らないことを意味します、コンストラクタが MFC
// DLL 内への呼び出しを行う可能性があるので、オブ
// ジェクト変数の宣言よりも前でなければなりません。
。。。
。。。
結局、2点が分かりました。
1.この DLLは 「MFCの共用 DLL」です。
2.「MFCの共用 DLL」の場合は、エクスポートされる
関数内の最初に必ずこのマクロを入れなければ
ならないっていうこと。
>実際にやってみる、という方法もありますよ。
そうですね、あのマクロを外してやってみます。
>以降のコードは何のための処理でしょうか?
// Fetch the IRecordInfo interface describing the UDT
でしょう。
① hr = LoadRegTypeLib( LIBID_DATAVIEWCOMLib, 1, 0, GetUserDefaultLCID(),
&pTypelib);
② hr = pTypelib->GetTypeInfoOfGuid( __uuidof(DATA_LIST), &pTypeInfo);
③ hr = GetRecordInfoFromTypeInfo( pTypeInfo, &pRecInfo);
④ psa = SafeArrayCreateVectorEx( VT_RECORD, 0, 100, pRecInfo);
⑤ hr = SafeArrayAccessData( psa, (void HUGEP**)&lpDATA_LIST);
これら①~⑤の関数はそれぞれ何の処理なのかMSDNを読んでも、全然ヒントを
得られないです。ちなみに、英語は下手です(笑)。
差し支えなければ、これらの関数の意味合いを教えていただけませんか。
>ちなみに、英語は下手です(笑)。
えー、この一言を楯に「全文訳してちょ」と言ってるわけでしょうか? 「Comments」の欄
に説明は書いています。少しは自助努力をお願いします。
こう解釈したけど正しいか?とか、この「xxx」という単語が理解できないとか、その程
度の質問に砕く位はやってみましょうよ。
もちろん、「これはこれで『ひとかたまりのソース』。各文がどうあれこれで
IRecordInfoを取ってこれるんだ」と、おまじない的に覚えてしまうのもアリですが。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010035.txt
こちら「解決 済」にしてください
同じ質問2つあるなんて~ 書いちゃったじゃない!
(再掲載)
逆質問させてください
>以前作られたソースを解析中ですが、 ....
質問の内容見ると、自分または、自分の知人が作成したものではないのですね
もしMSDNのサンプルの一部ならサンプル名称をあげてください
>質問:
>1.最初の AFX_MANAGE_STATE( AfxGetStaticModuleState()) は
> 何の処理ですか?実行しないと、何のエラーとかが起こるんですか?
MSDNより
・AFX_MANAGE_STATE
DLL のエクスポートされた関数を保護します。このマクロが起動されると、
pModuleState は直接保持しているスコープにとどまる限り有効なモジュール状態に
なっています。スコープから離れると、直前の有効なモジュール状態に自動的に戻
ります。
・
・
これによって、カレント スコープの終わりまで、カレント モジュールの状態と
AfxGetStaticModuleState から返された状態が入れ替わります。
・AfxGetStaticModuleState
クリア後、初期化や以前のモジュール状態を復元する前に、モジュール状態を設定
するために、この関数を呼び出します。
これのどの部分が良くわからないのでしょうか
----------------------------------------------------------------------------
なんか ある程度わかったみたいだけど、あなたに取って次の方が重要だと思います
>2.以降のコードは何のための処理でしょうか?
自分のものでは無いどこかのサンプルだとして?
これってCOMから呼ばれるDLLのサンプルソースではないのでしょうか
「OLE DB」などのサンプルでは、ないのですか
回答書きながら「MSDN」見てますけど
「Visual C++ での ADO プログラミング」にらしいこと書いてあるように思えます
wood さん、tibさん、ありがとう。
返事が遅くなってすみませんでした。
(実は会社にてインターネット接続は一時できなくなってしまいました)
>質問の内容見ると、自分または、自分の知人が作成したものではないのですね
>もしMSDNのサンプルの一部ならサンプル名称をあげてください
実は今解析中のものは、以前に別の会社(どこの会社は知りませんが)が作ったもので、
単体テストが終わった段階で、お客さんに回収されてしまいました、どういうことなのか
わかりません。今、お客さんが内の会社に開発を依頼しています。
>自分のものでは無いどこかのサンプルだとして?
>これってCOMから呼ばれるDLLのサンプルソースではないのでしょうか
>「OLE DB」などのサンプルでは、ないのですか
上位の部分はCOMかどうか分かりませんが、DLLの方がODBCの処理です。
>「Visual C++ での ADO プログラミング」にらしいこと書いてあるように思えます
ADO のプログラミング手法とODBCのプログラミング手法は似ていますか?
ちなみに、MSDN以外には参考になるものがご存知なら教えていただきませんか
(本とか、サイトとか)?
ありがとうございます。
>ちなみに、MSDN以外には参考になるものがご存知なら教えていただきませんか
日系BP発行 定価4,500円
3週間完全マスター
Visual C++ 6.0
データベース編
こんな本あるよ
こんな本があるのか、知りませんでした。
買って読みます。
wood さん、ありがとうございました。
一応解決とします。
また、よろしくお願いします。
