構造体の転送の2 – プログラミング – Home

通知
すべてクリア

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

固定ページ 1 / 3

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

いつもお世話になっています。

前回に構造体の転送の質問をしたのですが、
今回はソースからある配列構造体をDLL側に転送したいのですが、
例:
CStructCls_Polyクラス側に
CStructCls_Poly.h
構造体定義
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyData2;
PolyData2 *mp_PolySct2;

CStructCls_Poly.cpp
 mp_PolySct2 = new PolyData2[50];
 int a=1;
int AoPoint[5];
 DrawPolygonDLL_Poly(a, mp_PolySct2, AoPoint);
}
); //Dll側の関数
 ここで、mp_PolySct2はDll側の関数へ渡しよう配列です。

例:DLL側BOOL WINAPI DrawPolygonDLL_DrawPloy(int a,
PolyDataGF2* Poly, //どう書く
int* AoPoint2)
{
...
return TRUE;
}

Bdll.hにもどう書けばいいでしょうか。

DLL側はどう受け取っていますか。
普段に一般の一次元配列、2次元配列と同じく転送したいですが、

配列構造体の場合はできないでしょうか。
(要するに、ソース側に既にある配列構造体をそのまま転送したい)

よろしくお願いします。

環境:.Net MFC使用 WinXP


引用未解決
トピックタグ
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

前回と一緒でいいはずです。
通常、構造体定義は普通DLL側でします。
CStructCls_Poly.h

 PolyData2 mp_PolySct2「50」;
>例:DLL側BOOL WINAPI DrawPolygonDLL_DrawPloy(int a,
> PolyDataGF2* Poly, //どう書く
> int* AoPoint2)
>{
>...
> return TRUE;
>}
これでいいですね。

読み出しは
 DrawPolygonDLL_Poly(a, &mp_PolySct2[n], AoPoint);

でいいはずです。

構造体の内容がDLLに転送できればいいんですよね?


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

追記です
DLL側の構造体は、
ココカラ---------------
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyData2;
ココマデ--------------------

extern C等もしくは、__declspec(dllimport)のあるヘッダーファイルに
入れて、両方に加える。


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

ITOさん
ご返事ありがとう。

>構造体の内容がDLLに転送できればいいんですよね?
そうです、ソース側の配列構造体の内容を転送したいのです。
要するに、表示の関数(DLL側のDrawPolygonDLL_Poly(...)を実行するとソース側に
転送だけです(DLL側の保有することはしない)。

以下のようにしました。
CStructCls_Polyクラス側に構造体
CStructCls_Poly.h
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataGG;
PolyDataGG *mp_GG;

CStructCls_Poly.cpp
 mp_GG = new PolyData2[50];
 int a=1;
int AoPoint[5];
 DrawPolygonDLL_DrawPloy(a, mp_GG, AoPoint);
}

DLL側:
Bdll.h
extern C typedef struct {
    char DiagramName[6]; // Vector 図式名称
    int Bcode; //Bcode
    int Type; //type
     int ID; //番号順
      } PolyDataGG;

Bdll.cpp
DLL側BOOL WINAPI DrawPolygonDLL_DrawPloy(int a,
PolyDataGG* Poly,
int* AoPoint2)
{
...
}

コンパイルのエラーメッセージ:

error C2664: 'DrawPolygonDLL_DrawPloy' : 2 番目の引数を
'CStructCls_Poly::PolyDataGG *' から 'PolyDataGG *' に変換できません。 (新しい機
能 ; ヘルプを参照)

どこに間違っているのでしょうか。
よろしくお願いします。


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

構造体は、
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataGG;
DLL側にあるのですよね?


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

これ行っていますか?

>追記です
>DLL側の構造体は、
>ココカラ---------------
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } PolyData2;
>ココマデ--------------------

>extern C等もしくは、__declspec(dllimport)のあるヘッダーファイルに
>入れて、両方に加える。

まさかクラス内で定義してないですよね。


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

バグくらい直せないで、何を目指すんだか。。


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

ITOさん、IPLさん
ご返事ありがとう。

>まさかクラス内で定義してないですよね。

DLL側:
Bdll.h
extern C typedef struct {
    char DiagramName[6]; // Vector 図式名称
    int Bcode; //Bcode
    int Type; //type
     int ID; //番号順
      } PolyDataGG;

Bdll.cpp
DLL側BOOL WINAPI DrawPolygonDLL_DrawPloy(int a,
PolyDataGG* Poly,
int* AoPoint2)
{
...
}

構造体PolyDataGGは両方に入れています。
DLL側にextern Cをつけました。

>バグくらい直せないで、何を目指すんだか。。
どう直せるかな?(どう見てもおかしくない)

よろしくお願いします。


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

> DLL側:
> Bdll.h
> extern C typedef struct {
>     char DiagramName[6]; // Vector 図式名称
>     int Bcode; //Bcode
>     int Type; //type
>      int ID; //番号順
>       } PolyDataGG;

普通はこうかな?
DLL側:
Bdll.h
extern C
{
typedef struct {
    char DiagramName[6]; // Vector 図式名称
    int Bcode; //Bcode
    int Type; //type
     int ID; //番号順
      } PolyDataGG;

関数定義
};

>>バグくらい直せないで、何を目指すんだか。。
>どう直せるかな?(どう見てもおかしくない)

これがおかしい
> 構造体PolyDataGGは両方に入れています。

