• 締切済み

未サポートAPIを使用した時のエラー処理

最低サポートバージョンがWindows VistaのWindowsAPIを使用したアプリケーションを、Windows XPなどの最低サポートバージョン以下のWindowsで実行した場合、対象のAPIがDLL内にないことを示すエラーメッセージダイアログボックスを出力して、異常終了します。 本来は、最低サポートバージョンのWindowsでアプリケーションを実行した場合、対象のAPIが実行される処理を通った時だけ、独自のエラー処理を実行したいのですが、このようなことは不可能なのでしょうか? <開発環境> ・Visual Studio 2008 ・VC6.0 ・コンソールアプリケーションとして作成

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>最低サポートバージョンのWindowsでアプリケーションを実行した場合、対象のAPIが実行される処理を通った時だけ、独自のエラー処理を実行したいのですが、このようなことは不可能なのでしょうか? LoadLibrary()でdllを読み込ませて、GetProcAddress()でAPIのアドレスを取得できます。 それぞれでエラー処理できるはずです。 XPで実行したときにVista以降にしかないdllならLoadLibrary()でエラーになりますし、APIが無ければGetProcAddress()でエラーになります。 検索してみるとそういう処理の仕方を解説しているページは見つかるかと。 APIの中身が無い(何もせずに戻ってくるだけ)という場合もありますが。

