人に聞けない痔の悩み、これでスッキリ >>

USB-シリアルの変換ケーブルをパソコンにつないだとき、COMポートが設定されるが、そのポート番号をソフトで知る方法はありますか?そのような関数は存在しますか?
言語はC#です。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

.NET Framework 2.0上ならば、SerialPortクラスのGetPortNamesメソッドにて


使用可能なポート名を取得できます。

すべてのシリアル・ポートの名前を列挙するには?[2.0のみ、C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/523 …

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/523 …
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

Q仮想COMポートの仕組みについて

仮想COMポートの仕組みについて調査しています。

具体的には、仮想COMポートの仕組みを理解し、実際に実装ができるように調査しています。仮想COMポートの仕組みについて教えていただけないでしょうか。

また、仮想COMポートをC言語で実装する場合、参考となる文献や、Webサイトなどあれば教えていただけないでしょうか。

よろしくお願いします。

Aベストアンサー

仮想プリンタでも仮想ドライブでも何でもそうですが、実際のものとは別のものに置き換えるというのが大前提です。

>仮想COMポートの仕組みについて教えていただけないでしょうか。

というのでしたら、仮想COMポートに送られた信号を、別のものにする、別のものから渡されたデータを仮想COMポートから出力する。といったところでしょうか。

ここでいう「別のもの」というのが、仮想プリンタですとpdfなどの印刷イメージファイル、仮想CDROMドライブですとisoイメージ、仮想プライベートネットワーク(VPN)ですと、特殊なパケットといったところでしょうか。

つまり、いきなり仮想うんたらとかいきなり言われても、これぐらいしか説明できません。


>また、仮想COMポートをC言語で実装する場合、参考となる文献や、Webサイトなどあれば教えていただけないでしょうか。

普通のアプリか何かと勘違いされていませんか?
COMポートはハードウェアなんで、それを仮想化するとなると作らなければいけないのはドライバなんですけど(^^;;;

プラットフォームも何も書かないで、いきなりサンプルとか言われてもねぇ。

WindowsでしたらDDKにCOMポートのドライバのサンプル、あると思いますが。

仮想化なんてのは、入出力先を本物のデバイスではなく別のものにするだけなんですから。apple-orangeさんが何に置き換えるかはわかりませんが。

仮想プリンタでも仮想ドライブでも何でもそうですが、実際のものとは別のものに置き換えるというのが大前提です。

>仮想COMポートの仕組みについて教えていただけないでしょうか。

というのでしたら、仮想COMポートに送られた信号を、別のものにする、別のものから渡されたデータを仮想COMポートから出力する。といったところでしょうか。

ここでいう「別のもの」というのが、仮想プリンタですとpdfなどの印刷イメージファイル、仮想CDROMドライブですとisoイメージ、仮想プライベートネットワーク(VPN)...続きを読む

QCOMポート 名前を取得する方法

VC++2008Express Win32Api
COMポートの名前Portnameを調べて
Listboxに表示させたいと思います。

以下のようにレジストリからフレンドリーネームとかは
取得できるようになったのですが
レジストリのフォルダのVIDとかなんちゃらの部分の値は取得できるのですが
その1階層下のParameterの中にあるPortNameを取得したいです。
要するにCOM6などの部分だけが欲しいです。
どなたか、ご教示ください。よろしくお願いします。

BYTE Buffer[256];
DWORD Length = 0;

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};

HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT,
NULL,
NULL,
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));

int ret = SetupDiEnumDeviceInfo( hDevInfo, 0, &DeviceInfoData );

SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
NULL, Buffer,sizeof(Buffer),&Length );


MessageBox( NULL,(LPCWSTR)Buffer , 0 , MB_OK );

SetupDiDestroyDeviceInfoList(hDevInfo);

VC++2008Express Win32Api
COMポートの名前Portnameを調べて
Listboxに表示させたいと思います。

以下のようにレジストリからフレンドリーネームとかは
取得できるようになったのですが
レジストリのフォルダのVIDとかなんちゃらの部分の値は取得できるのですが
その1階層下のParameterの中にあるPortNameを取得したいです。
要するにCOM6などの部分だけが欲しいです。
どなたか、ご教示ください。よろしくお願いします。

BYTE Buffer[256];
DWORD Length = 0;

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_D...続きを読む

