• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:デバイスハンドルとは?)

デバイスハンドルとは?

このQ&Aのポイント
  • デバイスハンドルとは、PCMCIAカードを使ってシリアル通信のプログラムを作成する際に使用されるポインタ情報を含んだ変数です。
  • デバイスハンドルは、サンプルプログラムの関数呼び出し時に必要となります。
  • デバイスハンドルの値はWindowsのシステム情報を調べることで確認することができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

> このデバイスハンドルというのはどういうものなのでしょうか? Windows が管理しているリソース (この場合はデバイス) 情報へのポインタのようなものです. ハンドル (アスキー デジタル用語辞典) http://yougo.ascii24.com/gh/15/001551.html アプリケーションは直接その情報にアクセスするのではなく, Windows API 関数にハンドルを渡すことでアクセスします. > またこの場合のデバイスハンドルはどのように調べれば値がわかるのでしょうか? ハンドルは WinNT.h の中で,次のように定義されています. typedef void *HANDLE; ですから,アプリケーションがハンドルを普通のポインタのように参照して デバイス情報にアクセスすることはできませんし,してはいけません. 上に書いたように,デバイス情報を得る場合には専用の API 関数を使用してください. アプリケーションがハンドルの値を調べるのは,それが有効か否か (INVALID_HANDLE_VALUE (ハンドルの種類によっては NULL) と等しいか否か) を調べるだけにしてください. MSDN がインストールされていれば,COM ポート用に関連する API の一覧は, "Communications Functions" で検索すれば出てきます. これらを用いると,COM ポートの情報を取得・設定したり,制御したりすることができます.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • HANDLEの宣言でのエラー

    現在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 です. よろしくお願いします.

  • win32 スレッドのハンドルついて

    windowsのスレッドについての質問です。 今、手元にある書籍のスレッドを作る節にCreateThread()関数を使ってスレッドを作るサンプルプログラムが載っています。 その中では CloseHandle()関数が一切呼ばれていません。 しかも、そのサンプルではいくつもスレッドを作り、そのスレッドはプログラム中でいくつも終了するようなものです。CloseHandle()は呼び出さなくても問題ないのでしょうか? しかし、ネットで調べてみるとCloseHandle()を呼び出さなくてはいけないということが書かれていました。 http://www.daccho-it.com/program/WinApi/thread.htm ↑ 参考にしたサイト そこでいくつか質問です。 プロセスが終了するときにスレッドのハンドルは自動的に閉じられるという認識で大丈夫でしょうか? CreateThread()、_beginthreadex関数はCloseHandle()を呼び出す必要があるで大丈夫でしょうか? となると、CreateThread()の戻り値は必ず変数に保存しておく必要があるということですか? 書籍のサンプルではCreateThread()の戻り値はどこにも保存していませんでした、保存しない場合ハンドルが作られないってことはさすがにないですよね? よろしくお願いします。

  • init関数の意味

    C言語をメインで学習しているのですが、 よく変数の初期化のためにわざわざinitという関数を作って、それをmainの中で実行しているサンプルを見ます。 これだと変数はグローバル変数として宣言しなければいけませんし、init関数なんて作らなくても普通に変数をmainの中で宣言して、同時に初期化すれば良いのではと思ってしまいます。 一体何のためにわざわざinit関数を作るのでしょうか? また、別の質問なのですが、ポインタを使えばグローバル変数を使う必要はないような気がしていて、逆にポインタを使うのが面倒なときでも、グローバル変数で代用できてしまう気がします。 それぞれを使うときのメリット、デメリットがあれば教えていただきたいです。

  • 関数 左辺値 参照 返り値 

    こんにちは。宜しくお願い致します。 > たとえば,下のサンプルプログラムでは関数fが参照を返すようになっているため,この関数fを代入の左辺においた,f(a, n) = 10;のような式が許される. > > #include <iostream> > using namespace std; > > int& f(int* a, int n) > { (2)~ return a[n]; > } > > int main(void) > { > const int n = 5; > int arr[n] = { 1, 2, 3, 4, 5 }; (1)~ f(arr, 3) = 10; > for (int i = 0; i < n; ++i) > cout << arr[i] << endl; > return 0; > } 上のサンプルプログラムで左辺値に参照を返す関数が(1)~あるのですが 動作が分りません。 関数内部の(2)~return a[n];というところで、関数の返り値int&の参照はa[n]という変数になるので、(1)~の結果としてa[n]に10が代入されるのでしょうか?教えてください。

  • 関数ポインタの利点

    こんにちは。 C言語初心者ですが今勉強中です。 その中でポインタについては理解できたのですが、 関数ポインタの利点、使うべき所などが理解できません。 ポインタの基本は理解しています。 値渡し、アドレス渡しも理解しています。 関数ポインタを使うと何がいい、またはどんなとき使わなければならないのか 教本を読んでいてもさっぱりわかりません。 サンプルプログラムを打っても何のために使ってるのかわからないです。 どなたか教えていただけませんでしょうか? よろしくお願いします。

  • C言語でマウスカーソルハンドル取得方法

    GetCursor HCURSOR GetCursor(VOID); 現在のマウスカーソル( マウスポインタ)のハンドルを取得するプログラムをC言語で書きたいのですが、初心者でまったく分りません。 教えて下さい。

  • C言語 関数の戻り値と自動変数

    かなり基礎的な質問になるのですが、疑問に思うことがあり、質問をさせていただきます。 関数内で宣言した変数を戻り値として使う場合ですが、ポインタなどではなく実体の場合でも、静的変数として宣言をしたほうが良いのでしょうか? 現実的に考えると、プログラムが関数から出て、呼び出した側の関数が戻り値を受け取るまでの瞬間に、その領域が書き換えられる可能性は極めて低いと思うのですけど、C言語の仕様としてはどうなのでしょうか? 関数内で宣言した戻り値に使う変数には、必ずstaticをつけた方が良いのでしょうか? もしおわかりでしたら教えて下さい。

  • Javaでポインタ的なことはできるか?

    JavaでC言語のようにポインタを使おうとしたらJavaには ポインタが表面上はサポートされていないことを知りました。 関数を呼び出した際に、呼び出し元の変数に影響を与えるようなプログラムは Javaで作れるのでしょうか? 例えば、以下のプログラムはCで関数を呼び出した際に呼び出し元の 変数の中身を関数内で書き換えてしまうプログラムです。 こういうことをJavaでするにはどう書けばよいのでしょうか? もしこういうことができないのであれば、Javaにはポインタに代わるやりかたがあるのでしょうか? 実行結果: 1 10 #include <stdio.h> void func( int *n ){   *n = 10; } int main(){   int n = 1;   printf("%d ", n );   func( &n );   printf("%d ", n ); }

    • ベストアンサー
    • Java
  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • WinUSBを用いた複数デバイスとの接続について

    お世話になります。 デバイス(CY3684 EZ-USB FX2LP Development Kit)と、私が作成したWinUSB のソフトウェアを使って、USBの通信を確立させることができました。 しかし、1台のPCで同デバイスを2台以上つなげた場合、 接続させる順番によって、接続が確立されたり、されなかったりします。 --------- ex) 簡単ですが例を... ・PC ・USBデバイスA ・USBデバイスB 1. PCとUSBデバイスAを接続 -> OK 2. PCとUSBデバイスBを接続 -> OK 3. PCとUSBデバイスA、Bを切断 -> OK 4. PCとUSBデバイスBを接続 -> OK 5. PCとUSBデバイスAを接続 -> NG ⇒ WinUSB関数でHandle取得に失敗 ※ PCのUSB接続ポートは変更していません # これ以降、必ずUSBデバイスA、Bの順番に接続しないと、 # 必ず接続(Handle取得)に失敗してしまいます --------- また、上記4のところで、PCとUSBデバイスAを接続、PCとUSBデバイスBを接続 という順序で接続すれば、問題なくHandleも取得でき、通信も出来ました。 原因を調べていましたら、iSerialNumberによって、この問題が回避 できる?といった情報を入手したのですが、よくわかりませんでした。 (EZ-USBのデスクリプタの設定値を変更するってことでしょうかね?) ただ、EZ-USBのiSerialNumberのデフォルトは0でした。 本現象について、WinUSBのインストールの失敗(infファイルの作成ミス) なのか、そもそもEZ-USBでは、複数台を接続するには正しい順序が必要 なのか迷走しております。 どの順序でデバイスと接続しても確立させる方法について、 何かアドバイスを頂ければ幸いです。