- PR -

C#でWindows XPでのドライブレターの変更を行うには?

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-05 19:09
引用:

S_Rさんの書き込み (2006-05-05 19:03) より:

Mainメソッドの部分を下記の様に変更してみたのですが、
結果は変わりませんでした。
エラーが表示されるだけでした。。


結果が変わらないならば、Console.WriteLine("{0}",volumeName); に達していないのでしょう。
例外の詳細を得るために、try 〜 catch の機構を追加してデバッグしてください。

引用:

内容を確認するのに、他に適切な方法はあるのでしょうか?
重ね重ね大変申し訳ありません。


え? そのために入れたのが下のこのコードなのではないでしょうか?

引用:

Console.WriteLine("{0}",volumeName);


まあ、通常このような場合は、ブレークポイントを設定してステップ実行します。
先に申し上げた「ステップ単位での結果」というのは、これを指します。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-05-05 19:37
try 〜 catch を追加してみましたが、
エラー結果は同じでした。
特に詳細な表示も出ず、手が出せません。


コード:

using System;
using System.Runtime.InteropServices;

class changeDriveLetter{

			[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
			private static extern bool SetVolumeMountPoint(
			string volumeMountPoint,
			string volumeName
			);

			[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
			private static extern bool GetVolumeNameForVolumeMountPoint(
			string volumeMountPoint,
			out System.Text.StringBuilder volumeName,
			uint bufferLength
			);
		
		public static void Main(){
		
		try{
		
			uint length = 0x100;
			
			System.Text.StringBuilder volumeName = new System.Text.StringBuilder((int)length);
			
			GetVolumeNameForVolumeMountPoint(@"Q:\",out volumeName,length);
			
			Console.WriteLine("{0}",volumeName);
			
			/*
			string GUID = volumeName.ToString();
			
			SetVolumeMountPoint(@"D:\",GUID);
			*/
		
		}catch(Exception e){
		
			Console.WriteLine(e);
		}
	}
}





他にこちらで出来る事は無いでしょうか?
色々とご迷惑をお掛けします。。。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-05 20:00
引用:

S_Rさんの書き込み (2006-05-05 19:37) より:
コード:

[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
private static extern bool GetVolumeNameForVolumeMountPoint(
string volumeMountPoint,
out System.Text.StringBuilder volumeName,
uint bufferLength
);




取りあえず、valueName は LPTSTR ですから、out StringBuilder ではなくて StringBuilder ですね。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-05-05 20:01 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-05 21:27
引用:

Hongliangさんの書き込み (2006-05-05 20:00) より:

取りあえず、valueName は LPTSTR ですから、out StringBuilder ではなくて StringBuilder ですね。


う、すみません、私が提示した定義が間違ってましたか... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-05-06 00:17
「じゃんぬねっと」さん、「Hongliang」さん ありがとうございます。

とりあえず、GetVolumeNameForVolumeMountPointは正常に動作しました。
GUIDの取得は出来ました。

SetVolumeMountPointについては、Flaseが返ってきてしまい、まだ正常動作していませんが、とりあえず"先"は見えたので、続けて作って行きたいと思います。

とりあえず、また報告します。

コード:

using System;
using System.Runtime.InteropServices;

class changeDriveLetter{

			[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
			private static extern bool SetVolumeMountPoint(
			string volumeMountPoint,
			System.Text.StringBuilder volumeName
			);

			[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
			private static extern bool GetVolumeNameForVolumeMountPoint(
			string volumeMountPoint,
			System.Text.StringBuilder volumeName,
			uint bufferLength
			);
		
		public static void Main(){
		
		try{
		
			uint length = 0x100;
			
			System.Text.StringBuilder volumeName = new System.Text.StringBuilder((int)length);
			
			GetVolumeNameForVolumeMountPoint(@"Q:\",volumeName,length);
			
			SetVolumeMountPoint(@"D:",volumeName);
			
		}catch(Exception e){
		
			Console.WriteLine(e);
		}
	}
}



Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-06 00:37
MSDN は、英語版のも確認するのがいいですよ。
SetVolumeMountPoint にはちゃんと lpszVolumeMountPoint に指定する文字列の注意事項が書かれています。日本語訳では落ちてますけど。
それから、GetLastError を使用して〜〜となってる関数は、DllImport に SetLastError=trueを設定しておいて Marshal.GetLastWin32Error メソッドでエラーの原因を探るのが重要です。
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-05-06 10:40
お世話になります。
結局、SetVolumeMountPointの使用方法が理解できず、以下の用にmountvolコマンドを利用した形でまとめました。

動作的には問題なく動作したので、ひとまずは一件落着かな・・と思います。

また、時間の空いた時にでもSetVolumeMountPointを使った形で再作成したいと思います。・・・・・その時までにC#をもっと勉強しときます。。。

「じゃんぬねっと」さん、「Hongliang」さん色々とご指導ありがとうございました。

ちなみに下記のコードでもご指摘は頂戴致しますので宜しくお願いします

コード:
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

class changeDriveLetter{

		[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto, SetLastError=true)]
		private static extern bool GetVolumeNameForVolumeMountPoint(
		string volumeMountPoint,
		System.Text.StringBuilder volumeName,
		uint bufferLength
		);

	public static int Main(string[] args){
		
		try{
		
			if(args.Length != 2){return -1;}
			
			string oldDriveLetter = args[0];
			
			string newDriveLetter = args[1];
			
			uint length = 0x100;
			
			System.Text.StringBuilder volumeName = new System.Text.StringBuilder((int)length);
			
			GetVolumeNameForVolumeMountPoint(oldDriveLetter,volumeName,length);
			
			Process.Start(@"mountvol",oldDriveLetter+@" /D");
			
			Process.Start(@"mountvol",newDriveLetter+" "+volumeName.ToString());
			
			return 0;
		}catch(Exception e){
			
			Console.WriteLine(e);
			return -1;
		}
	}
}



スキルアップ/キャリアアップ(JOB@IT)