DLL.h は、CStructCls_Poly.cppでインクルードしているんでしょう?


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

>どう直せるかな?(どう見てもおかしくない)
その自信はどこから・・・

やりたいことは
Bdll.hで構造体を宣言してるものを
CStructCls_Polyに、メンバ変数として持たせたい
ってことですよね

なにかしらの宣言されてるものを利用したいなら、
宣言されてるファイルをincludeするもんで
同じものを別の場所に書いたってむだ。別物として扱われます

だから、
CStructCls_Poly.hで使いたいなら、CStructCls_Poly.hからBdll.hをincludeしないと
(CStructCls_Poly.cppではなく)

CStructCls_Poly.hから、Bdll.hをincludeするのに何か不具合があるなら
↓こんな感じにしてはどうでしょう(A.hを追加)

EXE側
CStructCls_Poly.h (A.hをインクルードする)
CStructCls_Poly.cpp

DLL側
A.h (EXE側からDLLを利用するのに必要なものだけを宣言(PolyDataGG等))
Bdll.h 
Bdll.cpp

#DLLを他に利用する場合は、A.hとBDll.dllをセットにして

まぁ、関数に引きわたすときにキャストすれば成功しそうな気もしますが・・・


返信引用
K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
 

> error C2664: 'DrawPolygonDLL_DrawPloy' : 2 番目の引数を
> 'CStructCls_Poly::PolyDataGG *' から 'PolyDataGG *' に変換できません。
よく流れを読んでませんが、エラーメッセージ通りじゃないですか?
rinさんの発言どおり、castすればエラー出なくなるとは思いますが・・・


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

ITOさん、rinさん、Kさん
ご返事ありがとう。

>普通はこうかな?
>DLL側:
>Bdll.h
>extern C
>{
> typedef struct {
>     char DiagramName[6]; // Vector 図式名称
>     int Bcode; //Bcode
>     int Type; //type
>      int ID; //番号順
>       } PolyDataGG;

> 関数定義
>};

ここで、
Bdll.h> 関数定義
PolyDataGG *mp_GG;をいれてないので、今入れます。
extern C
{
typedef struct {
    char DiagramName[6]; // Vector 図式名称
    int Bcode; //Bcode
    int Type; //type
     int ID; //番号順
      } PolyDataGG;

PolyDataGG *mp_GG; // 関数定義
};

>DLL.h は、CStructCls_Poly.cppでインクルードしているんでしょう?
入れてないので、今入れます。

DLL側:
Bdll.h
#include ..\\structcls_poly.h

わかりやすくなるため、もう一度載せます。
DLL側:
Bdll.h
#include ..\\structcls_poly.h
extern C
{
typedef struct {
    char DiagramName[6]; // Vector 図式名称
    int Bcode; //Bcode
    int Type; //type
     int ID; //番号順
      } PolyDataGG;

PolyDataGG *mp_GG; // 関数定義
};
Bdll.cpp
DLL側BOOL WINAPI DrawDLL2_DrawPloy(int a,
                  PolyDataGG* Poly)

{…}

CStructCls_Polyクラス側に
CStructCls_Poly.h

 #include Bdll\\Bdll.h 

//構造体定義
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyData2;
PolyDataGG *mp_GG;

CStructCls_Poly.cpp
mp_GG = new PolyDataGG[10];
DrawDLL2_DrawPloy(pDC, mp_GG);

結局:同じエラーが出ます。
error C2664: 'DrawDLL2_DrawPloy' : 2 番目の引数を 'CStructCls_Poly::PolyDataGG
*' から 'PolyDataGG *' に変換できません。 (新しい機能 ; ヘルプを参照)

>やりたいことは
>Bdll.hで構造体を宣言してるものを
>CStructCls_Polyに、メンバ変数として持たせたい
>ってことですよね
違います、そのことは前回の発言”構造体の転送”で解決しました。
今回は、ソースからある配列構造体をDLL側に転送したいのです。

よろしくお願いします。


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

> 'CStructCls_Poly::PolyDataGG *' から 'PolyDataGG *' に変換できません。

CStructCls_Poly::PolyDataGG

PolyDataGG

が二つの異なるクラスと認識されてます。
・CStructCls_Poly の中の PolyDataGG
・裸の PolyDataGG

という内容のエラーでしょう?
キャストは違うのでは・・


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

まえださん
ご返事ありがとう。

訂正
>error C2664: 'DrawDLL2_DrawPloy' : 2 番目の引数を 'CStructCls_Poly::PolyDataGG
>*' から 'PolyDataGG *' に変換できません。 (新しい機能 ; ヘルプを参照)

'DrawDLL2_DrawPloy' =>'Bdll'

>が二つの異なるクラスと認識されてます。
>・CStructCls_Poly の中の PolyDataGG
>・裸の PolyDataGG

PolyDataGGは配列構造体です。
クラスではありません。

よろしくお願いします。


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

訂正の訂正
>>error C2664: 'DrawDLL2_DrawPloy' : 2 番目の引数
を 'CStructCls_Poly::PolyDataGG
>*' から 'PolyDataGG *' に変換できません。 (新しい機能 ; ヘルプを参照)

>'DrawDLL2_DrawPloy' =>'Bdll'

'DrawDLL2_DrawPloy' は正しいです。'Bdll'の訂正がいらないです。
すみませんでした。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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