0

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

現在の問題は、接続されたドライブを一覧表示することはできますが、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;
}
4

1 に答える 1

1

ご意見をお寄せいただきありがとうございます。最終的に、次のようにして問題を解決する方法を見つけました。

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

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

ハンドルを作成するために別の関数を作成しました。それらは次を使用して呼び出されます。

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 を呼び出して、書き込み用にデバイスをロックおよびアンマウントしました。

于 2012-06-04T18:24:53.920 に答える