DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RAPIを使ってPCからPDA側のファイル操作

環境/言語:[WindowsXP VB.NET Framework1.1]
分類:[.NET]

こんにちは、以前お世話になったBuleMoonです。
タイトルのとおり、RAPIを使ってPCからPDA側のファイル操作を
したいのですが、上手くいかず困っています。
開発環境は、VS.NET2003のVB.NETです。
RAPIの
CeRapiInit
CeCreateFile
CeReadFile
CeWriteFile
CeCloseHandle
CeRapiUninit
を使っています。

ためしに練習をかねて、CeRapiInitしてCeCreateFileしたあとに
CeCloseHandleしてCeRapiUninitするプログラムを作ってみたのですが、
CeCloseHandleのところで、Falseが返ってきてしまいます。
CeCreateFileのところで、ハンドルが正しく取得できていないのだと
思うのですが、原因がわかりません。
PDA側のファイルを指定するパスの書き方もあっているのか
いまいちわかりません。
PDA本体のMy Documentsフォルダ内にtest.txtとと言うファイルがあります。
↓がコードを抜き出したものなのですが、何か使い方が間違っているでしょうか?

[定義]
Public Declare Function CeRapiInitEx Lib "rapi.dll" (
ByRef pRapiInit As RAPIINIT ) As Long

Public Declare Function CeCreateFile Lib "rapi.dll" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long

Public Declare Function CeCloseHandle Lib "rapi.dll" (
ByVal hObject As Long) As Boolean

Public Declare Function CeRapiUninit Lib "rapi.dll" () As Long

[使用部分]
Dim stRapiInit As New RAPIINIT
stRapiInit.cbSize = Len(stRapiInit)
stRapiInit.heRapiInit = 0
stRapiInit.hrRapiInit = 0

Result = CeRapiInitEx(stRapiInit)

Dim FilePath As String = "\My Documents\test.txt"

hFile = CeCreateFile(FilePath, GENERIC_READ Or GENERIC_WRITE, 1, 0, OPEN_EXISTING, 0, 0)

Result = CeCloseHandle(hFile)

Result = CeRapiUninit()

hFileには、2391675667176488959という数字が返ってきます。
おかしなところがあったら、ご指摘ください。
> [定義]
> Public Declare Function CeRapiInitEx Lib "rapi.dll" (
> ByRef pRapiInit As RAPIINIT ) As Long
>
> Public Declare Function CeCreateFile Lib "rapi.dll" ( _
> ByVal lpFileName As String, _
> ByVal dwDesiredAccess As Long, _
> ByVal dwShareMode As Long, _
> ByVal lpSecurityAttributes As Long, _
> ByVal dwCreationDisposition As Long, _
> ByVal dwFlagsAndAttributes As Long, _
> ByVal hTemplateFile As Long) As Long
>
> Public Declare Function CeCloseHandle Lib "rapi.dll" (
> ByVal hObject As Long) As Boolean
>
> Public Declare Function CeRapiUninit Lib "rapi.dll" () As Long
.NETならLongは64ビット整数だったと思いますので、
Integerに直してみては?
…他にもあるかもしれませんが。
■No11891に返信(ガッさんの記事)
>>[定義]
>>Public Declare Function CeRapiInitEx Lib "rapi.dll" (
>> ByRef pRapiInit As RAPIINIT ) As Long
>>
>>Public Declare Function CeCreateFile Lib "rapi.dll" ( _
>> ByVal lpFileName As String, _
>> ByVal dwDesiredAccess As Long, _
>> ByVal dwShareMode As Long, _
>> ByVal lpSecurityAttributes As Long, _
>> ByVal dwCreationDisposition As Long, _
>> ByVal dwFlagsAndAttributes As Long, _
>> ByVal hTemplateFile As Long) As Long
>>
>>Public Declare Function CeCloseHandle Lib "rapi.dll" (
>> ByVal hObject As Long) As Boolean
>>
>>Public Declare Function CeRapiUninit Lib "rapi.dll" () As Long
> .NETならLongは64ビット整数だったと思いますので、
> Integerに直してみては?
> …他にもあるかもしれませんが。

Intgerにして試してみたところ、hFileに-1が返ってきました。
パスの指定がおかしいのですかね。
■No11892に返信(BlueMoonさんの記事)
> ■No11891に返信(ガッさんの記事)
> >>[定義]
> >>Public Declare Function CeRapiInitEx Lib "rapi.dll" (
> >> ByRef pRapiInit As RAPIINIT ) As Long
> >>
> >>Public Declare Function CeCreateFile Lib "rapi.dll" ( _
> >> ByVal lpFileName As String, _
> >> ByVal dwDesiredAccess As Long, _
> >> ByVal dwShareMode As Long, _
> >> ByVal lpSecurityAttributes As Long, _
> >> ByVal dwCreationDisposition As Long, _
> >> ByVal dwFlagsAndAttributes As Long, _
> >> ByVal hTemplateFile As Long) As Long
> >>
> >>Public Declare Function CeCloseHandle Lib "rapi.dll" (
> >> ByVal hObject As Long) As Boolean
> >>
> >>Public Declare Function CeRapiUninit Lib "rapi.dll" () As Long
>>.NETならLongは64ビット整数だったと思いますので、
>>Integerに直してみては?
>>…他にもあるかもしれませんが。
>
> Intgerにして試してみたところ、hFileに-1が返ってきました。
> パスの指定がおかしいのですかね。
CeRapiInitExの引数のRAPIINIT構造体の中のLongを直し忘れていました。
こちらも直したところ、CeCreateFileで正しくハンドルを取得できたようです。
ありがとう、ございました。
引き続き、CeWriteFileとCeReadFileを試したいと思います。
こんにちは。
CeReadFileを使ってみたのですが、上手くいきませんでした。

[定義]
Public Declare Function CeReadFile Lib "rapi.dll" ( _
ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), _
ByVal nNumberOfBytesToRead As Int32, _
ByRef lpNumberOfBytesRead As Int32, _
ByRef lpOverlapped As OVERLAPPED) As Boolean

Dim szbuf(17) As Byte
Dim ReadDataLen As Integer = 0
Dim Result As Boolean
Dim hFile As IntPtr

[使用時]
Result = CeReadFile(hFile, szbuf, szbuf.Length, ReadDataLen, Nothing)

ResultにFalseが返ってきてしまいます。
CeGetLastErrorで調べてみたところ
[code=87] パラメータが間違っています
という感じでした。

hFileにはハンドルが正しく入っていると思うのですが、
一つ気になるのが、
CeCreateFile(FilePath, GENERIC_READ Or GENERIC_WRITE, 1, 0,
       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

OPEN_EXISTING(ファイルを開く)と指定しているのですが、
CeGetLastErrorで
[code=183] 既に存在するファイルを作成することはできません。
とでてきます。
特に気にしなくてもいいのでしょうか。
■No11901に返信(BlueMoonさんの記事)
> こんにちは。
> CeReadFileを使ってみたのですが、上手くいきませんでした。
>
> [定義]
> Public Declare Function CeReadFile Lib "rapi.dll" ( _
> ByVal hFile As IntPtr, _
> ByVal lpBuffer As Byte(), _
> ByVal nNumberOfBytesToRead As Int32, _
> ByRef lpNumberOfBytesRead As Int32, _
> ByRef lpOverlapped As OVERLAPPED) As Boolean
>
> Dim szbuf(17) As Byte
> Dim ReadDataLen As Integer = 0
> Dim Result As Boolean
> Dim hFile As IntPtr
>
> [使用時]
> Result = CeReadFile(hFile, szbuf, szbuf.Length, ReadDataLen, Nothing)
>
> ResultにFalseが返ってきてしまいます。
> CeGetLastErrorで調べてみたところ
> [code=87] パラメータが間違っています
> という感じでした。
>
> hFileにはハンドルが正しく入っていると思うのですが、
> 一つ気になるのが、
> CeCreateFile(FilePath, GENERIC_READ Or GENERIC_WRITE, 1, 0,
>        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
>
> OPEN_EXISTING(ファイルを開く)と指定しているのですが、
> CeGetLastErrorで
> [code=183] 既に存在するファイルを作成することはできません。
> とでてきます。
> 特に気にしなくてもいいのでしょうか。
>
Public Declare Function CeReadFile Lib "rapi.dll" ( _
ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), _
ByVal nNumberOfBytesToRead As Int32, _
ByRef lpNumberOfBytesRead As Int32, _
ByVAl lpOverlapped As IntPtr) As Boolean

Public Declare Function CeWriteFile Lib "rapi.dll" ( _
ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), _
ByVal nNumberOfBytesToWrite As Int32, _
ByRef lpNumberOfBytesWritten As Int32, _
ByVal lpOverlapped As IntPtr) As Boolean

という定義に直したら上手くいきました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板