お世話になっています。かまたです。
【開発環境】
Visual C++ 2005(App、DLLとも)
【状況】
上記開発環境でアプリケーションとDLLを並行して作成しています。
以下の問題が有り困っています。
1.アプリケーションとDLLで共通してインクルードするヘッダ内で
以下のような構造体を定義しました。
value struct TIME_GAP{
BYTE nHigh;
BYTE nMiddle;
BYTE nLow;
};
2.DLLのPublic関数として以下の様な関数を定義、実装しました。
array <TIME_GAP>^ GetSurfaceTimeGapData();
3.DLLをコンパイルすると
warning C4677: 'GetSurfaceTimeGapData': 公開されたメンバのシグネチャは
アセンブリ プライベート型 'TIME_GAP' を含んでいます。
4.アプリケーションをコンパイルすると
error C3767: 'GetSurfaceTimeGapData': 候補の関数はアクセス可能ではありません。
識者の方々、なにかアドバイス等あれば幸いと思います。
宜しくお願いします。
> error C3767: 'GetSurfaceTimeGapData': 候補の関数はアクセス可能ではありません。
TIME_GAPがpublicではないのでアクセスできなくて当然です。
1.TIME_GAP型をpublicにする。
2.アプリケーションはDLLのプロジェクトを参照する(ヘッダのインクルードは不要)
を試してみてください。
かまたです。
返信誠に有り難うございます。
早速試してみたところsubaruさんの方法でうまくいきました。
ただ、知識不足で申し訳ないのですが『プロジェクトを参照する』の意味を
少しだけご教授願えれば幸いです。
とりあえず、アプリ側で共通ヘッダをインクルードしないようにした際、
#define、enumされている値も読めなくなったためコンパイルが通らなくなりました。
そこで共通ヘッダから構造体の部分だけを抜いて(DLLのヘッダに移して)、
アプリ側で元の様にインクルードするようにしました。
うまくいきました。
#define、enumの値は『プロジェクトを参照する』では参照できないのですね。
いまいち『プロジェクトを参照する』の意味が理解できません。
大変お手数かと思いますが、ざっくりとでいいのでご教授願えれば幸いと思います。
宜しくお願いします。
私もDLL内の定義を参照しているという程度にしか思っていませんが
#defineはプリプロセッサへの指示なので見えないと思います。
enumについてはenum class に変更すると参照できましたが、
C#のプロジェクトからだとなぜかenumでもenum classでも
参照できたのでよくわかりません。
単純に構造体として使用する。
### XXX::GetSurfaceTimeGapData(TIME_GAP *m_TIME_GAP)
{
...... 処理
}
ではだめですか?
どうしても<array>として使いたいのなら話は別ですが。
>subaruさん
返信遅れましたが、解説有り難うございます。
>ITOさん
レス有り難うございます。
ただ、説明しにくいのですがApp側で
どうしてもarrayとして使用したいため
subaruさんの方法を取らせていただきました。
今回は本当に有り難うございました。
また、お世話になるかもしれませんが
何卒宜しくお願いいたします。