- じゃんぬねっと
- ぬし
- 会議室デビュー日: 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;
}
}
}
|
|