- ベストアンサー
ボリューム名の取得できない原因とは?
- 質問1:ボリューム名は初期値という可能性もある事が最近わかりました。シリアル番号なら特定素材として適していますか?
- 質問2:ボリューム名が取れない原因が分からず、お手上げです。どのようなことが考えられますか?
- ボリューム名の取得について悩んでいます。特にボリューム名が初期値となる場合、シリアル番号を使用することが適しているのかどうかについて知りたいです。また、ボリューム名が取得できない原因についても教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「Tドライブ」など、ネットワーク共有をローカルドライブに割り当てている場合は、コンピュータ名と共有名から一意の名前を作成した方が良いです。 じゃないと 「パソコン1のとある共有ドライブ(Pドライブ)のボリューム名が『DATA』になっている。同様に、パソコン2のとある共有ドライブ(Qドライブ)のボリューム名が『DATA』になっている」 と言う場合に 「どっちのボリューム名も『DATA』で、しかも中身が似ていて、どっちのバックアップデータなのか判らなくなる」 と言う、悲惨な事が起きます。 // Strに渡したドライブ名(C:、D:、X:、Y:など)から // \\コンピュータ名\共有名 // または // \\コンピュータ名\ドライブ名 // と言う形式の、一意の「ボリューム名」を作成する // 失敗した場合は0を返し、成功した場合は長さを返す int Get_Volume_Name(LPSTR Str,LPSTR VolumeName) { DWORD st; LPREMOTE_NAME_INFO pInfo; LPSTR pStr,sStr,nStr; DWORD InfoSize = 1000; VolumeName[0] = '\0'; pInfo = (LPREMOTE_NAME_INFO)malloc(1000); st = WNetGetUniversalName(Str, REMOTE_NAME_INFO_LEVEL, pInfo, &InfoSize); if (!st) { strcpy(VolumeName,pInfo->lpConnectionName); } else { pStr = (LPSTR)pInfo; InfoSize = 998; st = GetComputerName(&pStr[2],&InfoSize); if (st) { pStr[0] = pStr[1] = '\\'; pStr[strlen(pStr) + 1] = '\0'; pStr[strlen(pStr)] = '\\'; InfoSize = 1000 - strlen(pStr); sStr = &pStr[strlen(pStr)]; st = GetFullPathName(Str,InfoSize,sStr,&nStr); if (st) { sStr[1] = '\0'; strcpy(VolumeName,pStr); } } } free(pInfo); return(strlen(VolumeName)); }
その他の回答 (3)
何処でどんな値を定義してるか不明なMAX_VOLUME_SIZEとMAX_VOLUME_SN_SIZEが無意味 API仕様にmaximum buffer size is MAX_PATH+1と書いてるのだから普通にそれを使えばいい (LPCSTR)&も危ない これがポインタだと全く違う場所を渡すことになる キャストと&は同時に要らない
補足
dumm様 回答ありがとうございます。 定義はmain()より上にこのように定義していました。質問に 記述をわすれました。 #define MAX_VOLUME_SIZE 1000 #define MAX_VOLUME_SN_SIZE 1000 こちらに載せたソースは、ボリューム名取得のソースとして 人からいただいたソースですので、LPCSTR、LPSTRについて 私はまだ勉強不足で、正直なんのことやら?状態です。 ご指摘いただいた内容をその人に質問してみます。 本当に初心者で、『API仕様にmaximum buffer size is MAX_PATH+1と書いてるのだから普通にそれを使えばいい』という回答の内容さえ理解できない状態です。 まず、いただいた回答を理解する勉強をします。 ありがとうございました。
- aris-wiz
- ベストアンサー率38% (96/252)
【質問1】 【質問2】 > ret=0なのに、ボリューム名は空値 正しい動作だと思います。 GetVolumeInformationの説明には、以下のように記載されています。 http://msdn.microsoft.com/ja-jp/library/cc429511.aspx 抜粋 >>戻り値 >>要求されたすべての情報を取得できた場合0 以外の値が返ります。 >>それ以外の場合は、0 が返ります。 >>拡張エラーを取得するにはGetLastErrorを使用します。 まずは、拡張エラーのエラー番号を調べてみてはどうでしょう? 蛇促ですが。 ボリューム名より、マウントポイント(MP)のほうがいいのでは?? どのMPが別のサーバのどのMPに対応するのかの管理は必要ですが。
お礼
回答ありがとうございました。 エラーの原因追及をやってみます。 マウントポイントについても調べてみます。 ありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
> ソースを作成してみたのですが、ret=0なのに、ボリューム名は空値 リファレンスを読み間違えていませんか Widnowsの場合 GetVolumeInfomationは ret=0 ならば『APIが失敗している』ことになりますよ GetLastErrorなどでエラーを取得してみましょう # 本来なら質問中に 実行環境や開発環境の情報も盛り込むべきですよ
お礼
早速の回答に感謝します。 エラー原因を調べてみます。 次回から、実行環境や開発環境の情報を記述するようにいたします。 ご丁寧なアドバイスありがとうございました。
お礼
回答ありがとうございます。 サンプルまで頂きまして恐縮です。 \\コンピュータ名\共有名または\\コンピュータ名\ドライブ名と言う形式の、一意の「ボリューム名」作成をしていきます。 サンプルは大切に使わせていただきます。 ありがとうございました。