■33695 / inTopicNo.6) |
Re[5]: USBフラッシュメモリのサイズを取得したい |
□投稿者/ オショウ (108回)-(2009/03/07(Sat) 12:08:58)
|
> 問題は.NETから呼べるかですが、.NET知らないのでさっぱり分かりません。^^
わざわざVBやC#にしなくても、C++/CLIで書けばマネージドなので そのクラスをVBやC#から呼べます。
どうしてもVBやC#のみで・・・と言うのであれば
http://forum.softpedia.com/lofiversion/index.php/t15647.html
各種宣言は・・・
http://www.pinvoke.net/index.aspx
ここで検索して拾えます。
参考までに
※ C++のヘッダーファイルに既に各種宣言が為されていますので、 わざわざVBやC#で置き換えたかなりの量の宣言部分を再定義する のは労力の無駄かと・・・
因みに、C++/CLIで書いた実行部分のソースコードのみなら・・・
static void MarshalString( String ^ s, std::wstring& os ){ using namespace Runtime::InteropServices; const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
os = chars; Marshal::FreeHGlobal(IntPtr((void*)chars)); }
ULONGLONG DiskSize::GetDiskSize(int DrvNo){
String^ DriveName; std::wstring devicename;
using namespace Text; DriveName = String::Format ("\\\\.\\PhysicalDrive{0}",DrvNo);
MarshalString(DriveName, devicename);
HANDLE hDevice;
hDevice = CreateFile(devicename.c_str(), GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(!hDevice){ return 0; }
DISK_GEOMETRY geo; BOOL res; DWORD res_bytes;
res = DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &geo, sizeof(geo), &res_bytes, NULL); if(!res){ CloseHandle(hDevice); return 0; }
ULONGLONG totalsize;
totalsize = geo.SectorsPerTrack * geo.BytesPerSector * geo.TracksPerCylinder; totalsize = (totalsize * geo.Cylinders.QuadPart);
CloseHandle(hDevice);
return totalsize;
}
以上。
|
|