関連するQ&A

  • C++ 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に関してかというと、単純に上記のサイトで言語編の一番上から順に見ていったからです。 初心者すぎて質問が的外れかもしれませんがよろしくお願いします。

  • Windows APIのGetOpenFileNameで呼び出せるダイアログを改造できないでしょうか?

    添付という形にすると勝手に再変換されて画像がかなり見づらくなってしまうようなので 添付ではなく別途アップへのリンクとさせてください。 今のところVC++2008EEを使ってWindows XPでアプリケーションを開発しています。 よほどメモリの断片化が進むような長時間使用しなければ .NET FrameWorkを完全に使用せず全部ネイティブで組んだほうが、実行時については 様々な面でパフォーマンスが良い場合が多いようなので できればマネージコード0でアプリケーションを完成させたいのですが Windows APIと.NET Frameworkにおいて、様々な場面で「デフォルトのデザインが違う」ようです。 簡単なものなら自作したりコモンコントロールにSendMessageやプロシージャをフックしたりでいいと思ったのですが オープン(セーブ)ファイルダイアログは、通常商用ソフトとかだと1から自作する事があるようなものなのでしょうか? http://www.geocities.jp/shank_long7_02/FileDialog/a.html こちらの画像の一番上がWindowsAPIのGetOpenFileNameで呼び出したダイアログで 真ん中がマネージなSystem::Windows::Formsの OpenFileDialogの場合で 一番下はPhotoshop CS3の別名保存用ダイアログです。 見たところこれは上がSaveFileDialogと一致してて、その下がカスタマイズされてるような感じですね。 現状のWindowsAPIを上記SendMessageやプロシージャのフックなどでちょこちょこっといじって.NET的なデザインにしたり、Photoshopのやつみたいにサイズを変えてその下に自分で好きな物を付け加えたりといったことは可能なのでしょうか? それとも、そういったことをやろうとした場合は1から作るか、混在させるかしかないのでしょうか?

  • iostream インクルード時に発生するエラー

    C++ の勉強をするためにVisualStudio2008にて下記コードをビルドしたのですが、エラーが発生してビルドが失敗しました。 ■ コード #include <iostream> using namespace std; int main() { std::cout << "Hello World !"; return 0; } ■ 操作 空のコンソールアプリケーションを作成し、ソースファイルに追加>新しい項目 にて "temp.cpp" を追加、コードを入力。その後 ビルド > ソリューションのビルド を実行。 ■ エラー(一部) >> 「説明」 列 warning C4985: 'strlen': 前の宣言に属性が存在しません。 error C2039: 'wmemcpy_s' : '`global namespace'' のメンバではありません。 error C3861: 'wmemcpy_s': 識別子が見つかりませんでした error C2039: 'wmemmove_s' : '`global namespace'' のメンバではありません。 error C3861: 'wmemmove_s': 識別子が見つかりませんでした error C2039: 'memcpy_s' : '`global namespace'' のメンバではありません。 error C3861: 'memcpy_s': 識別子が見つかりませんでした error C2039: 'memmove_s' : '`global namespace'' のメンバではありません。 >>対応する「ファイル」列 d:\program files\microsoft visual studio 9.0\vc\include\exception d:\program files\microsoft visual studio 9.0\vc\include\iosfwd d:\program files\microsoft visual studio 9.0\vc\include\iosfwd d:\program files\microsoft visual studio 9.0\vc\include\iosfwd d:\program files\microsoft visual studio 9.0\vc\include\iosfwd d:\program files\microsoft visual studio 9.0\vc\include\iosfwd d:\program files\microsoft visual studio 9.0\vc\include\iosfwd d:\program files\microsoft visual studio 9.0\vc\include\iosfwd プロジェクトのプロパティやインストール時の構成などで何か問題があるのでしょうか。VisualStudio以外にはWindows SDK 、Windows SDK 6.0A、SQL Server2005などが導入されています。 再インストールするのもありかと思ったのですが、原因が分からないとまた同じ現象が発生しそうなため踏み切れません。 よろしくお願いします。

  • キーボードを押すまで処理を中断させる方法

    VC++6.0を(初心者なのに)無謀にも購入したんですが、 クラスというのが全く理解できなかったのでコンソールアプリケーションから 作って見る事にしました。で、とりあえず、しょぼいのが出来たんですが キーボードを押すまで処理を中断させる方法と、処理が終わった後キーボードを押すまでウインドウを閉じないようにする方法がわかりません。 初歩的な事でしょうが、初心者の私にはどこをどう調べたら良いかわからず困っています。どうかよろしくお願いします。

  • 推奨書籍を教えてください

    こんにちは。 Visual C++.NET2003を用いてプログラミングを行っています。しかし、コンパイラとして使用しているだけでダイアログボックスやボタンなどのビジュアル的なプログラミングはしておらず、C言語によるコンソールアプリケーションを作っています。 今後も、マルチスレッドなどのプログラムを、コンソール上でプログラミングしていきたい思っています。しかし、本のサンプルプログラムを見ても、だいたいはウィンドウベース(ボタンやマウスクリック、ダイアログボックス)でのマルチスレッド処理等が記載されており、コンソール上でのAPIの使用の仕方がありません・・・(今現在、ソケットプログラミングを進めています) ウィンドウベースではなく、コンソール上でのAPIの使用の仕方などが記載されている本はありますでしょうか? まずは、ウィンドウズプログラミングを知ることからはじめる必要があるということでしょうか・・・・ よろしくお願いします。

  • VC++ .NETでWin32 APIの関数を呼び出すことは可能なのでしょうか?

    Visual C++ 2003 .NETで、Win32 APIの関数をSystem.Runtime.InteropServices名前空間を利用して呼び出したく、チャレンジしておりますが、C#のやり方でやると記述エラーになります。 Google等で調べても、C#のものばかり出てくるのですが、VC++ .NETではWin32 API関数を呼び出すことはできないのでしょうか?

  • マルチディスプレイモニタのWin32APIについて

    いつもお世話になっております。 現在マルチモニタ環境でのダイアログボックスの表示位置の制御を試みております。 しかしVC6.0sp5(sp6も同様)の環境でマルチモニタのAPIを使用するとコンパイルは通るのですがビルドの段階で、 「sample.obj : error LNK2001: 外部シンボル "_xEnumDisplayMonitors@16"は未解決です」 というエラーが出てしまいます。 他のマルチモニタのAPIについても同様です。 自分では、 ・libファイルのインクルードの確認 ・ヴァージョンの確認 ・ヘッダファイルとlibファイルのヴァージョンの確認 ・ヘッダファイルの中身の確認 はしました。 (特に問題はなさそうなのですが・・) しかしそれでも解決できていません。 解決策はどのようなものがあるかご教授願います。 マルチモニタの環境はWindows XP sp1です。

  • C++のクラス内で、ウインドウプロシージャなどの・・・

    Visual C++ 2008で、Windowsフォームアプリケーションを作っています。 .NET Frameworkでは実現できないウインドウを作るために、WindowsAPIに頼り始めたのですが これが分からないのでとても不便な状態なのですが WindowsAPIで使うための、ウインドウプロシージャや、ウインドウハンドルや、デバイスコンテキストハンドル・・・等を C++のクラスの中で、staticを付けずに普通のメンバとして組み込む事は、出来るのでしょうか? - - - - - - 今までは分からなかったので、とりあえずAPIに触れてみようと思いstaticをつけてどうにかやっていたのですが、それだとクラス内のインスタンスメンバにアクセスできないので、クラス内に作ってる意味がない感じになってしまいます。

  • APIレベル

    AndroidStudioで新規プロジェクトの作成でGoogleマップアクティビティーを作成すると、地図を載せるFragmentがSupportMapFragmentで作成されます。これだActivityにFragmentを追加する時によく使うbeginTransaction().replaceがうまく行きません。自分のやり方がまずいんだと思いますが、SupportMapFragmentを調べると下記のようなこと書いてありました。 MapFragment オブジェクトをサポートするために、Google Maps Android API には API レベル 12 以降が必要です。API レベル 12 より前のアプリケーションを対象としている場合、同じ機能にアクセスするには SupportMapFragment クラスを使用します APIレベル12と言うことはHoneycomb MR1より前です。7年前くらいです。現在のAndroidパージョン別シェアを見てもAPI レベル 12 より前は1%もありません。 それで質問なのですが、今アプリを作る場合APIレベルはどのくらいまで対応させるのが普通なのでしょうか? またそれはどのような判断によるものでしょうか?

  • VC++6.0へバージョンアップしたら5.0で作ったアプリがエラーになる

    VC++を5.0から6.0にバージョンアップしたのですが。 これで5.0で作ったプロジェクトをビルドしなおしたら、 実行時にアプリケーションエラーになってしまいました。 不正な処理-->ページ違反ですというやつです。 コンパイル時はエラーは何も出ないし、さらにデバックビルド だとちゃんと動き、リリースの時だけこの現象が起きてしまうので、 解析が困難で困っています。 こういった現象に何か心当たりがある方アドバイスをお願いいたします。

専門家に質問してみよう