Aベストアンサー

このページの情報ではいかがでしょうか。
http://ttssh2.sourceforge.jp/manual/ja/reference/sourcecode.html#serial

QVC++でRS232C(COMポート通信)

VC++でRS232C(COMポート)通信をするソフトを作成していますが、COMポートが開けず通信ができません。ポートが開けない理由を追跡する方法はありますか?

Aベストアンサー

> この段階ではまだCOMポートに何かしらの電気信号は出ないのでしょうか?

オープンに失敗している以上出ないはずです.
(他のアプリケーションが使用していなければ.)

端末ソフトでオープンすることはできましたか?


> 外付けCOMポート

ということは USB 接続とか,PCMCIA カードとかですか?
それだと内蔵ポートと少し事情が異なるかもしれないので,
まず内蔵ポートがオープンできるか確認してください.

(RS-232C ではありませんが,以前 USB 接続の仮想 COM ポートを使った時,
 どの USB コネクタに挿すかでポート番号が変わったことがありました.)

QVB.netで、シリアル通信のタイムアウト処理について

VB.netで、シリアル通信のタイムアウト処理について

http://msdn.microsoft.com/ja-jp/library/7ya7y41k.aspx
このサイトのコードを、参考にしています。
------------------------------------ここから
Dim com1 As IO.Ports.SerialPort = Nothing
Try
com1 = My.Computer.Ports.OpenSerialPort("COM1")
com1.ReadTimeout = 10000

Catch ex As TimeoutException
returnStr = "Error: Serial Port read timed out."
Finally
If com1 IsNot Nothing Then com1.Close()
End Try

------------------------------------ここまで

この方法ですと、タイムアウトが発生したらポートを閉じるようですが、これを、送信したシリアルのデータを再度、送信させたいと思います。
そして、何度かリトライを掛けた後に、やっぱり駄目だったときに
ポートを閉じたいと思います。

どんな方法がありますか?

参考になりそうなサイトなどがありましたら、教えていただけませんか。
以上、よろしくお願いします。

VB.netで、シリアル通信のタイムアウト処理について

http://msdn.microsoft.com/ja-jp/library/7ya7y41k.aspx
このサイトのコードを、参考にしています。
------------------------------------ここから
Dim com1 As IO.Ports.SerialPort = Nothing
Try
com1 = My.Computer.Ports.OpenSerialPort("COM1")
com1.ReadTimeout = 10000

Catch ex As TimeoutException
returnStr = "Error: Serial Port read timed out."
Finally
If com1 IsNot Nothing Then com1.Close()
End Try

----------------...続きを読む

Aベストアンサー

タイムアウトはWrite/Read(送受信)系メソッドで
発生します。そのメソッドをTry~Catchブロックで
ハンドリングしないと意味ないでしょ。
掲題のプログラムはポートを開いて、タイムアウトの
時間を設定しただけですから、送受信していません。

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む

QCOMポートの同時オープン同時読み込み

お世話になります。RS232機器で同じ仕様の計測機器を
つなげて、同時に測定をしたいと考えています。
WindowsXPでVC++で作成します。
CreateFile,ReadFileで実現するかと思うのですが、
プログラミング上、まったく同一時刻に二つのCOMを
開くことは現実不可能でしょうか?
正確にいうと、同一時刻に一定量蓄積された2つのCOMバッファ
から同時にPCのメモリに展開するという処理です。

計測機器同士は、シンクロケーブルがありますので
ハードウェア的にタイミングを合わせて、データ出力してきます。
ということは、パソコン側では理論的にCOM1、COM2に接続された
機器からは、データが一定量蓄積される時間はともに一定時間
であるといえます。
逆にいうと、COM1、COM2からデータを同時にぬきとって
やらなければ、のちのちCOM1のバッファとCOM2のバッファ
でずれが生じてくるはずです。

たとえばDSPなんかですと、パイプ命令てのがあり
CreateFile("COM1"...) | CreateFile("COM2"...)
とすることで、2つの命令を同じ時刻にスタート可能だと
思います。(DSPにCreateFileのような命令はないですが)

また、スレッドを使うという考えもありましたが、自分自身、
スレッドに対する知識がとぼしくて・・・

こうした処理をする際、ソフトウェアでの処理というのは
事実上不可能に見えてきますが、実際はなにか回避策というか
解決策があるのでしょうか?

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

お世話になります。RS232機器で同じ仕様の計測機器を
つなげて、同時に測定をしたいと考えています。
WindowsXPでVC++で作成します。
CreateFile,ReadFileで実現するかと思うのですが、
プログラミング上、まったく同一時刻に二つのCOMを
開くことは現実不可能でしょうか?
正確にいうと、同一時刻に一定量蓄積された2つのCOMバッファ
から同時にPCのメモリに展開するという処理です。

計測機器同士は、シンクロケーブルがありますので
ハードウェア的にタイミングを合わせて、データ出力してきます。
...続きを読む

Aベストアンサー

方法1)
専用ケーブルを作成する。

●参考サイト
シリアルはWINで行こう(T接続の方法)
http://kencreate.ld.infoseek.co.jp/ita/debugc.htm


方法2)
スレッドを使って、WaitCommEvent()で受信を待つ。そして、PostMessageでイベントを発生させる。

●参考サイト
WindowsでRS232Cを使う(イベント駆動を使った通信の例)
http://members.jcom.home.ne.jp/0434383301/vc10.htm

ソース一式ダウンロードが可能です。
下記のようにすると、ReadFile、WriteFileで時間待ちせずに抜けてきます。

CreateFile(PortName[CommPort] ,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);

ReadFile(h_CommHandle,RecBuf.GetBuffer(Comstat.cbInQue),Comstat.cbInQue,&NoOfByte,&recop);

WriteFile(h_CommHandle,Msg,Msg.GetLength(),&NoOfByte,&sendop);

::PostMessage(vhWnd,WM_READ_END,0,0);

方法1)
専用ケーブルを作成する。

●参考サイト
シリアルはWINで行こう(T接続の方法)
http://kencreate.ld.infoseek.co.jp/ita/debugc.htm


方法2)
スレッドを使って、WaitCommEvent()で受信を待つ。そして、PostMessageでイベントを発生させる。

●参考サイト
WindowsでRS232Cを使う(イベント駆動を使った通信の例)
http://members.jcom.home.ne.jp/0434383301/vc10.htm

ソース一式ダウンロードが可能です。
下記のようにすると、ReadFile、WriteFileで時間待ちせず...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qmfc42.dllファイルってなんですか?

こんにちは。
最近、プログラムの勉強をしている物ですが、例えばVBであるシステムを開発して、SetUpを作った際に、色々なプラットフォームで検証するのですが、mfc42.dllというファイルが絡んだエラーが良く出ます。

そもそも「mfc42.dll」とは何でしょうか?
OSインストール時に最初から入っているものなのでしょうか?

dllファイルとはダイナミックリンクライブラリの事で、OSが色んな時に使用する共通の関数が詰まっている、VBでいう標準モジュールのようなものの事ですよね?(合ってますか(^^;)?)

mfc42.dllがそうなら、どういうときに使用されるのでしょうか?
また、Aというソフトをインストールした後で、Bというソフトをインストールして、互いのmfc42.dllの更新日時(バージョン?)が違う場合、Bをインストールする事によってAが動かなくなる・・・というのもありえるのでしょうか??
だとしたらとても怖い事ですよね!?
でもSetUp作成ソフトやVB標準のディストリビュージョンでSetUp.exeをつくると勝手にmfc42.dllが紐付かれてしまう場合が多々あります。
これを回避する方法はあるのでしょうか?

どなたかご教授下さい。

こんにちは。
最近、プログラムの勉強をしている物ですが、例えばVBであるシステムを開発して、SetUpを作った際に、色々なプラットフォームで検証するのですが、mfc42.dllというファイルが絡んだエラーが良く出ます。

そもそも「mfc42.dll」とは何でしょうか?
OSインストール時に最初から入っているものなのでしょうか?

dllファイルとはダイナミックリンクライブラリの事で、OSが色んな時に使用する共通の関数が詰まっている、VBでいう標準モジュールのようなものの事ですよね?(合ってますか(^^;...続きを読む

Aベストアンサー

Visual C++ 4.2~6.0 で作成したランタイムライブラリプログラムの実行に必要なDLL で、最新版をダウンロードしてエラーが直る場合もあるようです。

参考URL:http://www.vector.co.jp/soft/win95/util/se040499.html


人気Q&Aランキング