none
DLL外からネイティブ型のプロパティへアクセスできない @ C++/CLI RRS feed

  • 質問

  • お世話になります。

    今回は一応自己解決している問題なのですが、それが正攻法なのか少し不安でしたので、是非ご意見を伺わせて頂きたいと思いました。

    以下のような ネイティブ ポインタ型 のプロパティを持つクラスを DLL化 して、他のプロジェクトから"参照"したのですが、

    ▼ 「クラスライブラリ」プロジェクト
    ▽ AAA.h
    #pragma once
    #pragma comment( lib, "user32.lib" )
    #include < windows.h >  
    namespace AAA
    {  
        public ref class TAAA
        {
        private:
            HDC _HandleDC;
        public:
            property HDC HandleDC { HDC get(){ return _HandleDC; } }
        }; 
    }
    ▽ AAA.cpp
    #include "stdafx.h"    
    #include "AAA.h"
    

    いざクラスをインスタンス化して プロパティ HandleDC を呼ぼうとすると、

    error C3767: 'AAA::TAAA::HandleDC::get': 候補の関数はアクセス可能ではありません。
    

    というエラーが返されてしまいます。

    このことは、ネイティブ型のプロパティを持つプロパティやメソッドは、たとえ public にあろうとも、スコープはDLL外へ及ばない、と理解してよろしいのでしょうか?

    そこで、マネージドなポインタ型である IntPtr 型 を使って、プロパティを以下のように定義し直し、

    property IntPtr HandleDC { IntPtr get(){ return (IntPtr)_HandleDC; } }
    

    呼び出す側でキャストし直すという解決に至ったのですが、これは正攻法なのでしょうか?

    (HDC)HandleDC.ToPointer()
    

    もっとシンプルで美しい方法などがあれば何卒ご教示下さい。



    • 編集済み luxidea 2011年9月16日 12:09
    • 種類を変更済み 山本春海 2011年9月22日 8:20 質問のほうが適切なので
    2011年9月16日 11:58

回答

  • HDC 型は .NET Framework の型ではありません。
    従って、そのような型を返すプロパティは、.NET Framework のクラスからは見ることができません。

    HDC 型もポインタの一種と定義されていますので、IntPtr 型で公開するのが妥当でしょう。

    ちなみに、Graphics.FromHdc という、HDC から Graphics を作るメソッドが .NET Framework にありますが、これは IntPtr をもらう設計になっています。
    http://msdn.microsoft.com/ja-jp/library/20tc8e3b(v=vs.80).aspx

    # ディスカッション?単に質問のような気がする。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年9月16日 14:31
    モデレータ

すべての返信

  • HDC 型は .NET Framework の型ではありません。
    従って、そのような型を返すプロパティは、.NET Framework のクラスからは見ることができません。

    HDC 型もポインタの一種と定義されていますので、IntPtr 型で公開するのが妥当でしょう。

    ちなみに、Graphics.FromHdc という、HDC から Graphics を作るメソッドが .NET Framework にありますが、これは IntPtr をもらう設計になっています。
    http://msdn.microsoft.com/ja-jp/library/20tc8e3b(v=vs.80).aspx

    # ディスカッション?単に質問のような気がする。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年9月16日 14:31
    モデレータ
  • いつもお世話になります。

    やはりそれで良かったのですね。安心しました。

    # ディスカッション?単に質問のような気がする。

    両者の位置づけに迷ったのですが、とりあえず一応解決しており、単に同意を求めたかっただけなので、質問というほどでもないかと。(^_^;)

    2011年9月16日 14:56
  • と思いましたら、ディスカッションには「回答としてのマーク」がないのですね。うかつでした。今後は無難に"質問 "にしておきます。
    2011年9月16日 15:01