いつもお世話になっています。ggです。
Aクラスに作った配列構造体を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;
DrawPolygonDLL_AddTest(a, mp_PolySct2); //Dll側の関数
ここで、mp_PolySct2はDll側の関数へ渡しよう配列です。
DLL側:
Bdll.h
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataDLL;
Bdll.cpp
BOOL WINAPI DrawPolygonDLL_AddTest(int a, PolyDataDLL *Poly)
{
int Bcode=(Poly+ j)->Bcode;
...
return TRUE;
}
コンパイルのエラーメッセージ:
error C2664: 'DrawPolygonDLL_AddTest' : 3 番目の引数
を 'CStructCls_Poly::PolyData2 *' から 'PolyData2 *' に変換できません。 (新しい
機能 ; ヘルプを参照)
よろしくお願いします。
環境:.Net MFC使用 WinXP
CStructCls_Poly.hの中でPolyData2を定義するのではなく,
Bdll.hのPolyData2を使ってください。
クラス内で定義した構造体と,クラス外で定義した構造体は,
同じ名前のように見えてもまったく異なる別の名前を持った構造体になります。
YuOさん、
ご返事ありがとう。
>CStructCls_Poly.hの中でPolyData2を定義するのではなく,
>Bdll.hのPolyData2を使ってください。
次のように変更しました。
DLL側:
Bdll.h
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataGF2; //区別するために名前を変えた
PolyDataGF2 *mp_PolySctGF2; //追加
Bdll.cpp
BOOL WINAPI DrawPolygonDLL_AddTest(int a, PolyDataGF2 *Poly)
{
int Bcode=(Poly+ j)->Bcode;
...
return TRUE;
}
CStructCls_Polyクラス側に
CStructCls_Poly.h
private:
PolyDataGF2 *mp_PolySctGF2;
CStructCls_Poly.cpp
int a=1;
mp_PolySctGF2 = new PolyDataGF2[5];
DrawPolygonDLL_AddTest(a, mp_PolySctGF2);
コンパイルのエラーメッセージ:
error LNK2005: struct PolyDataGF2 * mp_PolySctGF2 (?
mp_PolySctGF2@@3PAUPolyDataGF2@@A) は既に AutoTraceSample.obj で定義されていま
す。
調べたのですが
AutoTraceSample.cppにstruct PolyDataGF2 * mp_PolySctGF2定義いていなかったので
す。(構造体の名前を変えても同じエラーが出ます)
よろしくお願いします。
> PolyDataGF2 *mp_PolySctGF2; //追加
なぜ,変数の追加を行っているのですか?
どうも,C++の基礎部分で躓いている感じを受けます。
DLLのヘッダファイルは,DLLを利用する上で必要な宣言/定義のみをしてください。
使う側は,そのヘッダファイルを取り込み,引数の型を合わせて呼び出す事になります。
YuOさん、
ご返事ありがとう。
>なぜ,変数の追加を行っているのですか?
>どうも,C++の基礎部分で躓いている感じを受けます。
PolyDataGF2 *mp_PolySctGF2; //追加
は動的に配列構造体です。
CStructCls_Poly.cpp
int a=1;
mp_PolySctGF2 = new PolyDataGF2[5];
に配列の長さを決定しています。
ここで5の数字ですが、簡単に説明するため、5を入れています。
実際はここでの数字が不定です。
通常に、同じクラスに上記のやり方で正常に動いていますが、
(動的に配列構造体 mp_PolySctGF2 = new PolyDataGF2[5];)
DLLにすると、上記のエラーが出ました。
問題は多分この mp_PolySctGF2 =new PolyDataGF2[5];
部分ですが、解決する方法がわかりません。
よろしくお願いします。
意味がわからないかもしれませんが、とりあえず、
DLL側のヘッダ(Bdll.h)にある変数のインスタンス
PolyDataGF2 *mp_PolySctGF2; //追加
をソース(Bdll.cpp)に移動させてみてください。
もっとも、この様子だと他にもわんさかとありそうですが・・・(vv;)。
仲澤@失業者さん
ご返事ありがとう。
>をソース(Bdll.cpp)に移動させてみてください。
CStructCls_Poly.cpp
BOOL CStructCls_Poly::OpenNumberPoly_PolyStruct(…)
{
PolyDataGF2 *mp_PolySctGF2;
mp_PolySctGF2 = new PolyDataGF2[5];
for(int j=0; j<5; j++){
mp_PolySctGF2[j].Bcode=j;
mp_PolySctGF2[j].Laye=9;
strcpy(mp_PolySctGF2[j].DiagramName, gggg);
}
DrawPolygonDLL_AddTest(a, mp_PolySctGF2);
}
問題がなく動きました。ありがとうございました。
でも、今回の最終目的としては
一回取り込んだデータはDLL側において、
DLLの別の表示関数を呼びますと
例:DrawPolygonDLL_DrawPloy(pDC); //Dll側の表示用
Dll側
BOOL WINAPI DrawPolygonDLL_DrawPloy(CDC* pDC)
{
for(int j=0; j<5; j++){
TRACE(Bcode=%d Laye=%d x=%s\n, mp_PolySctGF2->Bcode,
mp_PolySctGF2->Laye ,
mp_PolySctGF2->DiagramName);
}
return TRUE;
}
取り込んだデータ(構造体mp_PolySctGF2)は
CStructCls_Polyクラスを破棄するまで保有してほしいです。
今の宣言の場所は保有できないですね。
どうしたらいいでしょうか。
よろしくお願いします。
>DLL側:
>Bdll.h
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } PolyDataGF2; //区別するために名前を変えた
>PolyDataGF2 *mp_PolySctGF2; //追加
↑この「*mp_PlySctGF2」は、どこで使う予定で追加したのでしょうか?
>CStructCls_Poly.cpp
> int a=1;
> mp_PolySctGF2 = new PolyDataGF2[5];
ここで使ってる*mp_PlySctGF2」は
>CStructCls_Poly.h
>private:
> PolyDataGF2 *mp_PolySctGF2;
ここで宣言してるものを使っているはず。
必要が無い限り、同名の変数・関数は使わないほうが安全です
>Dll側
>BOOL WINAPI DrawPolygonDLL_DrawPloy(CDC* pDC)
を
BOOL WINAPI DrawPolygonDLL_DrawPloy(CDC* pDC,PolyDataGF2 *mp_PolySctGF2)
こういう風に変更する。
アプリケーションから呼び出すとき
DrawPolygonDLL_DrawPloy(pDC,PolyDataGF2);
とすればいいと思いますが..........
これならば、保有しているはずです。
皆さん言っていますが、
構造体 PolyDataGF2インスタンスが多すぎではないでしょうか。
>CStructCls_Poly.h
>private:
> PolyDataGF2 *mp_PolySctGF2;
これだけ残して他は削除してしまっていいのでは?
あと、配列にしたければ、
PolyDataGF2 mp_PolySctGF2[?];
でいいはずですよね。
別にポインター扱いにしなくてもいいと思いますが。。。。。。。
先ほどの
DrawPolygonDLL_DrawPloy(pDC,PolyDataGF2);
を
DrawPolygonDLL_DrawPloy(pDC,&PolyDataGF2);
すればいいはずです。
>gg 2008/05/14(水) 10:51:56
に書かれたソースから
Bdll.h内にある、
「PolyDataGF2 *mp_PolySctGF2; //追加」
これを削るだけで問題ないと思う
出ているエラーもこれが原因だし
AutoTraceSample.cppについてはDLLの問題とは関係ないので保留
rinさん、ITOさん
ご返事ありがとう。
>アプリケーションから呼び出すとき
> DrawPolygonDLL_DrawPloy(pDC,PolyDataGF2);
>とすればいいと思いますが..........
>これならば、保有しているはずです。
>Bdll.h内にある、
>「PolyDataGF2 *mp_PolySctGF2; //追加」
>これを削るだけで問題ないと思う
>出ているエラーもこれが原因だし
>AutoTraceSample.cppについてはDLLの問題とは関係ないので保留
直しました、うまくできました。
結論:
1.PolyDataGF2 *mp_PolySctGF2;の置く場所は一つしかない。
ソースクラスの方です。
2.エラーということは、dllと
ソース部分の関数(DrawPolygonDLL_AddTest(a, mp_PolySctGF2))
はどこに間違っています。
回答をいただいて皆さんありがとうございました。