DLLと構造体 – プログラミング – Home

通知
すべてクリア

[解決済] DLLと構造体


かまた
 かまた
(@かまた)
ゲスト
結合: 17年前
投稿: 14
Topic starter  

お世話になっています。かまたです。

【開発環境】
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': 候補の関数はアクセス可能ではありません。

識者の方々、なにかアドバイス等あれば幸いと思います。
宜しくお願いします。


引用未解決
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

> error C3767: 'GetSurfaceTimeGapData': 候補の関数はアクセス可能ではありません。

TIME_GAPがpublicではないのでアクセスできなくて当然です。

1.TIME_GAP型をpublicにする。
2.アプリケーションはDLLのプロジェクトを参照する(ヘッダのインクルードは不要)
を試してみてください。


返信引用
かまた
 かまた
(@かまた)
ゲスト
結合: 17年前
投稿: 14
Topic starter  

かまたです。

返信誠に有り難うございます。
早速試してみたところsubaruさんの方法でうまくいきました。

ただ、知識不足で申し訳ないのですが『プロジェクトを参照する』の意味を
少しだけご教授願えれば幸いです。

とりあえず、アプリ側で共通ヘッダをインクルードしないようにした際、
#define、enumされている値も読めなくなったためコンパイルが通らなくなりました。
そこで共通ヘッダから構造体の部分だけを抜いて(DLLのヘッダに移して)、
アプリ側で元の様にインクルードするようにしました。
うまくいきました。

#define、enumの値は『プロジェクトを参照する』では参照できないのですね。
いまいち『プロジェクトを参照する』の意味が理解できません。
大変お手数かと思いますが、ざっくりとでいいのでご教授願えれば幸いと思います。

宜しくお願いします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

私もDLL内の定義を参照しているという程度にしか思っていませんが
#defineはプリプロセッサへの指示なので見えないと思います。
enumについてはenum class に変更すると参照できましたが、
C#のプロジェクトからだとなぜかenumでもenum classでも
参照できたのでよくわかりません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

単純に構造体として使用する。
### XXX::GetSurfaceTimeGapData(TIME_GAP *m_TIME_GAP)
{
...... 処理
}
ではだめですか?
どうしても<array>として使いたいのなら話は別ですが。


返信引用
かまた
 かまた
(@かまた)
ゲスト
結合: 17年前
投稿: 14
Topic starter  

>subaruさん

返信遅れましたが、解説有り難うございます。

>ITOさん

レス有り難うございます。
ただ、説明しにくいのですがApp側で
どうしてもarrayとして使用したいため
subaruさんの方法を取らせていただきました。

今回は本当に有り難うございました。
また、お世話になるかもしれませんが
何卒宜しくお願いいたします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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