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

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

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

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


(過去ログ 91 を表示中)

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

■54271 / inTopicNo.1)  VB6からVC++6作成DLL呼出しについて
  
□投稿者/ MUH (1回)-(2010/10/12(Tue) 17:09:48)

分類:[VB6 以前] 

はじめまして。VB初心者なのですが、
VB6からVC++6のDLLの呼出しが出来なくて困っています。
基礎的の問題なのかもしれませんが、どなたかお解かりになる方いましたら、アドバイスを宜しくお願い致します。


*VB側の呼び出し
標準モジュール
Public Type W_Info
aMod As Double
aAtu As Double
aSus As Double
aHam As Double
aPit As Double
aOut As Double
aMiz As Double
aSai As Double
aKui As Double
aPts1(128) As Double
aPts2(128) As Double
aPoints_No As Long
aBun As Long
aObj As Long
End Type

関数定義
Private Declare Function Calc_Top Lib "HMTS.dll" (ByRef pData As W_Info) As Long


このCalc_Top関数を使ってVC++側DLLにそれぞれの値を渡し、その返りとして、aPts1(128) 、aPts2(128)、aPoints_No
を受け取ろうとしていますが、うまくいきません。

例えば下記のようにしたりしていますが、Text1には0しか戻りません。


Private Sub Command1_Click()
Dim nRet As Long
Dim pData As W_Info

With pData
.aMod = 3.5
.aAtu = 20
.aSus = 15.068333
.aHam = 42.55
.aPit = 52
.aOut = 59
.aMiz = 4.7088
.aSai = 226.275
.aKui = 15.068333
.aBun = 100
.aObj = 3
End With

nRet = Calc_Top(pData)
Text1 = pData.aPts1(128)
End Sub


引用返信 編集キー/
■54273 / inTopicNo.2)  Re[1]: VB6からVC++6作成DLL呼出しについて
□投稿者/ 魔界の仮面弁士 (1862回)-(2010/10/12(Tue) 17:15:41)
No54271 (MUH さん) に返信
> このCalc_Top関数を使ってVC++側DLLにそれぞれの値を渡し、その返りとして、aPts1(128) 、aPts2(128)、aPoints_No
> を受け取ろうとしていますが、うまくいきません。
DLL 側の定義はどうなっていますか?

>     aPts1(128)           As Double       
このインデックスは、下限値=0/上限値=128 の「要素数129の配列」になりますが、
DLL 側の定義もそうなっていますか?

引用返信 編集キー/
■54276 / inTopicNo.3)  Re[2]: VB6からVC++6作成DLL呼出しについて
□投稿者/ MUH (2回)-(2010/10/12(Tue) 17:47:07)
No54273 (魔界の仮面弁士 さん) に返信
> ■No54271 (MUH さん) に返信
>>このCalc_Top関数を使ってVC++側DLLにそれぞれの値を渡し、その返りとして、aPts1(128) 、aPts2(128)、aPoints_No
>>を受け取ろうとしていますが、うまくいきません。
> DLL 側の定義はどうなっていますか?
>
>> aPts1(128) As Double
> このインデックスは、下限値=0/上限値=128 の「要素数129の配列」になりますが、
> DLL 側の定義もそうなっていますか?


お返事頂きましてありがとうございます
DLL側はブラックボックスとなっていて下記のようになっているとの情報しかありません。
宜しくお願いします。


__declspec(dllexport) int __stdcall Calc_Top(ST_Worm_Info *wData);


/* 構造体 */
typedef struct W_Info {
double aMod;
double aAtu;
double aSus;
double aHam;
double aPit;
double aOut;
double aMiz;
double aSai;
double aKui;
double aPts1[128];
double aPts2[128];
long aPoints_No;
long aBun;
long aObj;
} ST_W_Info;
引用返信 編集キー/
■54277 / inTopicNo.4)  Re[3]: VB6からVC++6作成DLL呼出しについて
□投稿者/ 魔界の仮面弁士 (1863回)-(2010/10/12(Tue) 18:43:22)
No54276 (MUH さん) に返信
> typedef struct W_Info {
DLL 側の構造体と、VB 側のユーザー定義型のサイズが一致していないように見えます。

> double aPts1[128];
> double aPts2[128];
これは 128個 の double 値(0〜127)を意味します。

> aPts1(128) As Double
> aPts2(128) As Double
こちらは通常、0〜128 の配列(129個の Double 値)を意味します。
引用返信 編集キー/
■54292 / inTopicNo.5)  Re[4]: VB6からVC++6作成DLL呼出しについて
□投稿者/ MUH (3回)-(2010/10/12(Tue) 23:41:39)
>
>>double aPts1[128];
>>double aPts2[128];
> これは 128個 の double 値(0〜127)を意味します。
>
>>aPts1(128) As Double
>>aPts2(128) As Double
> こちらは通常、0〜128 の配列(129個の Double 値)を意味します。

VB側しか変えられないので、下のように129に変えてテストしてみましたが結果は同じでした。
double aPts1[129];
double aPts2[129];


基本的なことで申し訳ないのですが、
VCのDLLにpDataのそれぞれの値を渡すことで、pData.aPts1(128)に値が返されるという表現は
nRet = Calc_Top(pData)
Text1 = pData.aPts1(128)
で問題はないでしょうか?



引用返信 編集キー/
■54293 / inTopicNo.6)  Re[5]: VB6からVC++6作成DLL呼出しについて
□投稿者/ やじゅ(本物) (2回)-(2010/10/13(Wed) 02:32:54)
やじゅ(本物) さんの Web サイト
2010/10/13(Wed) 02:48:50 編集(投稿者)

削除します。


引用返信 編集キー/
■54294 / inTopicNo.7)  Re[5]: VB6からVC++6作成DLL呼出しについて
□投稿者/ やじゅ (1761回)-(2010/10/13(Wed) 02:49:27)
やじゅ さんの Web サイト
No54292 (MUH さん) に返信
> >>double aPts1[128];
> >>double aPts2[128];
>>これは 128個 の double 値(0〜127)を意味します。
>
> VB側しか変えられないので、下のように129に変えてテストしてみましたが結果は同じでした。
> double aPts1[129];
> double aPts2[129];

なんで、129にして数を増やすのですか?
それでは、0〜129の配列(130個の Double 値)になってしまい、余計おかしくなります。

VCとVBでは配列絡みの混乱しやすいです。
VCは配列の長さを指定しますが、VBは配列が確保された時の最大要素の数字を指定します。
VCが128なら、VBは128-1=127となります。

> VCのDLLにpDataのそれぞれの値を渡すことで、pData.aPts1(128)に値が返されるという表現は
> nRet = Calc_Top(pData)
> Text1 = pData.aPts1(128)
> で問題はないでしょうか?

128個 の double 値(0〜127)なのだから、上限値は127になりますよね。
引用返信 編集キー/
■54296 / inTopicNo.8)  Re[6]: VB6からVC++6作成DLL呼出しについて
□投稿者/ MUH (4回)-(2010/10/13(Wed) 08:56:15)
やじゅさん、ご指摘ありがとうございます。
テンパっててひどい間違いですよね
127に変更してうまくいきました。
ありがとうございました。

魔界の仮面弁士さんもご対応ありがとうございました。
魔界の仮面弁士さんのご回答で終了していた話しですよね。
大変失礼しました。

本当にお二人ともご親切にありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -