掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
マーシャリングするには?2 (ID:78992)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
# 質問を見落としていた……。 > Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _ パラメータの多くが、Int64型(=Long型)で宣言されてしまっています。 きちんと、Int32型(=Integer型)に修正してください。 > Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _ 第3引数をByRefにしておかないと、WIN32_FIND_DATAを受け取れませんよ。 それと、こちらもInt64型(=Long型)が使われていますので、適宜、Int32型(=Integer型)に。 > 'ファイルデータ取得用の構造体 > Public Structure WIN32_FIND_DATA 「FtpFindFirstFileA」に関するヘッダファイル (WinInet.h)を見ると、 #pragma pack(push, wininet, 4) という宣言がありますので、WIN32_FIND_DATA の Structure 自体に、 <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)> といった属性を与えておいてください。(StructLayoutAttribute.Pack が 指定されていなかった場合は、8バイトパッキングと見なされてしまいます) > <MarshalAs(UnmanagedType.IUnknown, SizeConst:=MAX_PATH - 1)> Dim cFileName() As Byte 今回使用している関数は OLE APIでは無いので、IUnknown インターフェイスのポインタとして マーシャリングしてはまずいと思いますよ……。それと、SizeConstフィールドの宣言も違っています。 今回の場合、cFileNameに関しては、Byte型でマーシャリングしても良いですけれど、 この場合は、Stringの方が扱いやすいのではないでしょうか。例えば、 <MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)> _ Public FileName As String という感じですね。(当方で試した限りでは、これで正しく受信できています) もし、文字コード変換の都合上、Stringだと正しく受信できないという事であれば、 データ型はByte型のままにして、以下のような宣言にすれば良いと思います。 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=MAX_PATH)> _ Public FileName() As Byte ただしこの場合は、受信したファイル名を得るために Byte() → String 変換が必要になります。 具体的には、サーバ側の文字コードにあわせた System.Text.Encodingクラスを用意して、 S = System.Text.Encoding.GetEncoding("EUC-JP").GetString(GtFindData.cFileName) S = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(GtFindData.cFileName) などのように、そのGetStringメソッドで変換する必要が生じます。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.