C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VB6からVC++6DLL呼出しについて


(過去ログ 92 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■54814 / inTopicNo.1)  VB6からVC++6DLL呼出しについて
  
□投稿者/ MUH (8回)-(2010/11/03(Wed) 11:34:22)

分類:[VB6 以前] 

お世話になります。
VB6からVC++6のDLLの呼出しについて教えてください。
先日こちらで教えて頂いてまだ途中だったのですが、呼出し方法が変わり状況が変わったために新たにトピックを作らせて頂きました。
VCで計算した結果をVBで取得しているのですが、授受の過程で数値(配列)が大幅に変わってしまいます。(VCの計算結果ファイルの数値と、VBでVCから取得したあとの取得結果ファイルの数値が違ってしまう)VCの問題でなくて、VBの呼出し上の問題でそのようなことがおこるでしょうか?
ご回答宜しくお願い致します。


******************VB側***********************
' 構造体
Public Type Worm_Info
aModule As Double
aAturyokuKaku As Double
aSusumiKaku As Double
aHamotoChokkei As Double
aPitchCircular As Double
aOuterDiameter As Double
aMizoHaba As Double
aSaitanKyori As Double
aKuitigaiKaku As Double
aPoints_No As Long
aBunkatuSuu As Long
aObjectKind As Long
aPts1(127) As Double
aPts2(127) As Double
End Type

Public Type Initial_Parameters
aCalc_Tolerance As Double
aShape_Base_Length As Double
aMaxDevideNumber As Long
aDebugMode As Boolean
End Type

Public Type Correction_Parameters
aCorrection_A As Double
aCorrection_B As Double
aCorrection_Kind_Flag As Long
aPoint_no As Long
aPts1(256) As Double
aPts2(256) As Double
End Type


'関数定義
Private Declare Function Calc_Top Lib "HMTS.dll" () As Long
Private Declare Function Initial_Parameter_Setting Lib "HMTS.dll" (ByRef pData As Initial_Parameters) As Long
Private Declare Function Struct_Data_Setting_For_Correction Lib "HMTS.dll" (ByRef pData As Correction_Parameters) As Long
Private Declare Function Struct_Data_Setting_For_Worm Lib "HMTS.dll" (ByRef pData As Worm_Info) As Long


'以下呼出し部(Textは設定済)
Dim nRet As Long
Dim ST_Worm_Info As Worm_Info
Dim ST_Initial_Parameters As Initial_Parameters
Dim ST_Dendum_Correction As Correction_Parameters
Dim ST_Addendum_Correction As Correction_Parameters
Dim lngCount As Long

With ST_Initial_Parameters
.aMaxDevideNumber = Text22
.aCalc_Tolerance = Text23
.aShape_Base_Length = Text24
.aDebugMode = Text25
End With
With ST_Dendum_Correction
.aCorrection_Kind_Flag = 0
.aCorrection_A = Text26
.aCorrection_B = Text27
End With
With ST_Worm_Info
.aModule = Text11
.aAturyokuKaku = Text12
.aSusumiKaku = Text13
.aHamotoChokkei = Text14
.aPitchCircular = Text15
.aOuterDiameter = Text16
.aMizoHaba = Text17
.aSaitanKyori = Text18
.aKuitigaiKaku = Text19
.aBunkatuSuu = Text20
.aObjectKind = Text21
End With
With ST_Addendum_Correction
.aCorrection_Kind_Flag = 3
.aCorrection_A = Text28
.aCorrection_B = Text29
End With

nRet = Initial_Parameter_Setting(ST_Initial_Parameters)
nRet = Struct_Data_Setting_For_Correction(ST_Dendum_Correction)
nRet = Struct_Data_Setting_For_Worm(ST_Worm_Info)
nRet = Struct_Data_Setting_For_Correction(ST_Addendum_Correction)
nRet = Calc_Top()

