問題なのは、
typedef struct { ... } PolyData2;
が、
Bdll.h と structcls_poly.h の中の二箇所にある事です。
>PolyDataGGは配列構造体です。
>クラスではありません。
失礼。構造体と読み替えていただければOK。
CStructCls_Poly.h -----------------------
CStructCls_Poly {
typedef struct {
・・・
} PolyDataGG
}
となってませんか?そうならば
CStructCls_Poly.h -----------------------
typedef struct {
・・・
} PolyDataGG
CStructCls_Poly {
// typedef struct {
// ・・・
// } PolyDataGG
}
これでOKなら
さらには、SSHさんの言われるように
PolyDataGG.h -----------------------
typedef struct {
・・・
} PolyDataGG
CStructCls_Poly.h -----------------------
#include PolyDataGG.h
CStructCls_Poly {
// typedef struct {
// ・・・
// } PolyDataGG
}
# PolyData2 と PolyDataGG ってなんでしたっけ?
# すでに、ITOさんによって指摘されてましたね。
> まさかクラス内で定義してないですよね。
>>Bdll.hで構造体を宣言してるものを
>>CStructCls_Polyに、メンバ変数として持たせたい
>>ってことですよね
>違います、そのことは前回の発言”構造体の転送”で解決しました。
今日、ggさんが載せたソースも
Bdll.hに宣言されている「PolyDataGG」という構造体を
CStructCls_Poly.hで使ってますよ
(メンバ変数なのか、グローバルなのか判別できませんが)
CStructCls_Poly.hで宣言されてる「PolyData2」は使用されてない
>今回は、ソースからある配列構造体をDLL側に転送したいのです。
これ、もう少し詳しく書いてください
ソース(EXE側?)からDLLにデータを引き渡したいのが主題なのか
どこどこに宣言された構造体を利用したいってことが主題なのか
もし後者なら、まず、構造体の宣言を複数かかないで
ggさんが、おきたい場所のみにしてみてはどうでしょうか?
SSH さん、まえださん、rinさん
>ソース(EXE側?)からDLLにデータを引き渡したいのが主題なのか
そういうことです。
>どこどこに宣言された構造体を利用したいってことが主題なのか
EXE側(CStructCls_Poly.h)の既に宣言した構造体PolyDataGGを
DLL側に利用することです。
そのために、
ITOさんからコメント:
>extern C等もしくは、__declspec(dllimport)のあるヘッダーファイルに
>入れて、両方に加える。
で、
Bdll.hに
extern C
{
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataGG;
PolyDataGG *mp_GG; // 関数定義
};
を追加しました。
皆さんは、PolyDataGGを2かっ所に宣言したといわれました。
DLL側の
DrawDLL2_DrawPloy(int a, PolyDataGG* Poly)を使っています。
問題としては、DLL側にPolyDataGG をどう認めるのですか
(要するに、ソース(EXE側?)からDLLにデータを引き渡したい)
よろしくお願いします。
その1では2点の問題がありましたよね。
-- (A) PolyData2 の定義が2つある。 -----------------
このようなメッセージがでました。その2でも同じ文言ですね。
>error C2664: 'DrawDLL2_DrawPloy' : 2 番目の引数を 'CStructCls_Poly::PolyDataGG
>*' から 'PolyDataGG *' に変換できません。 (新しい機能 ; ヘルプを参照)
その2においても、まず、YuO さんがその1 で言われたように解決してください。
つぎに
-- (B) PolyData2 のインスタンスの宣言が2箇所以上ある。----------------
(A)を解決すると、その2でも
> コンパイルのエラーメッセージ:
> error LNK2005: struct PolyDataGF2 * mp_PolySctGF2 (?
> mp_PolySctGF2@@3PAUPolyDataGF2@@A) は既に AutoTraceSample.obj
> で定義されています。
がでると思います。
「皆さんは、PolyDataGGを2かっ所に宣言したといわれました。」
のことです。
前回の質問への回答がきちんと理解できていない様に感じます。
コンパイルのエラーを取ると言う部分に注意が集中しすぎていて
何が悪いのかと言う部分が置き去りなっていないかなぁ。
C++を使っていてそういうエラーが出る原因が何なのかと言う部分を
もっと突き詰めて考えた方がいいです。
今のままだと多分また同じ内容で引っかかると思います。
まえださんのご意見とおりです。
A),B)の問題を解決すればうまくいくと思います。
>「皆さんは、PolyDataGGを2かっ所に宣言したといわれました。」
>のことです。
B)の問題は、
>Bdll.hに
>extern C
>{
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } PolyDataGG;
>
> PolyDataGG *mp_GG; // 関数定義
>};
PolyDataGG *mp_GG; は関数定義ではないです。
僕が関数定義と書いた意味は、
void XXXXX();
等を記入するという意味です。
まえださん、PATIO 、ITOさん、
ご回答ありがとう。
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } PolyDataGG;
の定義は
CStructCls_Poly.hで宣言していますが、
DLL側に渡しようとしますと、DLL側に構造体PolyDataGGを
使えるようにどうしたらいいかという問題です。
そのために、
extern C
をDLL側に(Bdll.h)追加したのです。
> PolyDataGG *mp_GG; は関数定義ではないです。
>僕が関数定義と書いた意味は、
> void XXXXX();
> 等を記入するという意味です。
どう記入すればいいでしょうか、
よろしくお願いします。
DLLの関数宣言はどうやっていますか?
extern Cですか、それとも __declspec(dllimport) ですか?
どちらにしろ、関数宣言を記したヘッダーファイルがありますよね。
そこに
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } ;
これを加えるだけです。
CStructCls_Poly.hでは宣言しなくてもいいです。
CStructCls_Poly.hでは
PolyDataGG *mp_GG;
だけを宣言します。
DLL側から、CStructCls_Poly.hをincludeすると、
DLLにも、CStructCls_Polyクラスを宣言してしまうことになるから
たとえexe側のビルドが成功しても、DLL側がうまくいかないような・・・
(#ifなどで回避してる野かもしれないが)
どうしても、exe側のソースに構造体を宣言し、それをDLL側で使いたいなら
EXE側
CStructCls_Poly.h (A.hをインクルードする)
CStructCls_Poly.cpp
A.h (struct PolyDataGGを宣言)
DLL側
Bdll.h (A.hをインクルードする)
Bdll.cpp
こんな感じでしょうか
でも、exe側に宣言した構造体を、DLL側が使うってのは
DLLの考え方と真っ向からぶつかるような気がします
#その前に本当にDLLなのかどうか心配になってきたな
基本的な考え方としてDll自身は使う側の宣言等からは
独立して考えた方がシンプルですし、結合度も弱くなるので
良いと思います。
なので、使う側で宣言した構造体をDll側で使うと言うのが
そもそも考え方的には良く無いと思います。
本来ならDllで使用する構造体はDllの側で用意すべきです。
また、Dll内部のコードも外部の構造体の宣言に依存するようには
通常しません。
モジュール構造のレベルで考え直した方が良いと思います。
但し、Dllが提供したクラスや構造体から派生させたものを
使う側で用意すると言うのはおかしく無いとは思います。
但し、この場合でもDll側で想定できないような動作を
入れてしまうとうまく動作しなくなることも考えられますので
そういう使い方をするのであれば、きちんとそこまで見越した
設計にしておく必要があります。
ITOさん、rinさん、PATIO さん
ご回答ありがとう。
>でも、exe側に宣言した構造体を、DLL側が使うってのは
>DLLの考え方と真っ向からぶつかるような気がします
>#その前に本当にDLLなのかどうか心配になってきたな
>本来ならDllで使用する構造体はDllの側で用意すべきです。
>また、Dll内部のコードも外部の構造体の宣言に依存するようには
>通常しません。
>モジュール構造のレベルで考え直した方が良いと思います
なるほど、構造体の場合は、DLL側宣言すること。
私は普通の配列(2次元)と同じ使い方と思っています、
間違っています。
そう、これから、構造体の場合は、DLL側で宣言にします。
(そういうことは前回の質問で解決しました。)
でも、もう一つの問題があります、
例:
上記の構造体PolyDataGGはBDLL.hで宣言して、BDLLで使えるしかないですね
同じDATAは別のDLLに使いたいの場合はどう転送するのですか
(FDLL.hあるいは、HDLL.hに使いたいの場合)
(同じデータは複数のDLLに使いたい、今考えているのは、別のDLLとBDLL同じ
構造体を宣言することです。
例:
FDLL.h
PolyDataFF *mp_FF;
HDLL.h
PolyDataFF *mp_HH;
転送の場合は
CStructCls_Poly.cpp
PolyDataFF=PolyDataGG; //構造体の転送
PolyDataHH=PolyDataGG;
)
よろしくお願いします。
>同じDATAは別のDLLに使いたいの場合はどう転送するのですか
まず、1DLLと1アプリはうまくいったのですか?
http://msdn.microsoft.com/ja-jp/library/h90dkhs0.aspx
これかな?
やったことないんで、これで調べてみて下さい。
存知の方お願いします。
> 上記の構造体PolyDataGGはBDLL.hで宣言して、BDLLで使えるしかないですね
> 同じDATAは別のDLLに使いたいの場合はどう転送するのですか
その構造体宣言をふくんだインクルードファイルをそのDLLでもインクルードするだけでしょ。
アプリで使用する時と同じ。
でも、普通はそんな別のDLLに依存するようなDLLの設計にはしないと思う。
そんな構造にしなければならないののならば、設計から見直した方がよい。
複数のDLLをセットにして提供する場合なら別だけど。