構造体の転送の2 – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] 構造体の転送の2

固定ページ 2 / 3

SSH
 SSH
(@SSH)
ゲスト
結合: 16年前
投稿: 4
 

問題なのは、

typedef struct { ... } PolyData2;

が、

Bdll.h と structcls_poly.h の中の二箇所にある事です。


返信引用
まえだ
 まえだ
(@まえだ)
ゲスト
結合: 16年前
投稿: 10
 

>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 ってなんでしたっけ?


返信引用
まえだ
 まえだ
(@まえだ)
ゲスト
結合: 16年前
投稿: 10
 

# すでに、ITOさんによって指摘されてましたね。
> まさかクラス内で定義してないですよね。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 17年前
投稿: 112
 

>>Bdll.hで構造体を宣言してるものを
>>CStructCls_Polyに、メンバ変数として持たせたい
>>ってことですよね
>違います、そのことは前回の発言”構造体の転送”で解決しました。

今日、ggさんが載せたソースも
Bdll.hに宣言されている「PolyDataGG」という構造体を
CStructCls_Poly.hで使ってますよ
(メンバ変数なのか、グローバルなのか判別できませんが)

CStructCls_Poly.hで宣言されてる「PolyData2」は使用されてない

>今回は、ソースからある配列構造体をDLL側に転送したいのです。
これ、もう少し詳しく書いてください
ソース(EXE側?)からDLLにデータを引き渡したいのが主題なのか
どこどこに宣言された構造体を利用したいってことが主題なのか

もし後者なら、まず、構造体の宣言を複数かかないで
ggさんが、おきたい場所のみにしてみてはどうでしょうか?


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

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にデータを引き渡したい)

よろしくお願いします。


返信引用
まえだ
 まえだ
(@まえだ)
ゲスト
結合: 16年前
投稿: 10
 

その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かっ所に宣言したといわれました。」
のことです。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2659
 

前回の質問への回答がきちんと理解できていない様に感じます。
コンパイルのエラーを取ると言う部分に注意が集中しすぎていて
何が悪いのかと言う部分が置き去りなっていないかなぁ。

C++を使っていてそういうエラーが出る原因が何なのかと言う部分を
もっと突き詰めて考えた方がいいです。
今のままだと多分また同じ内容で引っかかると思います。


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

まえださんのご意見とおりです。
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();
 等を記入するという意味です。
 


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

まえださん、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();
> 等を記入するという意味です。

どう記入すればいいでしょうか、

よろしくお願いします。

 


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

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;
 だけを宣言します。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 17年前
投稿: 112
 

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なのかどうか心配になってきたな


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2659
 

基本的な考え方としてDll自身は使う側の宣言等からは
独立して考えた方がシンプルですし、結合度も弱くなるので
良いと思います。
なので、使う側で宣言した構造体をDll側で使うと言うのが
そもそも考え方的には良く無いと思います。
本来ならDllで使用する構造体はDllの側で用意すべきです。
また、Dll内部のコードも外部の構造体の宣言に依存するようには
通常しません。
モジュール構造のレベルで考え直した方が良いと思います。

但し、Dllが提供したクラスや構造体から派生させたものを
使う側で用意すると言うのはおかしく無いとは思います。
但し、この場合でもDll側で想定できないような動作を
入れてしまうとうまく動作しなくなることも考えられますので
そういう使い方をするのであれば、きちんとそこまで見越した
設計にしておく必要があります。


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

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;

よろしくお願いします。


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

>同じDATAは別のDLLに使いたいの場合はどう転送するのですか
まず、1DLLと1アプリはうまくいったのですか?

http://msdn.microsoft.com/ja-jp/library/h90dkhs0.aspx
これかな?
やったことないんで、これで調べてみて下さい。
存知の方お願いします。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> 上記の構造体PolyDataGGはBDLL.hで宣言して、BDLLで使えるしかないですね
> 同じDATAは別のDLLに使いたいの場合はどう転送するのですか
その構造体宣言をふくんだインクルードファイルをそのDLLでもインクルードするだけでしょ。
アプリで使用する時と同じ。

でも、普通はそんな別のDLLに依存するようなDLLの設計にはしないと思う。
そんな構造にしなければならないののならば、設計から見直した方がよい。
複数のDLLをセットにして提供する場合なら別だけど。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

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