いつもお世話になっています。
前回に構造体の転送の質問をしたのですが、
今回はソースからある配列構造体を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
前回と一緒でいいはずです。
通常、構造体定義は普通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に転送できればいいんですよね?
追記です
DLL側の構造体は、
ココカラ---------------
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyData2;
ココマデ--------------------
extern C等もしくは、__declspec(dllimport)のあるヘッダーファイルに
入れて、両方に加える。
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 *' に変換できません。 (新しい機
能 ; ヘルプを参照)
どこに間違っているのでしょうか。
よろしくお願いします。
構造体は、
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataGG;
DLL側にあるのですよね?
これ行っていますか?
>追記です
>DLL側の構造体は、
>ココカラ---------------
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } PolyData2;
>ココマデ--------------------
>extern C等もしくは、__declspec(dllimport)のあるヘッダーファイルに
>入れて、両方に加える。
まさかクラス内で定義してないですよね。
バグくらい直せないで、何を目指すんだか。。
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をつけました。
>バグくらい直せないで、何を目指すんだか。。
どう直せるかな?(どう見てもおかしくない)
よろしくお願いします。
> 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でインクルードしているんでしょう?
>どう直せるかな?(どう見てもおかしくない)
その自信はどこから・・・
やりたいことは
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をセットにして
まぁ、関数に引きわたすときにキャストすれば成功しそうな気もしますが・・・
> error C2664: 'DrawPolygonDLL_DrawPloy' : 2 番目の引数を
> 'CStructCls_Poly::PolyDataGG *' から 'PolyDataGG *' に変換できません。
よく流れを読んでませんが、エラーメッセージ通りじゃないですか?
rinさんの発言どおり、castすればエラー出なくなるとは思いますが・・・
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側に転送したいのです。
よろしくお願いします。
> 'CStructCls_Poly::PolyDataGG *' から 'PolyDataGG *' に変換できません。
CStructCls_Poly::PolyDataGG
と
PolyDataGG
が二つの異なるクラスと認識されてます。
・CStructCls_Poly の中の PolyDataGG
・裸の PolyDataGG
という内容のエラーでしょう?
キャストは違うのでは・・
まえださん
ご返事ありがとう。
訂正
>error C2664: 'DrawDLL2_DrawPloy' : 2 番目の引数を 'CStructCls_Poly::PolyDataGG
>*' から 'PolyDataGG *' に変換できません。 (新しい機能 ; ヘルプを参照)
'DrawDLL2_DrawPloy' =>'Bdll'
>が二つの異なるクラスと認識されてます。
>・CStructCls_Poly の中の PolyDataGG
>・裸の PolyDataGG
PolyDataGGは配列構造体です。
クラスではありません。
よろしくお願いします。
訂正の訂正
>>error C2664: 'DrawDLL2_DrawPloy' : 2 番目の引数
を 'CStructCls_Poly::PolyDataGG
>*' から 'PolyDataGG *' に変換できません。 (新しい機能 ; ヘルプを参照)
>'DrawDLL2_DrawPloy' =>'Bdll'
'DrawDLL2_DrawPloy' は正しいです。'Bdll'の訂正がいらないです。
すみませんでした。