ジメジメする梅雨のお悩み、一挙解決! >>

現在、HDDを物理的に読み書きするソフトウェアを製作しております。
その際HDDをドライブレターではなく物理ドライブ番号で判断する必要があり、
全容量を取得する方法がわからず困っています。

環境はWindows2000Pro(VisualC++ V6/API)です。
ドライブレターが使用できる場合GetDiskFreeSpace(Ex)にて取得できるようですが、
試しに第一引数に「\\.\PhysicalDrive0」と渡し失敗することを確認しました。

指定方法や順序の問題かも知れませんが、
この状態でフォーマットされていないHDDの全容量を知る方法があれば、是非、ご教示ください。

A 回答 (3件)

パーティション (ドライブレター) ごとではなく,


物理ドライブごとでいいんでしょうか?
ちょっと調べて作ってみましたのでご参考まで.
(CreateFile の引数がこれでいいのか,十分マニュアルを
熟読していませんが,とりあえずそれらしい結果は出ました.)

//--------------------------------------------------------------------------
#define _WIN32_WINNT 0x0501
#include <stdio.h>
#include <windows.h>

/*--------------------------------------------------------------------------
機能 :物理ドライブごとのディスク容量を出力する.
--------------------------------------------------------------------------*/
void PrintPhysicalDriveCapacities(void)
{
 HANDLE hDrive;
 GET_LENGTH_INFORMATION length;
 unsigned driveNo;
 DWORD nBytes;
 char fileName[29];

 for(driveNo = 0; ; driveNo++) {
  // 物理ドライブ driveNo をオープンする.
  sprintf(fileName, "\\\\.\\PHYSICALDRIVE%u", driveNo);
  hDrive = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_WRITE, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hDrive == INVALID_HANDLE_VALUE) break;

  // 物理ドライブの全容量を取得する.
  if(DeviceIoControl(hDrive, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0,
            &length, (DWORD)sizeof(length), &nBytes, NULL)) {
   printf("Physical Drive #%u: %I64u bytes\n", driveNo, length.Length);
  }
  CloseHandle(hDrive);
 }
}

//--------------------------------------------------------------------------
int main(void)
{
 PrintPhysicalDriveCapacities();
 return EXIT_SUCCESS;
}

// 実行結果 ----------------------------------------------------------------

Physical Drive #0: 120034123776 bytes  /* 120GB HDD */
Physical Drive #1: 2086535168 bytes   /* 2GB USB Memory */
    • good
    • 0
この回答へのお礼

ご連絡が遅くなってしまい申し訳ありませんでした。
お忙しい中、そのもののご回答をいただき心より感謝いたします。
noocyte氏のコードを参考に、No.2 davidfox氏の示された方法で取得してみました。
同じく取り敢えずの結果ではありますが、テスト中のコードを記載いたします。
 
 ---------------------
  #include <windows.h>
  #include <stdio.h>
  #include <winioctl.h>
 ---------------------
 
 ---------------------
  引数 DWORD numdrv( = 0);
 ---------------------
 
 char devicename[64];
 sprintf(devicename, "\\\\.\\PhysicalDrive%u", numdrv);
 
 HANDLE hDevice;
 
 // デバイスを開く
 hDevice = CreateFile(devicename, GENERIC_WRITE,
          FILE_SHARE_READ|FILE_SHARE_WRITE,
          NULL, OPEN_EXISTING, 0, NULL);
 
 // デバイスが開けない
 if(!hDevice){
  fprintf(stdout, "failed to open device %d.\n", numdrv);
  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){
  fprintf(stdout, "failed to get device status.\n");
  return 0;
 }
 
 // 全容量割り出し
 fprintf(stdout, "SecSize : %u\nSecNum : %u\nCls : %I64u \nTrk : %u\n",
          geo.BytesPerSector, geo.SectorsPerTrack,
          geo.Cylinders, geo.TracksPerCylinder);
 
 ULONGLONG totalsize;
 totalsize = geo.SectorsPerTrack * geo.BytesPerSector * geo.TracksPerCylinder;
 totalsize = (totalsize * geo.Cylinders.QuadPart) / 1048576;
 fprintf(stdout, "Total : %I64u MB\n", totalsize);
 CloseHandle(hDevice);

今回はWinNT上で動作し、またセクタサイズ等も可能であれば必要なため
GET_DRIVE_GEOMETRY を使用させていただきました。
詰まっておりましたので大変助かりました。ご回答、感謝いたします。

お礼日時:2007/03/01 00:07

DeviceIoControl で DISK_GEOMETRY構造体を取得して計算すれば良いのでは。


ただ、昔の話なので、現在どんなHDDでも通用するかは判りませんが。
    • good
    • 0
この回答へのお礼

連絡が遅くなってしまい申し訳ありません。

DeviceIoControl 関数を使用することで取得できるとのことで、
試しに上記の様にテストしてみたところ、問題なく取得できました。
(2G以下のHDDを対象として、キャストが強引ではありますが…)

今回はPC-98時代の"昔の"HDDを読み書きする必要があり、
ご回答はズバリのものです。ご回答、感謝いたします。

お礼日時:2007/02/28 23:37

使ったことはありませんが、参考URLの


ライブラリはどうでしょうか。

参考URL:http://www.vector.co.jp/soft/dl/win95/prog/se116 …
    • good
    • 0
この回答へのお礼

ご連絡が遅くなってしまい申し訳ありません。
ライブラリ、拝見いたしました。
ライブラリとのことで今回は使用できませんが、
次回、その他リソースを取得する際参考にさせていただきます。
ご回答、有り難うございました。

お礼日時:2007/02/28 23:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q(Win32)ファイルパスから物理ドライブ番号を取得するには

 任意のファイルが保存されているディスクの固有情報を取得するプログラムを作成しています。固有情報は論理ディスクでは取得できないため、「C:\sample.txt」の「C:」といった論理ドライブ名から「PHYSICALDRIVE0」のような物理ドライブ名を取得する方法を探しています。

なお開発環境はVisual C++ 2008/Win32 SDKの組み合わせとなります。

Aベストアンサー

方法 (1)

WMI ( Windows Management Instrumentation ) を使ってこれらを
関連付けする方法はどうでしょうか?

WQL 文
SELECT * from Win32_LogicalDiskToPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
Dependent: \\hostname\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
(略)

WQL 文
SELECT * from Win32_DiskDriveToDiskPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
Dependent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
(略)

WMI を VC++ からお使いに方法については以下の URL をご参照ください。

WMI C++ Application Examples (Windows)
http://msdn2.microsoft.com/en-us/library/aa394558.aspx

WQL (SQL for WMI) (Windows)
http://msdn2.microsoft.com/en-us/library/aa394606.aspx

CodeProject Making WMI Queries In C++. Free source code and programming help
http://www.codeproject.com/KB/system/UsingWMI.aspx


方法 (2)

ドライブ情報を取得するツールがベクターにあり、この方法は WMI を使いません。
ソースも同梱されています。
volumeinfo displays the Volume Infomations.
http://www.vector.co.jp/soft/dl/winnt/util/se328137.html
※ \\.\PHYSICALDRIVE0 ではなく WIN32API の QueryDosDevice で
  取得できる \Device\HardDiskVolume0 ですが。


蛇足にしかなりませんが。
CLI を使ったマネージドコードならこれだけで呼び出すことが可能です。
※ 処理に時間がかかります。
----------------
// 参照追加 System.Management
// using namespace System::Management;
System::String^ logdrv_to_phydev(System::String^ drive)
{
System::String^ strClassName = "Win32_LogicalDisk='" + drive->Trim()->Substring(0,1) + ":'";
ManagementObject^ mo = gcnew ManagementObject(strClassName);
for each (ManagementObject^ mo1 in mo->GetRelated("Win32_DiskPartition"))
{
for each (ManagementObject^ mo2 in mo1->GetRelated("Win32_Diskdrive"))
return mo2["Name"]->ToString();
}
}
----------------
// 呼出例
// 結果: \\.\PHYSICALDRIVE0
Console::WriteLine(logdrv_to_phydev("C"));
----------------

方法 (1)

WMI ( Windows Management Instrumentation ) を使ってこれらを
関連付けする方法はどうでしょうか?

WQL 文
SELECT * from Win32_LogicalDiskToPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
Dependent: \\hostname\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
(略)

WQL 文
SELECT * from Win32_DiskDriveToDiskPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
...続きを読む

Qディスクの総セクタサイズを取得したい。

ハードディスクやリムーバブルディスクなどストレージデバイスの容量を取得したいのですが
どうやって調べたらよいのでしょうか?

C言語、WindowsXP環境での方法を教えてください。
ちなみに、ディスクは未フォーマットで
全部0でクリアされている場合でも可能な方法が好みです。

Aベストアンサー

参考までに、途中まで成功するコードを記述してみました。
#include<windows.h>
const GUID CLSID_Locator =
{0x76A64158,0xCB41,0x11D1,{0x8B,0x02,0x00,0x60,0x08,0x06,0xD9,0xB6}};
const GUID IID_Locator =
{0x76A6415B,0xCB41,0x11D1,{0x8B,0x02,0x00,0x60,0x08,0x06,0xD9,0xB6}};
LCID id;
//メソッドを実行する
HRESULT exec(IDispatch *p,OLECHAR *m,DISPPARAMS *s,VARIANT *r) {
  HRESULT retc = 0;
  DISPID disp = 0;
  retc = p->GetIDsOfNames(IID_NULL,&m,1,id,&disp);
  if( ! SUCCEEDED( retc ) ) return retc;
  VariantInit(r);
  retc = p->Invoke(disp,IID_NULL,id,DISPATCH_METHOD,s,r,NULL,NULL);
  return retc;
}
//プロパティを取得する
HRESULT getp(IDispatch *p,OLECHAR *m,VARIANT *r) {
  HRESULT retc = 0;
  DISPID disp = 0;
  retc = p->GetIDsOfNames(IID_NULL,&m,1,id,&disp);
  if( ! SUCCEEDED( retc ) ) return retc;
  VariantInit(r);
  DISPPARAMS s = {NULL,NULL,0,0};
  retc = p->Invoke(disp,IID_NULL,id,DISPATCH_PROPERTYGET,&s,r,NULL,NULL);
  return retc;
}
//中核処理
HRESULT sub(IDispatch *p) {
  HRESULT retc = 0;
  VARIANT rval;
  {
    DISPPARAMS param = {NULL, NULL, 0, 0};
    retc = exec(p,L"ConnectServer",&param,&rval);
  }
  if( ! SUCCEEDED( retc ) ) return retc;
  p = (IDispatch *)rval.ulVal;
  {
    VARIANT sql;
    sql.vt = VT_BSTR;
    sql.bstrVal = SysAllocString(L"SELECT * FROM Win32_DiskPartition");
    DISPPARAMS param = {&sql, NULL, 1, 0};
    retc = exec(p,L"ExecQuery",&param,&rval);
    SysFreeString(sql.bstrVal);
  }
  if( ! SUCCEEDED( retc ) ) return retc;
  p = (IDispatch *)rval.ulVal;
  retc = getp(p,L"Count",&rval);
  if( ! SUCCEEDED( retc ) ) return retc;
  int cnt = rval.ulVal;
  IDispatch *obj;
  for( int i = 0 ; i < cnt ; i++ ) {
    VARIANT pos;
    pos.vt = VT_I4;
    pos.uintVal = i;
    DISPPARAMS param = {&pos, NULL, 1, 0};
    retc = exec(p,L"Item",&param,&rval);//★ここで失敗する
    if( ! SUCCEEDED( retc ) ) return retc;
    obj = (IDispatch *)rval.ulVal;
  }
  return retc;
}
int WINAPI WinMain(HINSTANCE hi,HINSTANCE pi,LPSTR cp,int sw) {
  id = GetUserDefaultLCID();
  IDispatch *p = NULL;
  HRESULT retc;
  CoInitialize(0);//★必須
  retc = CoCreateInstance(CLSID_Locator,0, CLSCTX_INPROC_SERVER,
              IID_Locator, (void **)&p);
  if( SUCCEEDED( retc ) ) retc = sub(p);
  if( ! SUCCEEDED( retc ) ) {
    char msg[128];
    wsprintf(msg,"ERROR occured = %08x\n",retc);
    MessageBox(NULL,msg,"Error",0);
  }
  CoUninitialize();
  return 0;
}
ExecQueryに成功し、結果のオブジェクト数(Countプロパティ)を取得
するところまでは出来るんですが、やはり、For Each に相当する処理
が分かりません。オブジェクトには他にItemメソッド、Securityプロパティが
あります。後出しですが、Itemメソッドのパラメータに下記文字列を
指定すると、オブジェクトが取得でき、CaptionやSizeが取れます。
\\.\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
でも、Diskが2個あるとか、パーティションがn個あるとどうなるか、
実際の環境が無いので、分かりません。上記文字列も結果を知ってから
コーディングしました。(だから後出しジャンケンなんですが・・・)

参考までに、途中まで成功するコードを記述してみました。
#include<windows.h>
const GUID CLSID_Locator =
{0x76A64158,0xCB41,0x11D1,{0x8B,0x02,0x00,0x60,0x08,0x06,0xD9,0xB6}};
const GUID IID_Locator =
{0x76A6415B,0xCB41,0x11D1,{0x8B,0x02,0x00,0x60,0x08,0x06,0xD9,0xB6}};
LCID id;
//メソッドを実行する
HRESULT exec(IDispatch *p,OLECHAR *m,DISPPARAMS *s,VARIANT *r) {
  HRESULT retc = 0;
  DISPID disp = 0;
  retc = p->GetIDsOfNames(IID_NULL,&m,1,id,&disp);
  ...続きを読む

QC#で構造体の配列を持った構造体を使いたいのですが

C#で構造体の配列を持った構造体を使いたいのですが
Cならば
struct xyz {
struct abc _abc[32];
int index;
};
struct abc {
int a;
int b;
int c;
};

struct xyz _xyz[8];
xyz[0]._abc[3].b = 1;

のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません
うまくやる方法をどなたかご存知ないでしょうか

Visual Studio 2005行った場合
コンパイルで
構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します
となり

fixed をつけると

固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double

となってしまいます

C#で構造体の配列を持った構造体を使いたいのですが
Cならば
struct xyz {
struct abc _abc[32];
int index;
};
struct abc {
int a;
int b;
int c;
};

struct xyz _xyz[8];
xyz[0]._abc[3].b = 1;

のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません
うまくやる方法をどなたかご存知ないでしょうか

Visual Studio 2005行った場合
コンパイルで
構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するに...続きを読む

Aベストアンサー

C# では、配列は「単なる連続したメモリ領域」ではなくて「添字によってオブジェクトを格納できるオブジェクト」であることに注意しなくてはいけません。つまり、C では配列は一種の構造体でしたが、C# では配列は参照型のオブジェクトです。
よって、C のように予めサイズを固定しておくということは基本的にできません。配列の大きさは配列のインスタンスが作られるときに動的に決まります。

C# では、参照型のオブジェクトを構造体のメンバにすることはあまりありません。null 値の扱いが面倒だからです。
また、C# では構造体の大きさは大きくとも 20 バイト程度までにします。C# では基本的に「構造体へのポインタ」はありません。巨大な構造体をそのまま扱うのはメモリの使い方の観点からいって非効率的です。

今回の件では、構造体ではなくクラスにするのがよいかと思われます。

Qunsigned long long 型のフォーマット指定子

unsigned long long 型の変数の値を表示したいのですが、
フォーマット指定子は%ldですか?
よろしくおねがいします。

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

Qc#でコマンドプロンプトを実行する方法

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコードです。
 ※a.m4aをa.mp3に320kbpsのビットレートで変換するコマンドになります。

現状をまとめると以下のようになります。
(1)コマンドプロンプトを手動で起動して、以下のコマンドを打ち込むとうまく変換してくれる。
"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
(2)しかしこのコマンドを下記のコードで実行すると処理が行われない。
(3)そうなると下記のコード自体に問題があるように思われるが、
下記のコードで"dir c:\"など簡単なコマンドを実行すると成功する。

ダブルクオテーション(")やスペースなどに問題があるのかと思いいろいろと試してみましたがダメでした。
どうすれば下記のコードで"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"のようなコマンドを実行出来るのでしょうか?
実行する方法、もしくは違うコードで実行する方法などを知っておられる方、ぜひご教授ください!非常に困っております。


---------------------------------------------------------------------------------------------------
■コマンドプロンプトをC#上から実行するコード
http://dobon.net/vb/dotnet/process/standardoutput.htmlのコードの丸写し
---------------------------------------------------------------------------------------------------
//Processオブジェクトを作成
System.Diagnostics.Process p = new System.Diagnostics.Process();

//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
//ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)


//○成功する
p.StartInfo.Arguments = "dir c:\";
//×失敗する
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";


//起動
p.Start();
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//プロセス終了まで待機する
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
p.Close();

//出力された結果を表示
Console.WriteLine(results);
---------------------------------------------------------------------------------------------------

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコー...続きを読む

Aベストアンサー

>うまくいきません。

「なにが」「どう」「いまくいかない」んでしょうか?

プロセス起動した後に無反応になる?
プロセス終了した後に表示されるべきメッセージが表示されない?
プロセス起動できない?
起動したffmpeg.exeが終了しても戻ってこない?

参考ページではcmd.exeに/cオプションを指定しているようですが、
変更されたソースでは指定していないようで…。
その場合、
p.WaitForExit();
でちゃんと戻ってこれるんですかね?
# 起動したcmd.exe自体は終了していないはずですが…
# /Cも/Kも無かった場合ってどういう動作するんですかね?(Windows7 Pro 64Bitでcmd dirとしたら無視されてしまいましたが)

cmd.exe経由でなくても、必要条件満たせばffmpeg.exeの起動は可能と思いますよ。
ffmpeg.exeを利用するフロントエンドアプリなんかもそうしているでしょうし。
「ffmpeg.exe フロントエンド」で検索してみるとアプリは見つかるかと。

Qコマンドプロンプトでデバイスマネージャーのデバイス名取得方法

WindowsXPでコマンドプロンプトを用いて
デバイスマネージャより閲覧できる
デバイス名の取得方法を調べています。

デバイスマネージャーを起動すると
モデムに
 ★ IBM Integrated 56K Modem
と言うモデム名が表示されております。
(PC内蔵モデム)

またUSBカメラなどを接続すると
イメージングデバイスに
 ★ UCAM-N1D30 series
と言うUSBカメラ名が表示されるようになります。

コマンドプロンプトを用いて上記★の
 デバイス名を取得したいと思っております。

コマンドプロンプトより
modeと言うコマンドを使用すると
デバイスの状態などがわかりますが
接続されているデバイス名などを調べることが出来ませんでした。

どなたか知識を持ち合わせていましたら
ご教授ください。

よろしくお願いいたします。

Aベストアンサー

コマンドプロンプトで

powercfg /devicequery all_devices

と実行すると、現在システム上にあるデバイスをすべて列挙します。

QHANDLEの宣言でのエラー

現在C言語でプログラムを作成しています.
シリアル通信を行うプログラムなのですが,エラーが出てしまい,
ネットなどで検索してみたのですが,解決できませんでしたので,ご存知の方がいましたら,教えてください.
エラーは以下のとおりです.

[test.h]
#ifndef INCLUDED_TEST_H
#define INCLUDED_TEST_H

HANDLE handle;

HANDLE sirial(char ,char);

void sirial_(HANDLE);

#endif

上の用にヘッダファイルを作成し,グローバル変数の宣言・プロトタイプ宣言を行おうとすると型がHANDLEのところでエラーが出てしまいます.
main関数と同じファイル内で宣言,定義した場合はエラーはでません.
ヘッダファイルのように別ファイルに宣言するとエラーとなってしまうのです.

環境は
Windows XP SP2
visual studio .net
です.

よろしくお願いします.

Aベストアンサー

HANDLEはC言語の範囲内にはないから当然に宣言が必要ですよ。
通常はwindows.hの中で宣言していると思うので、test.hでwindows.hをインクルードするか、使う.cファイルの中でwindows.hをインクルードした後でtest.hをインクルードして下さい。

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

QC ファイル出力で、フォルダがない場合でも作成する方法

先日、皆さんに教えていただき

Cで出力ファイルを指定のフォルダに出す方法が上手く出来ました。
具体的には、↓こうやって指定しました。
sprintf( buff, "%s\\%s", path, filename );

やっていて思ったのですが、
この方法だと、指定フォルダが最初から無いとエラーが出てしまいます。
フォルダが無かったら、作成し、その中にファイルを出力していってくれる。という方法はできるものなのでしょうか?

もしできるようなら教えて下さい!!
よろしくお願いします!

Aベストアンサー

★回答ではないが余談。
・koko_u_ さんありがとう。
 気づくとアンダーバーの関数名で置き換わっているみたいですね。
 他にも気づくといろいろ置き換わっていますね。
 C 関数、最近使っていないのでアンダーバーの関数名で調べてみます。
・ありがとうございました。

●質問者さんへ。
・_mkdir() 関数が使える場合はその関数でもフォルダ(ディレクトリ)が作成できます。
 それでは。

参考URL:http://www5c.biglobe.ne.jp/~ecb/c/12_14.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報