intFileNo = FreeFile
Open "sampletest.csv" For Output As #intFileNo
For lngCount = 0 To 255
Write #intFileNo, ST_Dendum_Correction.aPts1(lngCount), _   ←この部分の結果はOK
ST_Dendum_Correction.aPts2(lngCount)
Next lngCount

For lngCount = 0 To 127
  Write #intFileNo, ST_Worm_Info.aPts1(lngCount), _        ←この部分の結果が違う
ST_Worm_Info.aPts2(lngCount), ST_Worm_Info.aPoints_No  
Next lngCount

  For lngCount = 0 To 255
Write #intFileNo, ST_Addendum_Correction.aPts1(lngCount), _ ←この部分の結果もOK
ST_Addendum_Correction.aPts2(lngCount)
Next lngCount

Close #intFileNo
引用返信 編集キー/
■54816 / inTopicNo.2)  Re[1]: VB6からVC++6DLL呼出しについて
□投稿者/ 魔界の仮面弁士 (1911回)-(2010/11/03(Wed) 14:01:38)
No54814 (MUH さん) に返信
> VB6からVC++6のDLLの呼出しについて教えてください。
DLL 側で求められている構造体の定義と、
VB 側で宣言したユーザー定義型の定義は、本当に一致していますか?

先の #54684 のスレッドでも指摘されていましたが、こういう場合には
DLL 側の関数や構造体定義も掲載してもらわないと、VB 側の宣言が
正しいのかどうか判断できません。DLL の提供元に再確認してください。


> Public Type Initial_Parameters          
このユーザー定義型では、
>   aDebugMode            As Boolean      
のように、Boolean 型が宣言されていますが、C++側の型名は何ですか?

C++ の場合、たとえばブール型としては
 bool 型 … 1 バイト(unsigned char)
 BOOL 型 … 4 バイト(signed int)
などがありますが、VB の Boolean 型は 2 バイトの整数型です。
DLL 側の定義が無いと判断できませんが、本当に Boolean で問題ありませんか?


> Public Type Worm_Info
このユーザー定義型の配列メンバーは、
>   aPts1(127)        As Double           
>   aPts2(127)        As Double           
となっており、0〜127 の「128個」の要素を持ちますが、

> Public Type Correction_Parameters       
こちらについては、
>   aPts1(256)        As Double           
>   aPts2(256)        As Double           
であり、0〜256 すなわち「257個」となっています。


「128個と256個」とか、「129個と257個」ならば対象性がありますが、
「128個と257個」という数は、どうにも中途半端に思えます。

本当に正しい宣言になっているのでしょうか?


>  With ST_Initial_Parameters
>         .aMaxDevideNumber = Text22
Text22 というのは、TextBox ですよね? もしそうならば、
          .aMaxDevideNumber = CLng(Text22.Text)
のように、正しく表記すべきかと思いますよ。本題とは関係ありませんけれども。

引用返信 編集キー/
■54821 / inTopicNo.3)  Re[2]: VB6からVC++6DLL呼出しについて
□投稿者/ MUH (9回)-(2010/11/03(Wed) 17:27:34)
No54816 (魔界の仮面弁士 さん) に返信

ご回答頂きまして、ありがとうございます。
ご指摘の通りVB側aPts1(256) aPts2(256)→aPts1(255) aPts2(255)に修正しました。
また、DLL の提供元から入手出来たVCの情報は以下の通りです。
お手数ですが、ご検討宜しくお願いいたします。

'HMTS.h
#ifdef HMTS_EXPORTS
#define HMTS_API __declspec(dllexport)
#else
#define HMTS_API __declspec(dllimport)
#endif

typedef struct Initial_Parameters {
double aCalc_Tolerance;
double aShape_Base_Length;
long aMaxDevideNumber;
short aDebugMode;
} ST_Initial_Parameter;

typedef struct Correction_Parameters {
double aCorrection_A;
double aCorrection_B;
int aCorrection_Kind_Flag;
int aPoint_no;
double aPts1[256];
double aPts2[256];
} ST_Correction_Parameters;

typedef struct Worm_Info {
double aModule;
double aAturyokuKaku;
double aSusumiKaku;
double aHamotoChokkei;
double aPitchCircular;
double aOuterDiameter;
double aMizoHaba;
double aSaitanKyori;
double aKuitigaiKaku;
int aPoints_No;
int aBunkatuSuu;
int aObjectKind;
double aPts1[128];
double aPts2[128];
} ST_Worm_Info;

// 構造体のポインタ
ST_Initial_Parameter *mInitial_Parameter;
ST_Correction_Parameters *mAddendum_Correction;
ST_Correction_Parameters *mDendum_Correction;
ST_Worm_Info *mwData;


//コール
__declspec(dllexport) long __stdcall Initial_Parameter_Setting(ST_Initial_Parameter *aInitialParam)
__declspec(dllexport) long __stdcall Struct_Data_Setting_For_Correction(
ST_Correction_Parameters *aCorrection)
__declspec(dllexport) long __stdcall Struct_Data_Setting_For_Worm(
ST_Worm_Info *wData)
__declspec(dllexport) long __stdcall Calc_Top( )


'HMTS.DEF
LIBRARY HMTS.DLL
EXPORTS
Initial_Parameter_Setting
Struct_Data_Setting_For_Correction
Struct_Data_Setting_For_Worm
Calc_Top
引用返信 編集キー/
■54825 / inTopicNo.4)  Re[3]: VB6からVC++6DLL呼出しについて
□投稿者/ shu (147回)-(2010/11/03(Wed) 22:10:31)
No54821 (MUH さん) に返信
>typedef struct Initial_Parameters { 
>    double aCalc_Tolerance; 
>    double aShape_Base_Length; 
>    long aMaxDevideNumber; 
>    short aDebugMode; 
>} ST_Initial_Parameter
こうなっているのなら

>Public Type Initial_Parameters 
>    aCalc_Tolerance As Double 
>    aShape_Base_Length As Double 
>    aMaxDevideNumber As Long 
>    aDebugMode As Boolean 
>End Type
aDebugModeはintegerの方が良いと思います。



> typedef struct Correction_Parameters {  
>     double aCorrection_A;         
>     double aCorrection_B;         
>     int    aCorrection_Kind_Flag; 
>     int    aPoint_no;             
>     double aPts1[256];            
>     double aPts2[256];            
> } ST_Correction_Parameters;
こうなっているのなら

>Public Type Correction_Parameters 
>    aCorrection_A As Double 
>    aCorrection_B As Double 
>    aCorrection_Kind_Flag As Long 
>    aPoint_no As Long 
>    aPts1(256) As Double 
>    aPts2(256) As Double 
>End Type
これのaPts1,aPts2はaPts1(255) as Double, aPts2(255) as Double
です。



引用返信 編集キー/
■54827 / inTopicNo.5)  Re[4]: VB6からVC++6DLL呼出しについて
□投稿者/ MUH (10回)-(2010/11/04(Thu) 09:18:08)
No54825 (shu さん) に返信

どうもありがとうございます。
aPts1,aPts2はaPts1(255) as Double, aPts2(255) as Doubleはこれでうまくいきました。

また、aDebugModeをintegerに変更して確認しましたが、dllから取得した数値の違いについては変わりませんでした。

宜しくお願い致します。
引用返信 編集キー/
■54828 / inTopicNo.6)  Re[5]: VB6からVC++6DLL呼出しについて
□投稿者/ shu (148回)-(2010/11/04(Thu) 09:43:57)
2010/11/04(Thu) 09:48:27 編集(投稿者)

No54827 (MUH さん) に返信
> ■No54825 (shu さん) に返信
>

>
> また、aDebugModeをintegerに変更して確認しましたが、dllから取得した数値の違いについては変わりませんでした。
型を合わせたほうが良いという事だけです。サイズは変わりませんが、c++のshortはvb6のintegerなので。

>
> 宜しくお願い致します。
処理が正常に終わっているという事は後は渡している値が正しいのか確認して下さい。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -