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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.54814 の関連記事表示

<< 0 >>
■54814  VB6からVC++6DLL呼出しについて
□投稿者/ MUH -(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
親記事 /過去ログ92より / 関連記事表示
削除チェック/

■54816  Re[1]: VB6からVC++6DLL呼出しについて
□投稿者/ 魔界の仮面弁士 -(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)
    のように、正しく表記すべきかと思いますよ。本題とは関係ありませんけれども。
記事No.54814 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54821  Re[2]: VB6からVC++6DLL呼出しについて
□投稿者/ MUH -(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
記事No.54814 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54825  Re[3]: VB6からVC++6DLL呼出しについて
□投稿者/ shu -(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
    です。
    
    
    
記事No.54814 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54827  Re[4]: VB6からVC++6DLL呼出しについて
□投稿者/ MUH -(2010/11/04(Thu) 09:18:08)
    No54825 (shu さん) に返信

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

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

    宜しくお願い致します。
記事No.54814 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54828  Re[5]: VB6からVC++6DLL呼出しについて
□投稿者/ shu -(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なので。

    >
    > 宜しくお願い致します。
    処理が正常に終わっているという事は後は渡している値が正しいのか確認して下さい。
記事No.54814 のレス /過去ログ92より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -