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

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

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

Re[11]: VB.NetでのHULFT送信


(過去ログ 45 を表示中)

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

■24163 / inTopicNo.1)  VB.NetでのHULFT送信
  
□投稿者/ はな (1回)-(2008/08/28(Thu) 15:39:46)

分類:[VB.NET/VB2005] 

OS:WinXP
HULFT for WindowsNT Ver5.0

いつも参考にさせていただいております。
VB.NETでHULFTの送信を行いたく、以下のように書いたのですが

「System.BadImageFormatException はハンドルされませんでした。
  Message="間違ったフォーマットのプログラムを読み込もうとしました。(HRESULT からの例外: 0x8007000B)"」
とエラーが出ます。

---------------------------------------------------
■クラス部
Public Class Hulft 
    Dim vmFileID As String
    Dim vmHostName As String
    Dim vmResend As Boolean
    Dim vmPrior As Integer
    Dim vmSync As Boolean
    Dim vmTimeOut As Integer
    Dim vmFileName As String
    Dim vmGroup As String
    Dim vmNoChkPoint As Boolean

    Sub New(ByVal fileId As String, _
            ByVal prior As Integer, _
            ByVal timeOut As Integer, _
            ByVal fileName As String, _
            ByVal group As String)
        vmFileID = fileId
        vmHostName = String.Empty
        vmResend = False
        vmPrior = prior
        vmSync = True
        vmTimeOut = timeOut
        vmFileName = fileName
        vmGroup = group
        vmNoChkPoint = False
    End Sub

    Public Overrides Function SendFile() As Integer

        ↓ここでエラー発生
        Return utlsend(vmFileID, _
                       vmHostName, _
                       CType(vmResend, System.Int32), _
                       vmPrior, _
                       CType(vmSync, System.Int32), _
                       vmTimeOut, _
                       vmFileName, _
                       vmGroup, _
                       CType(vmNoChkPoint, System.Int32))

    End Function

    <DllImport("hulapi.dll")> _
    Private Shared Function utlsend(ByVal FileID As String, _
                                ByVal HostName As String, _
                                ByVal Resend As Integer, _
                                ByVal Prior As Integer, _
                                ByVal Sync As Integer, _
                                ByVal Timeout As Long, _
                                ByVal Filename As String, _
                                ByVal Group As String, _
                                ByVal NoChkpoint As Long) As Integer

    End Function

End Class

■Form部
Public Class TestForm
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim vlFileId As String = "TEST01"               '/ ファイルID
    Dim vlPrior As Integer = 50                     '/ 転送優先度
    Dim vlTimeOut As Integer = 3600                 '/ 同期転送タイムアウト値
    Dim vlFileName As String = "C:\test\TEST01"     '/ ファイル名
    Dim vlGroup As String = "TESTGR"                '/ 転送グループID

    Dim classHLFT As New TestHulft.Hulft(vlFileId, _
                                    vlPrior, _
                                    vlTimeOut, _
                                    vlFileName, _
                                    vlGroup)
    '/ ハルフト送信
    classHLFT.SendFile()

End Sub
End Class
---------------------------------------------------

既存のVB6.0のFULFT送信では同じ引数で送信が出来ることは確認しています。

下記ページより修正プログラムをダウンロードしたり
「http://support.microsoft.com/kb/928208/ja」

VB6.0とVB.NETでは型の大きさが違うせいでは?と「SendFile」の部分を

Return utlsend(vmFileID, _
               vmHostName, _
               CType(vmResend, System.Int32), _
               CType(vmPrior, System.Int16), _
               CType(vmSync, System.Int32), _
               CType(vmTimeOut, System.Int32), _
               vmFileName, _
               vmGroup, _
               CType(vmNoChkPoint, System.Int32))

などと変えてみたりもしましたが、全く同じエラーが発生します。

長くなり申し訳ありませんが、ご教授ねがいます


引用返信 編集キー/
■24165 / inTopicNo.2)  Re[1]: VB.NetでのHULFT送信
□投稿者/ やじゅ (590回)-(2008/08/28(Thu) 16:31:28)
やじゅ さんの Web サイト
>■No24163 (はな さん) に返信
>

さくっと調べただけ、私の時間切れw
参考になれば・・・

C#で HULFT
http://pdragon.blog24.fc2.com/blog-entry-259.html

こっちは utlsendexで引数が2つ多い
private static extern int utlsendex(
string lpszFileID,
string lpszHostName,
bool bRsend,
short nPriority,
bool bSync,
int nWait,
string lpszFileName,
IntPtr group,
bool bNp,
IntPtr lpMsg,
int nTransMode);

はなさんが提示されているもの、大きく違うのはIntPtr groupとなっていることくらい
Private Shared Function utlsend(
ByVal FileID As String, _
ByVal HostName As String, _
ByVal Resend As Integer, _
ByVal Prior As Integer, _
ByVal Sync As Integer, _
ByVal Timeout As Long, _
ByVal Filename As String, _
ByVal Group As String, _
ByVal NoChkpoint As Long) As Integer
引用返信 編集キー/
■24167 / inTopicNo.3)  Re[2]: VB.NetでのHULFT送信
□投稿者/ Hongliang (288回)-(2008/08/28(Thu) 16:53:40)
二箇所ほど Long になってるのは問題みたいですが。
それ以前に BadImageFormatException ってことは、読み込もうとしている hulapi.dll がネイティブな dll ファイルじゃない可能性とかが考えられますが…。
引用返信 編集キー/
■24175 / inTopicNo.4)  Re[3]: VB.NetでのHULFT送信
□投稿者/ はな (2回)-(2008/08/28(Thu) 18:49:17)
やじゅさん、Hongliangさんありがとうございます。

ハルフトのヘルプを見なおしてみました。
utlsendexのことは載っていなくてutlsendの場合しか確認出来ませんでしたが
C言語はIntPtrを使うようです(ポインタのことですよね? 名前くらいしか知りませんが)

> 二箇所ほど Long になってるのは問題みたいですが。
私も最初はあれ?っと思ったのですがVBの場合はLongのようです。
少なくともVB6.0ではLongで動いています。
.netではまた違うかもしれないので色々と試しているところです。

なにぶん、.netにもAPIにも無知なもので「ネイティブな dll ファイル」という言葉も始めて聞きました
hulapi.dll はsystem32の中にあるのですが読みに行っていないかもしれないということでしょうか?
少し調べてみたのですが私には難しすぎてまだ理解にいたっていません

もう少し調べてみます。

引用返信 編集キー/
■24178 / inTopicNo.5)  Re[4]: VB.NetでのHULFT送信
□投稿者/ やじゅ (592回)-(2008/08/28(Thu) 20:19:16)
やじゅ さんの Web サイト
No24175 (はな さん) に返信
>>二箇所ほど Long になってるのは問題みたいですが。
> 私も最初はあれ?っと思ったのですがVBの場合はLongのようです。
> 少なくともVB6.0ではLongで動いています。
> .netではまた違うかもしれないので色々と試しているところです。

VB6.0 Long → VB.NET Integer
http://www.microsoft.com/japan/msdn/net/vbtransitionguide/chapter4/chapter4_3.aspx
引用返信 編集キー/
■24204 / inTopicNo.6)  Re[5]: VB.NetでのHULFT送信
□投稿者/ はな (3回)-(2008/08/29(Fri) 10:59:41)
No24178 (やじゅ さん) に返信
>
> VB6.0 Long → VB.NET Integer

紛らわしい書き方をしてしまいまい申し訳ありませんでした。
VB6.0とVB.NET ではビット数が違うのは知っていました。
初期値がBooleanで宣言しているので、そちらの事をおっしゃっているのかと思ってしまいました。

対策としてCType(vlxxx,System.Int32)などとやっていたのですが
最初から全てVB.NET にあわせてみました。vmResendなどTrue/Falseを格納していたものは0と-1を入れています。
VB6.0   → VB.NET
Integer →  Short
Long   → Integer

が、まったく変わらずです・・・。
FULFTのバージョンは同じだから使う型の大きさは一緒だと思うんですけど。

やじゅさんがおっしゃっていた「ネイティブな dll ファイル」について調べているところです。

引用返信 編集キー/
■24220 / inTopicNo.7)  Re[6]: VB.NetでのHULFT送信
□投稿者/ よねKEN (177回)-(2008/08/29(Fri) 13:55:20)
2008/08/29(Fri) 14:02:12 編集(投稿者)

HULFTの技術サポート専用サイトからAPIの使用サンプルをダウンロードできますよ。
(HULFT6版ですが)VB2005用もありました。

> 対策としてCType(vlxxx,System.Int32)などとやっていたのですが

宣言の方を正しくしないと対策にはなりません。
#既にここまでのやりとりで宣言も合わせられたとのことなのでよいのですが

>VB6.0   → VB.NET
>Integer →  Short
>Long   → Integer

を対応されたようなので宣言は問題ないと思います。

> vmResendなどTrue/Falseを格納していたものは0と-1を入れています。

True/Falseの数値化したときの値が-1と0なのはVBの世界での話なので、
hulapi.dllのutlsend関数で必要としている値は違うかもしれません。
Trueの場合は、-1ではなく1を指定してみてください。

それでもうまく行かなければ、今までのやりとりでソースコードの内容も変化していると思いますので、
現時点での最新のソースコードを提示してください。

引用返信 編集キー/
■24221 / inTopicNo.8)  Re[7]: VB.NetでのHULFT送信
□投稿者/ Hongliang (289回)-(2008/08/29(Fri) 14:19:04)
や、だから発生してる例外は BadImageFormatException なので、インポート宣言の型云々の問題以前にロードしようとしてる DLL そのものに異常があるわけで…
引用返信 編集キー/
■24226 / inTopicNo.9)  Re[8]: VB.NetでのHULFT送信
□投稿者/ はな (4回)-(2008/08/29(Fri) 15:27:44)
みなさん、ありがとうございます。助言を元に色々と格闘中です
とりあえず、コードは載せないでおきます。

No24221 (Hongliang さん) に返信
> や、だから発生してる例外は BadImageFormatException なので、インポート宣言の型云々の問題以前にロードしようとしてる DLL そのものに異常があるわけで…
VB6.0では動くDLLなのですが、VB.NETではまた事情が異なるのでしょうか?
ダメモトでVB.NETで作ったほかのDLLみたいに参照に追加させようとしたらやっぱり出来ませんでした。

とりあえず、今気になっているのは↓です。
http://msdn.microsoft.com/ja-jp/library/8877bdk6(VS.80).aspx
固定長文字列のアンマネージ コードへのエクスポートに
「Visual Basic 2005では他言語との互換性を考慮して、文字列をエクスポートするときに終了文字が追加されます」
と書かれています。

さらに調べて↓を見つけました
http://blog.livedoor.jp/akf0/archives/51271271.html
http://blog.livedoor.jp/akf0/archives/51271267.html
分からない部分もあるのですが
・APIを利用するにはDeclareステートメントかDLLImport属性を利用する
・VB.NETのデータ型をAPIに合う形に変更するには「MarshalAs属性」を利用する
・DLLImport属性は「MarshalAs属性」を使えない
と、書いてあると認識しました。

そんな感じで今現在はDeclareステートメントについて調べているところです・・・


引用返信 編集キー/
■24230 / inTopicNo.10)  Re[9]: VB.NetでのHULFT送信
□投稿者/ オショウ (37回)-(2008/08/29(Fri) 15:47:23)
> VB6.0では動くDLLなのですが、VB.NETではまた事情が異なるのでしょうか?
> ダメモトでVB.NETで作ったほかのDLLみたいに参照に追加させようとしたらやっぱり出来ませんでした。

  ここの文言だけで話をすると・・・
  ActiveX DLL ではないかと思います。

  VB6では、CreateObject()でインスタンス化していない?

  そうであれば、.NETでもCOM参照で使えると思いますが。

以上。

引用返信 編集キー/
■24231 / inTopicNo.11)  Re[9]: VB.NetでのHULFT送信
□投稿者/ よねKEN (179回)-(2008/08/29(Fri) 15:51:32)
>>や、だから発生してる例外は BadImageFormatException なので、インポート宣言の型云々の問題以前にロードしようとしてる DLL そのものに異常があるわけで…
> VB6.0では動くDLLなのですが、VB.NETではまた事情が異なるのでしょうか?

Windows XPにHULFT5がインストールしてあるPCがあって、
ここでVB6製アプリからはhulapi.dllを呼び出せている、
という状況で、この環境でVB.NET製アプリからhulapi.dllを呼び出すと
BadImageFormatException が発生するということで認識はあってますか?

VB6製アプリから呼び出せている環境であれば、hulapi.dllには問題ないと思いますし、
この場合、通常は、VB.NETからでも呼び出せます。

ないような気がしますが、WindowsXPって64bit版じゃないですよね?

> ダメモトでVB.NETで作ったほかのDLLみたいに参照に追加させようとしたらやっぱり出来ませんでした。

.NETのDLLやActiveX DLLではなく標準のDLLだと思いますので、
参照には追加できないでしょうね。

引用返信 編集キー/
■24233 / inTopicNo.12)  Re[10]: VB.NetでのHULFT送信
□投稿者/ はな (5回)-(2008/08/29(Fri) 16:07:55)
よねKEN さん
>Windows XPにHULFT5がインストールしてあるPCがあって、
>ここでVB6製アプリからはhulapi.dllを呼び出せている、
>という状況で、この環境でVB.NET製アプリからhulapi.dllを呼び出すと
>BadImageFormatException が発生するということで認識はあってますか?
そのとおりです。「hulapi.dll」はHULFT5をインストールするとsystem32フォルダの中に作成されます。

>WindowsXPって64bit版じゃないですよね
64bit版ってのがあるのは知りませんでした。
マイコンピュータのプロパティには
Microsoft Windows XP
Professionaal Version 2002 Serbice Pack 3
と書いてありましたが。


引用返信 編集キー/
■24294 / inTopicNo.13)  Re[11]: VB.NetでのHULFT送信
□投稿者/ はな (7回)-(2008/09/01(Mon) 10:37:28)
たくさんのご返答をありがとうございました。

職場の先輩に相談したところ、HULFT Ver5.0では無理なのでは? ということになり
6.0が入っているPCで試したところ送信を行うことができました。
ちなみにコードはほとんど変わっておりません。

皆さんの貴重な時間を無駄にしてしまい申し訳ありません。
ありがとうございました。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -