mcrblog

vcpp-ml

2003年07月

31

[vcpp 00061019] Re: メモリマップトファイルでマッピング済みの領域の拡張

おはよございます。
またはずしましたか・・・(^^;

> 元メールのように、後から強引に伸ばしたマッピングエリアに対しても
> ほかのマッピングと共有している部分(メールの例では先頭100バイト)
> に関しては(きっちり排他処理を行っていれば)
> 通常のマッピングと同様に読み書きができて、メモリ共有手段としても
> 扱えるのか?
> ということだったのですが。。。
なるほど。

たとえば、普通にオープンするファイルだった場合に他のプロセスがファ
イルのサイズを変えると、別のオープン済みのプロセスは変化したサイズ
までファイルポインタをシークできるはずですよね。
これと同じようなメカニズムではないでしょうか?
ファイルマッピングオブジェクトとはいえ、プログラムから直接ファイル
にアクセスするのではなく、OS内部のキャッシュが実施されているはずで
す。なので、一方のプロセスではたぶん範囲外だろうあたりのオフセット
を指定されてもキャッシュ更新時に同期を取るだろうから、ご要望のこと
はOSとして「できなければならない」ことではないかと。

> うーむ。
> ページファイルではだめだった私のサンプルがおかしいかのせいもあるので
> また、ちょっと調べてみます。
なるほど。第一引数NULLだったらうまくいかなかったということですね?
この場合、ファイルとしてというより共有メモリとしての機能ですし、
うまくいくと思うんだけどなぁ・・・

増殖させる大きさをOSのキャッシュサイズより大きくしたりして実験すると
可・不可の判断ができるような気がしますが・・・σ(^_^)はできると思いま
すね。
#時間がないのでテストできませんが・・・

Win32だと、ネットワーク越えのプロセス間では保証していないとかいう
ことがどこかに書いてあったような・・・あれは別の話だったかな・・・
(遠い目)

是非結果を教えてくださいませ。
#でもって、σ(^_^)が間違っていた場合は、ごめんなさい。(^^;
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Y.Uchiyama _/_/
_/private:
_/  HANDLE ゆーち;
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
30

[vcpp 00061018] Re: メモリマップトファイルでマッピング済みの領域の拡張

Suzukiです。
こんばんわ。
お返事ありがとうございます!

> おはようございます。
> ゆーち@ちょっとだけです。

> 質問1についてですが、
> > ・共通部分である先頭100バイトA-B間でのデータ共有
> > は保証されるのでしょうか?
> これは、自責で同期を取らなければならないはずです。
> 名前付きのミューテクスを用意するとか。

共有リソースへの書き込みを排他しなくてはならないのは、
ご指摘のとおり、ごもっともだと思います。

ただ、(私の記述の仕方がよくなかったのですが)、
聞きたかったのは、
元メールのように、後から強引に伸ばしたマッピングエリアに対しても
ほかのマッピングと共有している部分(メールの例では先頭100バイト)
に関しては(きっちり排他処理を行っていれば)
通常のマッピングと同様に読み書きができて、メモリ共有手段としても
扱えるのか?
ということだったのですが。。。

> それだけ守れば、第一引数の区別に違いはないとおもうのですが・・・。

これは、「ノーマルファイルでもページファイルでも
あとから大きなサイズでマッピングしちゃっても大丈夫」
(つまり私の質問1,2ともにOK)
ということでしょうか?

うーむ。
ページファイルではだめだった私のサンプルがおかしいかのせいもあるので
また、ちょっと調べてみます。

> #最近Win32から離れてます。間違っていたらすみません。m(_._)m

いえいえ。参考になります。
なにかまたお気づきの点がございましたら、ご指摘ください。

#しかし、動的に増えるメモリ領域の共有ってみんなどうやってるのでしょうか?
 ほかにいい方法があったら、どなたか教えてください。
 よろしくお願いします。
30

[vcpp 00061017] RE: #import を使用して Access2002 を利用する方法について

 渋木です。

> >  ACCESS をオートメーションスルだけなら、MSACC.OLB だけを #import す

> だ
> > けで事足ります。
>
> 最初「MSACC.OLB」だけを #import してみましたが、
> 以下のようなエラーが発生してしまいコンパイルが通りませんでした。

 今試してみましたが、その通りですね。。。
 前からこんなに大変だったかな?;-p

 とりあえず #import は手ごわそうなので、ClassWizard から

[クラスの追加]→[タイプライブラリから]

 でラッパクラスを作らせたら、すんなりコンパイルが通りました。

 コンパイラ COM サポートよりはレガシな方法ですが、コレでは駄目でしょう
か?


--
// 渋木宏明 (Hiroaki SHIBUKI)
// mailto:h...@mbi.nifty.com
// http://www.hidori.jp/
// Microsoft MVP 2002-2003 of Windows
30

[vcpp 00061016] RE: #import を使用して Access2002 を利用する方法について

島野です。お世話になります。

> でも、それ以前の問題のような気がします。

なぜそのようにしたのか、経緯を説明いたします。

>  ACCESS をオートメーションスルだけなら、MSACC.OLB だけを #import するだ
> けで事足ります。

最初「MSACC.OLB」だけを #import してみましたが、
以下のようなエラーが発生してしまいコンパイルが通りませんでした。
----------------------------------------------------------------------
#import "C:\Program Files\Microsoft Office\Office10\MSACC.OLB" 

d:\xxx\msacc.tlh(2307) : error C2504: 'Property' : 定義されていない基本クラスが宣言されています。

struct __declspec(uuid("331fdd00-cf31-11cd-8701-00aa003f0f07"))
_AccessProperty : Property ← ここでエラー
{
   :
};
----------------------------------------------------------------------

次に「MSACC.tlh」ファイルを参照してみると、
「Cross-referenced type libraries」とあり、
いくつかのタイプライブラリが列挙されていました。
----------------------------------------------------------------------
// C++ source equivalent of Win32 type library C:\Program Files\Microsoft Office\Office10\MSACC.OLB
// compiler-generated file created 07/30/03 at 13:28:26 - DO NOT EDIT!

//
// Cross-referenced type libraries:
//
//  #import "C:\Program Files\Common Files\system\ado\msado25.tlb"
//  #import "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"
//  #import "C:\Program Files\Common Files\Microsoft Shared\Office10\MSO.DLL"
//  #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
//  #import "C:\Program Files\Common Files\Microsoft Shared\Web Components\10\OWC10.DLL"
----------------------------------------------------------------------
恐らく、これらのタイプライブラリを事前に #import しないと
基本クラスのヘッダファイルが生成されない為、
「MSACC.tlh」のコンパイルでエラーになるのだと考えました。

この為、上記のタイプライブラリを #import してみました。

>  どうして ADO やら DAO まで #import してるのでしょう?
>  本当にそんなに必要なんでしょうか?

ADO や DAO を #import しているのはこの為です。
本当は Web Components 等も、いらないのですが、
コンパイルが通らないので #import しています。

しかし、今度は「OWC10.DLL」でエラーが発生してしましました。
同様に「OWC10.tlh」ファイルを参照すると、
----------------------------------------------------------------------
// C++ source equivalent of Win32 type library C:\Program Files\Common Files\Microsoft Shared\Web Components\10\OWC10.DLL
// compiler-generated file created 07/30/03 at 13:54:35 - DO NOT EDIT!

//
// Cross-referenced type libraries:
//
//  #import "C:\WINDOWS\System32\msdatsrc.tlb"
//  #import "C:\WINDOWS\System32\MSCOMCTL.OCX"
//  #import "C:\Program Files\Common Files\system\ado\msado21.tlb"
----------------------------------------------------------------------
とありました。

今度は、ADO 2.1 を参照しているようです。

仕方ないので、MSADO25.TLB と MSADO21.TLB を #import してみましたが、
以下のようなのエラーが発生してしましました。
----------------------------------------------------------------------
d:\xxx\msado21.tlh(41) : error C2367: '_Recordset' : 再定義; 異なる uuid 指定子です。

struct __declspec(uuid("00000555-0000-0010-8000-00aa006d2ea4"))
/* dual interface */ _Recordset;
----------------------------------------------------------------------
# 微妙に UUID が違う為?
# <MSADO25.TLB>
# struct __declspec(uuid("00000556-0000-0010-8000-00aa006d2ea4"))
# /* dual interface */ _Recordset;
#
# <MSADO21.TLB>
# struct __declspec(uuid("00000555-0000-0010-8000-00aa006d2ea4"))
# /* dual interface */ _Recordset;

> 通常、新しい方だけ #import すれば十分だと思うのですが。。。

試しに「MSADO25.TLB」だけを #import するように変更してみましたが、
----------------------------------------------------------------------
d:\xxx\owc10.tlh(3468) : error C2146: 構文エラー : ';' が、識別子 'Recordset' の前に必要です。

    __declspec(property(get=GetRecordset))
    _RecordsetPtr Recordset;
----------------------------------------------------------------------
となり、コンパイルが通りませんでした。

# <MSADO25.TLB>
# _COM_SMARTPTR_TYPEDEF(_Recordset, __uuidof(_Recordset));
# とあるので、大丈夫だとは思ったのですが・・・。

そして、色々と試行錯誤した結果、rename("ADODB", "ADODB25") とすることで、
なんとかコンパイルを通すことはできました。

以上が経緯です。

しかし、付け焼刃的な方法ですので、この方法が本当にあっているか
自身がありません。

もしかしたら #import ディレクティブの指定で何かオプション(属性)を
指定してあげれば「MSACC.OLB」だけで済むのかもしれません。

Microsoft のサイトもしくは MSDN Library に
「VC++6.0 で #import を使用して Access 2002 を利用する方法」
というような例題が載っていれば良いのですが、残念ながら
見つけることができませんでした。

以上
--
30

[vcpp 00061015] RE: #import を使用して Access2002 を利用する方法について

 渋木です。

> Access 2002 のタイプライブラリは「MSACC.OLB」とのことでしたので、
> 「MSACC.OLB」が依存するタイプライブラリを #import してみました。

 ACCESS をオートメーションスルだけなら、MSACC.OLB だけを #import するだ
けで事足ります。

 どうして ADO やら DAO まで #import してるのでしょう?
 本当にそんなに必要なんでしょうか?

> しかし、途中で、ADO 2.1 と ADO 2.5 のオブジェクト名がバッティングする
> ようで、エラーが出てしまいました。

 これも謎です。
 ADO 2.5 と ADO 2.1 を同時に #import する理由が分かりません。

 通常、新しい方だけ #import すれば十分だと思うのですが。。。

> 一応、rename("ADODB", "ADODB25") として、回避させましたが、
> 本当にこのような対応方法でよいのでしょうか?

 名前が衝突するなら仕方ないですね。
 でも、それ以前の問題のような気がします。


--
// 渋木宏明 (Hiroaki SHIBUKI)
// mailto:h...@mbi.nifty.com
// http://www.hidori.jp/
// Microsoft MVP 2002-2003 of Windows
記事検索
Amazon.co.jp
  • ライブドアブログ