Lib操作関連の質問 – プログラミング – Home

通知
すべてクリア

[解決済] Lib操作関連の質問


ぱら
 ぱら
(@ぱら)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

以前作られたソースを解析中ですが、
読んでも分からないです、困っています。

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


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 24年前
投稿: 468
 

>最初の 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
でしょう。


返信引用
ぱら
 ぱら
(@ぱら)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

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を読んでも、全然ヒントを
得られないです。ちなみに、英語は下手です(笑)。
差し支えなければ、これらの関数の意味合いを教えていただけませんか。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 24年前
投稿: 468
 

>ちなみに、英語は下手です(笑)。
えー、この一言を楯に「全文訳してちょ」と言ってるわけでしょうか? 「Comments」の欄
に説明は書いています。少しは自助努力をお願いします。

こう解釈したけど正しいか?とか、この「xxx」という単語が理解できないとか、その程
度の質問に砕く位はやってみましょうよ。

もちろん、「これはこれで『ひとかたまりのソース』。各文がどうあれこれで
IRecordInfoを取ってこれるんだ」と、おまじない的に覚えてしまうのもアリですが。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

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 プログラミング」にらしいこと書いてあるように思えます


返信引用
ぱら
 ぱら
(@ぱら)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

wood さん、tibさん、ありがとう。
返事が遅くなってすみませんでした。
(実は会社にてインターネット接続は一時できなくなってしまいました)

>質問の内容見ると、自分または、自分の知人が作成したものではないのですね
>もしMSDNのサンプルの一部ならサンプル名称をあげてください
実は今解析中のものは、以前に別の会社(どこの会社は知りませんが)が作ったもので、
単体テストが終わった段階で、お客さんに回収されてしまいました、どういうことなのか
わかりません。今、お客さんが内の会社に開発を依頼しています。

>自分のものでは無いどこかのサンプルだとして?
>これってCOMから呼ばれるDLLのサンプルソースではないのでしょうか
>「OLE DB」などのサンプルでは、ないのですか
上位の部分はCOMかどうか分かりませんが、DLLの方がODBCの処理です。

>「Visual C++ での ADO プログラミング」にらしいこと書いてあるように思えます
ADO のプログラミング手法とODBCのプログラミング手法は似ていますか?
ちなみに、MSDN以外には参考になるものがご存知なら教えていただきませんか
(本とか、サイトとか)?

ありがとうございます。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

>ちなみに、MSDN以外には参考になるものがご存知なら教えていただきませんか

日系BP発行 定価4,500円 

3週間完全マスター
Visual C++ 6.0
データベース編
 
こんな本あるよ            


返信引用
ぱら
 ぱら
(@ぱら)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

こんな本があるのか、知りませんでした。
買って読みます。

wood さん、ありがとうございました。

一応解決とします。

また、よろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました