はじめまして。
大変困っております。

WIN32APIの『EnumPrinters』を使用して、コンピュータ上に登録されているプリンタの一覧を表示するプログラムを作っております。
プリンタの登録数が50個以上になるとプログラムがハングアップします。『EnumPrinters』の情報(障害情報も含む)があまりにも少なすぎて、困っております。

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

A 回答 (1件)

たしかに、EnumPrintersに関する情報は少ないかもしれませんね。



どのような処理を記述しているのか、そしてどういうエラーなのかがわからないので
的を得た回答ではないかもしれませんが、一応思いつくことを書きます。

EnumPrinterにはプリンタの情報を呼び元で捕捉した領域に書き込みますが、この
領域が少ないとエラーになって、その際には必要な領域の数を返します。なので、
戻り値がエラーになったら、再度mallocとかでプリンタの情報を格納する領域を
捕捉しなおして再度EnumPrintersを起動すれば回避できるものと思われます。
    • good
    • 0

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

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

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

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

Qプログラム言語とAPI(windows API)の関係は?

プログラミング言語といってもいろいろありますが、
このそれぞれのコンパイルでは、オブジェクトコードをつくっているのですよね?

APIは、どこでプログラミング言語と関係しているのでしょうか?

コンパイルでは、APIに直してからコンパイルしているのでしょうか?

Aベストアンサー

Win32API(DLL群)は
DLL(ダイナミックリンクライブラリ)の名の通り
動的にリンクして動作しています。
静的リンクとは違います。

QC++ API 全般 APIの概要は

独学にてプログラミングを勉強しているのですが、いきづまってしまったので質問お願いします。

※Visual Studio 2008 Express Editionsを使用しています。

まだプログラミングに関しての勉強を始めて1ヶ月程度で、最初はVB.NETから始めて、最近C++に乗り換えました。
趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。)
まったく1からのスタートで、現在win32コンソールアプリケーションにてコードの勉強をしているところです。

勉強に使っている参考文献は
・VisualC++.NET逆引き大全500の極意
・ゲームプログラマになる前に覚えて起きたい技術(これを買うには早すぎたようです…。第一章も半分くらいしか理解できません…。)

サイトは
・主に「0からのゲームプログラミング」というサイトです。
http://www.plustarnet.com/aspil/Programming/



本題の質問ですが、APIというものがいまいち理解できません。
(1)上記のような目的で使用するAPIは、標準 Windows APIというものでいいのでしょうか?

(2)win32コンソールアプリケーションでは実行できるのに、win32プロジェクトでは実行できないのはなぜでしょうか?
#include<windows.h>

int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
MessageBox(NULL , TEXT("Hello Wold!") ,
TEXT("メッセージボックス") , MB_OK);
return 0;
}

(3)http://www.plustarnet.com/aspil/Programming/CConsole.htm
このURLのコンソールAPIというのは、一般的に使われているものでしょうか?それともこのサイトのオリジナルのものでしょうか?win32コンソールアプリケーションでAPIを使うには、このURLのCConsoleクラスとうものをインクルードしないといけないのでしょうか?#include<windows.h>と宣言することによって気軽に使いたいものを使うことはできないのでしょうか?

(4)#include<windows.h>
とした場合、作るものが「win32コンソールアプリケーション」だったり「win32プロジェクト」だったり「windowsフォームアプリケーション」だったりで、使用方法などがまったく別になってしまうのでしょうか?

(5)そもそも、上記の目的の場合APIを勉強する必要はあるでしょうか?

(6)勉強をしたほうが後々に役立つ場合、どのAPIを勉強するのがいいのでしょうか?(APIといっても様々なものがあるんだなと思い質問しました。もし勘違いでAPIというものは一つしかないとしたらすみません。)


なぜAPIに関してかというと、単純に上記のサイトで言語編の一番上から順に見ていったからです。
初心者すぎて質問が的外れかもしれませんがよろしくお願いします。

独学にてプログラミングを勉強しているのですが、いきづまってしまったので質問お願いします。

※Visual Studio 2008 Express Editionsを使用しています。

まだプログラミングに関しての勉強を始めて1ヶ月程度で、最初はVB.NETから始めて、最近C++に乗り換えました。
趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。)
...続きを読む

Aベストアンサー

まず"API"というものそのものについてわかっておられないようです。

現在のプログラミングは非常に複雑化してきました。
また、(特にプロフェッショナルな場合)納期も短期化してきています。

そんなわけで、プログラミングも一から全て作るのは非現実的な状態です。
誰かの作ってくれたものを利用する場面が非常に多くなりつつあります。
(並行して開発する場合も多くあります)

