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

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

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

Re[2]: VB.NETでDLLも整数値の戻り値について


(過去ログ 89 を表示中)

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

■53287 / inTopicNo.1)  VB.NETでDLLも整数値の戻り値について
  
□投稿者/ お助け下さい (7回)-(2010/09/09(Thu) 16:58:23)

分類:[VB.NET/VB2005 以降] 

お世話になっております。ソフト技術者様のアドバイスを
お願い致します。どうかお助け下さい。

言語:VB2008(Pro)
OS:Win−XP(Pro)

メーカ様のDLLを使用してVB2008でプログラムを作成しているのですが、どうしても戻り値(文字型のデータは戻ってきますが、整数型のデータは0のままです。)が戻ってきません。
海外の機器メーカーに問い合わせても連絡は有りません。

このGetCardRecord2を使用して、メーカー機器にカード番号情報を送ると既に登録されている該当データが戻り値として返ってくる関数です。


C言語のサンプルプログラムを参考にVB2008に置き換えたのですが無理でした。
いろいろとHP等を参考にして制作したのですが、お手上げ状態です。

ヘッダファイルです。

VEXPORT int CALLBACK GetCardRecord2(char *macAddress,int *cardSetID,int *noFormat,
    char *cardNumber,int cardNumberSize,
char *pin,int pinSize,int *accessType,
unsigned int *uniqueID,int *accessGroup1,
int *accessGroup2,int *accessGroup3,
int *accessGroup4,int *accessGroup5,
int *accessGroup6,int *accessGroup7,
int *accessGroup8,int *extendedAccess,
int *passbackExempt,int *pinCmds,
char *startDate,int startDateSize,
char *startTime,int startTimeSize,
char *endDate,int endDateSize,
char *endTime,int endTimeSize,
unsigned int *escortID,
int *inScheduleElevatorGroup,
int *outScheduleElevatorGroup,
int *deleted,int *pinExempt);

C言語のサンプルプログラム

[DllImport("VertX.DLL")]
public static extern int GetCardRecord2(string macAddr, ref int cardSetID, ref int noFormat,
System.Text.StringBuilder cardNumber, int cardNumberSize, System.Text.StringBuilder pin,
int pinSize, ref int accessType, ref uint uniqueID, ref int accessGroup1, ref int accessGroup2,
ref int accessGroup3, ref int accessGroup4, ref int accessGroup5, ref int accessGroup6,
ref int accessGroup7, ref int accessGroup8, ref int extendedAccess, ref int passbackExempt,
ref int pinCmds, System.Text.StringBuilder startDate, int startDateSize,
System.Text.StringBuilder startTime, int startTimeSize, System.Text.StringBuilder endDate,
int endDateSize, System.Text.StringBuilder endTime, int endTimeSize, ref uint escortID,
ref int inElevGroup, ref int outElevGroup, ref int deleted, ref int pinExempt);

int ident;
int result;
string macAddr;
int cardset;
int nofmt;
       string noFmt;
System.Text.StringBuilder cardNumber;
System.Text.StringBuilder pin;
int accessType = 0;
uint unique = 0;
int level1 = 0;
int level2 = 0;
int level3 = 0;
int level4 = 0;
int level5 = 0;
int level6 = 0;
int level7 = 0;
int level8 = 0;
int extended = 0;
int passback = 0;
int pincmd = 0;
System.Text.StringBuilder startDate;
System.Text.StringBuilder startTime;
System.Text.StringBuilder endDate;
System.Text.StringBuilder endTime;
uint escort = 0;
int inelev = 0;
int outelev = 0;
int deleted = 0;
        int pinexempt = 0;

result = GetCardRecord2(macAddr,ref cardset,ref nofmt,cardNumber,ARRLEN,
pin,ARRLEN,ref accessType,ref unique,ref level1,ref level2,ref level3,
ref level4,ref level5,ref level6,ref level7,ref level8,ref extended,
ref passback,ref pincmd,startDate,ARRLEN,startTime,ARRLEN,
endDate,ARRLEN,endTime,ARRLEN,ref escort,ref inelev,ref outelev,ref deleted,ref pinexempt
);
if (result == 0)

textBoxCRUniqueID.Text = unique.ToString();


上記のプログラムでは、uniqueの変数には(戻り値:20386)データは返ってきています。

下記がサンプルプログラムをVBに変更して作成したプログラムです。

<DllImport("VertX.DLL")> _
Public Shared Function GetCardRecord2(ByVal macAddr As String, ByRef cardSetID As Integer, ByRef noFormat As Integer, ByVal cardNumber As   StringBuilder, ByVal cardNumberSize As Integer, ByVal pin As StringBuilder, ByVal pinSize As Integer, ByRef accessType As Integer, <MarshalAs(UnmanagedType.U4)> ByRef uniqueID As UInteger, ByRef accessGroup1 As Integer, ByRef accessGroup2 As UInteger, ByRef accessGroup3 As Integer, ByRef accessGroup4 As Integer, ByRef accessGroup5 As Integer, ByRef accessGroup6 As Integer, ByRef accessGroup7 As Integer, ByRef accessGroup8 As Integer, ByRef extendedAccess As Integer, ByRef passbackExempt As Integer, ByRef pinCmds As Integer, ByVal startDate As StringBuilder, ByVal startDateSize As Integer, ByVal startTime As StringBuilder, ByVal startTimeSize As Integer, ByVal endDate As StringBuilder, ByVal endDateSize As Integer, ByVal endTime As StringBuilder, ByVal endTimeSize As Integer, ByRef escortID As UInt32, ByRef inElevGroup As Integer, ByRef outElevGroup As Integer, ByRef deleted As Integer, ByRef pinExempt As Integer) As Integer
End Function


      Dim accessType As Integer = 0
Dim unique As UInteger = 0
Dim level1 As Integer = 0
Dim level2 As Integer = 0
Dim level3 As Integer = 0
Dim level4 As Integer = 0
Dim level5 As Integer = 0
Dim level6 As Integer = 0
Dim level7 As Integer = 0
Dim level8 As Integer = 0
Dim extended As Integer = 0
Dim passback As Integer = 0
Dim pincmd As Integer = 0
Dim escort As UInt32 = 0
Dim inelev As Integer = 0
Dim outelev As Integer = 0
Dim deleted As Integer = 0
Dim pinexempt As Integer = 0
Dim result As Integer
Dim cardset As Integer
Dim nofmt As Integer = 1

      Dim startDate As New StringBuilder(200)
Dim startTime As New StringBuilder(200)
Dim endDate As New StringBuilder(200)
Dim endTime As New StringBuilder(200)



result = GetCardRecord2(vertx_macaddress(ii), (cardset), (nofmt), cardno, 200, pincode, 200, (accessType), (unique), (level1), (level2), (level3), (level4), (level5), (level6), (level7), (level8), (extended), (passback), (pincmd), startDate, 200, startTime, 200, endDate, 200, endTime, 200, (escort), (inelev), (outelev), (deleted), (pinexempt))


resultの変数は0で返ってきます。この0は成功の意味ですが、成功したにも関わらず、(unique)の戻り値は0です。
また、startDate、startTime、endDate、endTimeには機器に登録されているデータ値が返ってきております。


何が悪いのでしょうか?
お助け下さい。(2週間悩んでおります。)

構造体、マーシャリング等うを使用して作成は可能なんでしょうか?









引用返信 編集キー/
■53288 / inTopicNo.2)  Re[1]: VB.NETでDLLも整数値の戻り値について
□投稿者/ よねKEN (606回)-(2010/09/09(Thu) 17:21:19)
よねKEN さんの Web サイト
2010/09/09(Thu) 17:42:07 編集(投稿者)
2010/09/09(Thu) 17:22:38 編集(投稿者)

あまりに読みにくいので斜め読みしかしていませんが・・・

No53287 (お助け下さい さん) に返信
> result = GetCardRecord2(vertx_macaddress(ii), (cardset), (nofmt), cardno, 200, pincode, 200, (accessType), (unique), (level1), (level2), (level3), (level4), (level5), (level6), (level7), (level8), (extended), (passback), (pincmd), startDate, 200, startTime, 200, endDate, 200, endTime, 200, (escort), (inelev), (outelev), (deleted), (pinexempt))

この箇所は、実際にVBで書いたコードからのそのまま抜粋されたものでしょうか?
そうだとしたら一部の実引数に付けている無意味な(だがしかし、VBの文法的には大きな違いを生む)丸括弧がまずいです。

なぜByRef指定のパラメータの実引数に()を付けているのでしょう?
目立つようにですかね?

> resultの変数は0で返ってきます。この0は成功の意味ですが、成功したにも関わらず、(unique)の戻り値は0です。

uniqueは変数ですが、(unique)は変数ではありません。
例えば、Integer型のByRef指定のパラメータがあるとしましょう。
実引数に1のような数字を渡したらどうなるでしょうか?そのパラメータからの戻り値は受け取れませんよね。
それと同じです。

#<修正>
#「(unique)が式だから戻り値を返せない」といったような主旨の説明が不正確なため文章を一部修正しました。
#</修正>

引用返信 編集キー/
■53289 / inTopicNo.3)  Re[1]: VB.NETでDLLも整数値の戻り値について
□投稿者/ Hongliang (707回)-(2010/09/09(Thu) 17:21:45)
> 海外の機器メーカーに問い合わせても連絡は有りません。
今後のことも考えるとその機器を使い続けて良い物かどうかって気がしますが……。

> result = GetCardRecord2(vertx_macaddress(ii), (cardset), (nofmt), cardno, 200, pincode, 200, (accessType), (unique), (level1), (level2), (level3), (level4), (level5), (level6), (level7), (level8), (extended), (passback), (pincmd), startDate, 200, startTime, 200, endDate, 200, endTime, 200, (escort), (inelev), (outelev), (deleted), (pinexempt))

ByRef 引数に対して、(..., (hoge), ...) と言う風に渡す変数を () でくくってしまうと、変数そのものではなく変数を評価した結果が渡されてしまいます。
つまり、いったん別変数に確保してその変数の参照を渡す、みたいな動作になり、hoge 自体には呼び出し先による変更の影響が反映されません。
引用返信 編集キー/
■53290 / inTopicNo.4)  Re[1]: VB.NETでDLLも整数値の戻り値について
□投稿者/ shu (24回)-(2010/09/09(Thu) 17:40:53)
No53287 (お助け下さい さん) に返信
> 何が悪いのでしょうか?
> お助け下さい。(2週間悩んでおります。)
値が返ってきている部分と返ってきていない部分の記述の違い、Cとの違いをみればどんなに考えても30分もかからないと思うのだが。
引用返信 編集キー/
■53296 / inTopicNo.5)  Re[2]: VB.NETでDLLも整数値の戻り値について
□投稿者/ お助け下さい (9回)-(2010/09/09(Thu) 19:01:08)
No53290 (shu さん) に返信
> ■No53287 (お助け下さい さん) に返信
>>何が悪いのでしょうか?
>>お助け下さい。(2週間悩んでおります。)
> 値が返ってきている部分と返ってきていない部分の記述の違い、Cとの違いをみればどんなに考えても30分もかからないと思うのだが。

本当にすみません。()を外すと戻り値が戻ってきました。しかし以前、()無しでおこないましたが、その時は戻り値は0のままでした。

今回()を付けたのは、EXEファイルを逆コンパイルした時にVBに変換すると()が付いていたので、そのままコピーして試しました。

本当に助かりました。有難うございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -