2012-04-23 21 views
0

私はC++をかなり新しくしています。私はJni CallをC++にして、付属のコンパクトフラッシュカードライターに生ファイル(.img)を書き込むJavaアプリケーションを開発しています。以下は私のC++コードです。接続されたUSBドライブを見つけ出し、createFileを使ってHandleを作成し、rawイメージ(.img)をデバイスに書き込むと仮定しています。最終的に、アプリケーションはJava JNIを使​​用して呼び出されます。C++ createFile(コンパクトフラッシュカードライター)

問題は、添付されたドライブをリストすることができますが、createFile()を使用して ハンドルを作成することができることです。私はエラー以下になります:

Error 1 error C2660: 'getHandleOnVolume' : function does not take 2 arguments c:\users\omisorem.nov\documents\visual studio 2010\projects\diskrunner\diskrunner.cpp 71 1 DiskRunner 
     2 IntelliSense: argument of type "char *" is incompatible with parameter of type "LPCWSTR" c:\users\omisorem.nov\documents\visual studio 2010\projects\diskrunner\diskrunner.cpp 86 23 DiskRunner 

何か助けていただければ幸いです。

int main() { 

// GetLogicalDrives returns 0 on failure, or a bitmask representing 
// the drives available on the system (bit 0 = A:, bit 1 = B:, etc) 
unsigned long driveMask = GetLogicalDrives(); 
int i = 0; 
ULONG pID; 

//cboxDevice->clear(); 

while (driveMask != 0) 
{ 
    if (driveMask & 1) 
    { 
     // the "A" in drivename will get incremented by the # of bits 
     // we've shifted 
     char drivename[] = "\\\\.\\A:\\"; 
     drivename[4] += i; 
     cout << pID << "[%1:\\]" << drivename << endl; 
    } 
    driveMask >>= 1; 
    //  cboxDevice->setCurrentIndex(0); 
    ++i; 
} 
LPCTSTR volumeID = TEXT("D:"); 

int volumeID1 = int(volumeID); 
hVolume = getHandleOnVolume(volumeID1, GENERIC_WRITE); 

system("PAUSE"); 
return 0; 
} 

HANDLE getHandleOnVolume(int volume1, DWORD access) 
{ 
HANDLE hVolume; 

char volumename[] = "\\\\.\\A:"; 
volumename[4] += volume1; 
hVolume = CreateFile("\\\\.\\F", access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 
if (hVolume == INVALID_HANDLE_VALUE) 
{ 

    cout <<"Partition does not exist or you don\'t have rights to access it"<<endl; // tesing 

} 
else { 
    cout << "Partition exists " << endl; 
} 

    cout << volume1; 
return hVolume; 
} 
+0

なぜ純粋なJavaのアプローチを使用しないのですか?それは、特にJava 7以来、完全に可能なファイルIOをサポートしています。 – 01es

+0

ありがとう。 JUSBやJava-USB APIを使って、Windows 7との互換性がなく古くなっているのを除いて、Javaはそのような低レベル呼び出しをサポートしているようです。しかし、あなたが私に可能であれば、純粋なjava方向に移動します。 – stdapsy

答えて

1

入力いただきありがとうございます。 I最終的には以下を実行して問題を解決する方法を考え出した:私はハンドルを作成するために別々の機能を作成し

LPCSTR volumename = "\\\\.\\G:"; 
LPCSTR filename = "c:\\somedirectory\\someimage.img"; 

をファイル名にタイプLPCSTRを使用してhRawDisk

、彼らが使用して呼び出されます。

hVolume = getHandleOnVolume(wszVolume, GENERIC_WRITE); 
hFile = getHandleOnFile(filename, GENERIC_READ); 

ハンドルは、ファイルとボリュームの両方で次のように作成されています。

HANDLE getHandleOnFile(LPCTSTR filename, DWORD access){ 
    HANDLE hFile; 
     hFile = CreateFile(filename, access, 0, NULL, (access == GENERIC_READ) ? OPEN_EXISTING:CREATE_ALWAYS, 0, NULL); 

     if (hFile == INVALID_HANDLE_VALUE) 
     { 
      printLastError(); 
      return 0; 

     } 
     //delete filelocation; 
     //CloseHandle(hFile); 
     printf("handle hFile created successfully \n"); 
     system("PAUSE"); 
     return hFile; 

    } 

ボリュームについても同じです。 その後、DeviceIOControlを呼び出して、デバイスの書き込みと書き込みのロックとマウント解除を行いました。

関連する問題