その際、
どのような物(関数でも良いし、クラスとかでも良い)をどうやって
(パラメータとか呼び出し順序とか)
使うか
を定めておかないと、利用しようにも利用できませんよね。
この定めた規約のことをAPIと呼びます。

Windowsには
・ファイルを操作する関数
・画面にグラフィックを描画する関数
等々様々なものが提供されています。

たとえば、ファイルを操作するには
CreateFileで開き、ReadFileで読み込み、WriteFileで書き込み
CloseHandleで閉じる
という手順が定められています。
この規約は”Win32API”と呼ばれます。
CreateFileなどWin32で定められた個々の関数は
Win32API関数
と呼ばれます。

Windows上で動くプログラムは基本的には
Win32APIを利用します。

しかし、Win32APIには色々不便な点も多く、
それを補うものが作られてきました。
DirectXもその一例です。
もちろん、DirectXも(ごみではなく)"利用される"ために作られたものですので
Win32API同様、利用するための規格(API)があります。
Direct X APIと呼ばれたりします。

ですから
(1)はWin32APIです
(2)は明らかに逆です。
   Win32プロジェクトとは通常のEXEの他にDLL(EXEのための部品です。単独では動きません)など様々な開発を行えます。コンソール専用ではないので、
コンソール用の設定がされていません。したがって、コンソールのソースを持ってきただけでは動作するようになりません。
(自分でプロジェクトの設定を行えばコンソールアプリになります)

(3)についてはそのサイト専用です
ピンク色の部分をコピーしてConsole.hという名称で保存してください。
そして#include "Consol.h"
すれば自動的にWindows.hも取り込まれます。
別途Windows.hを取り込む必要はありませんし
Windows.hで定義されているものは自由に使えます

(4)win32コンソールアプリケーションとWindoiws プロジェクトの違いについては
先に述べましたので省略します。
"Windows フォームアプリケーション"とは
".NET (ドット ネット)"という新しい技術に基づくものです。
今までのWin32APIとは別物です。
当然APIも異なります。
原則的にはWin32APIは利用できません。
(C++/CLIという方法で利用できますが、それなりの設定が必要です)

(5) 目的に合ったAPIを勉強する必要があります。
先ほどものべましたが".NET"を使うには
Win32APIとは別の知識が必要です。
逆に、".NET"の知識しかない場合、Win32コンソールアプリは作れませんので
Win32APIを勉強しなくてはなりません。
もっとも、これは厳密な言い方ではありません。
Cの標準関数で収まる範囲であれば、Win32APIの知識は不要です。

(6)
既に述べています。
APIはたくさんあります。
あなたも、たとえばWin32プロジェクトでDLLを作成する場合、
どのように利用するかを考えてAPIを定める必要があります。

まず"API"というものそのものについてわかっておられないようです。

現在のプログラミングは非常に複雑化してきました。
また、(特にプロフェッショナルな場合)納期も短期化してきています。

そんなわけで、プログラミングも一から全て作るのは非現実的な状態です。
誰かの作ってくれたものを利用する場面が非常に多くなりつつあります。
(並行して開発する場合も多くあります)

その際、
どのような物(関数でも良いし、クラスとかでも良い)をどうやって
(パラメータとか呼び出し順序とか)
使...続きを読む

QWin32APIプログラムで困っています

Win32APIプログラムで困っています

僕は、C言語とともにWin32APIを勉強し始めたプログラム初心者です。
Visual Stdio 2008を使ってコンパイルと実行をしています。

今回自分でプログラムを作ろうと頑張っていたのですが、どうしても上手くいかないところがあるので、みなさんの力を借りたくて投稿しました。

初期化ファイルを使って設定を保存するというものなのですが、保存する際に以下のような関数を作りました。

#define SYSTEMFILE TEXT("system.ini")

TCHAR JapaneseSentenceKey[100][15] = {{TEXT("Japanese1")}, {TEXT("Japanese2")}, {TEXT("Japanese3")}, {TEXT("Japanese4")}, ~}}と100まであります。

TCHAR RomaSentenceKey[100][15] = {{TEXT("Roma1")}, {TEXT("Roma2")}, {TEXT("Roma3")}, {TEXT("Roma4")}, ~}}と100まであります。

void WriteSentence()//文のかきこみ
{
int i, number;
TCHAR szBufJapanese[200], szBufRoma[200], szBufFileName[20], szBuf[200];
GetWindowText(hChildWindow.hEditJapanese, szBufJapanese, 199);
GetWindowText(hChildWindow.hEditRoma, szBufRoma, 199);
GetWindowText(hMain, szBufFileName, 19);

for(i = 0; i < 100; i++){
GetPrivateProfileString(szBufFileName, JapaneseSentenceKey[i], TEXT("nothing"), szBuf, (DWORD)sizeof(szBuf), SYSTEMFILE);
if(szBuf == TEXT("nothing")){
number = i;
break;
}
}

WritePrivateProfileString(szBufFileName, JapaneseSentenceKey[number], szBufJapanese, SYSTEMFILE);
WritePrivateProfileString(szBufFileName, RomaSentenceKey[number], szBufRoma, SYSTEMFILE);

return;
}

このような関数です。

エディトコントロールから保存する文字列、タイトルからセクション名を取得します。

そして、for文の中でGetPrivateProfileString関数を使い初期化ファイルのキー名を調べ、そのキー名がないところでfor文のループを抜け出し、そのときのiの値をnumberに保存し、そのnumberの値のキー名のところにエディトコントロールから取得した文字列を保存するというものです。

想定としては、これでこの関数を呼び出すたびにデータのないところに保存されていく関数として作りました。

しかし、実際実行してみると、同じキーのところに何回も保存されていっこうに次のキーに保存しようとしてくれません・・・。
どうしてでしょうか・・??。

一生懸命考えたのですが、全くわかりません・・。
初期化ファイル自体に問題があるのでしょうか?

もしかしたら、単純ミスかもしれませんが、初心者ですので勘弁してください。

今回が質問初めてなので、色々と至らないところがありますが、何卒よろしくお願いします!!
長文失礼しました。

Win32APIプログラムで困っています

僕は、C言語とともにWin32APIを勉強し始めたプログラム初心者です。
Visual Stdio 2008を使ってコンパイルと実行をしています。

今回自分でプログラムを作ろうと頑張っていたのですが、どうしても上手くいかないところがあるので、みなさんの力を借りたくて投稿しました。

初期化ファイルを使って設定を保存するというものなのですが、保存する際に以下のような関数を作りました。

#define SYSTEMFILE TEXT("system.ini")

TCHAR JapaneseSentenceKey[100][15] = {{TEXT("J...続きを読む

Aベストアンサー

if(szBuf == TEXT("nothing")){
が意図したとおりに動作しない原因のようですね。
szBuf の先頭アドレスと、文字列 TEXT("nothing") の先頭アドレスとの比較になっています。(当然、FALSE となります。)
_tcscmp() 等で比較を行いましょう。

QC#で作成したプログラムのAPIリファレンスを作成したい

はじめまして。
現在OSがWindows Vistaで、IDEがVisual Studio 2005 Express Edition
を利用して、C#でアプリケーションを作成していまして、
コードにXMLコメントを挿入しています。それで、そのXMLコメント
を利用してAPIリファレンスみたいなものを作りたいのですが
どなたかよいツールをご存じないでしょうか。アドバイスお願いします。

Aベストアンサー

「SandCastle」自体はご存知のようですね。
他で質問されている「sandcastleでヘルプ画面が表示されません。 」に関しては
最近は使ってないのでわかりません。
以前のバージョンでは私自身Sandcastle Help File Builder を使って
問題なくchmファイルを出力できていました。
ちなみSandcastleで生成したchmファイルですが
samba上の共有ファイルからは閲覧できず
ローカルにコピーしないと閲覧できなかった覚えはあります。

QWin32APIを使って入力されたキーによって表示する画像を変えるプログラムについて

Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、
上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SelectObject(hMemdc,hbitmap);
GetObject(hbitmap,sizeof(BITMAP),&bitmap);
BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); }
という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、
上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LO...続きを読む

Aベストアンサー

hbitmapにビットマップのハンドルは取得できているのでしょうか

どこまで実行が期待通りになっているのかを確かめましょう

普通は WndProcのswitch(message)のWM_KEYDOWNの処理でwParamが'A'ならば
hbitmap = LoadImage( NULL, "ファイルパス", IMAGE_BITMAP,
  0, 0, LR_LOADFROMFILE );
を実行

WM_PAINTの処理で
if ( hbitmap != NULL ) {
  hOld= (HBITMAP)SelectObject( hMemdc, hbitmap );
  BitBlt( paintdc, 0, 0, 350, 476, hMemdc, 0, 0, SRCCOPY );
  SelectObject( hMemdc, hOld );
}
といった具合で 使うオブジェクトのハンドルを確かめて使いましょう


人気Q&Aランキング

おすすめ情報