none
DXにおいての Drawコーディングにおいて、コンパイルエラーが出ます。 RRS feed

  • 質問

  • 皆様、困った事になり、お助けいただきたいと言ったお願いです。

    私は、Win10で、VisualStudioCommunity2017を用いて、個人で開発している者です。

    これまで、APIで組んでいたのですが、そろそろDXを用いたいと思いました。

    まず基本的な、Drawからはじめようと思ったのですが、本のサンプルを打ち込んだ所、コンパイル時において、

    LPDIRECTDRAW lpDD;

    と、しているのに、

    ”構文エラー:”;”が、識別子”lpDD”の前に必要です” と、出ます。さらに、

    ”DirectDrawCreate”の識別子が見つかりません。

    と、言ったエラーが発生してしまいました。

    SDKが無いのかと思い、マイクロソフトよりインストールしても、状況は変わりません。実際、その前から、#include<ddraw.h>と冒頭により定義すると、外部依存関係において、そのヘッダが登録されているのです。その為に、SDKでは無いと思っています。

    では、何が原因なのかが解りません。

    プロジェクト作成時において、何かを指定、変更が必要なのでしょうか。オプションを見ても、何を定義して良いのかが解りません。

    また、インクルードは、<windows.h>と、<ddraw.h>のみをシステムのヘッダーとしての指定しかしておりません。まだ何か足りないのでしょうか。

    これまで、APIしか使ったことが無いので、このトラブルには非常に弱いのです。

    できる限り本を読んだのですが、どの本もこのコーディングをしております。

    皆様のお知恵を拝借したく思っております。なにとぞ、ご協力の程を宜しくお願い申し上げます。

    2019年5月17日 22:25

すべての返信

  • 識別子が見つからないと言うことは何らかの要因で ddraw.h のインクルードに失敗していそうです。
    ただ、今の情報からどのような要因なのかは特定が難しいですね…。

    #include <ddraw.h> はどこに書いていますか?
    (DirectDrawCreate を書いている cpp ファイル? stdafx.h ファイル?)
    cpp ファイルに書いている場合は、#include の順番はどのように書いていますか?

    2019年5月17日 22:36
    モデレータ
  • SDKが入ってPATHが通っているという前提で回答。

    ddraw.hのヘッダの中身をみると下記のように書かれていますとおり、コンパイラによってはddraw.hをincludeする前にNONAMELESSUNIONを定義する必要があります。

    // For compilers that don't support nameless unions, do a
    //
    // #define NONAMELESSUNION
    //
    // before #include <ddraw.h>



    • 編集済み konuma 2019年5月19日 10:52
    2019年5月19日 10:52
  • 皆様、ありがとうございます。

    これまで行ってきたことを書きます。

    VisualStudioCommunity2019に、バージョンを上げました。

    その後、DirectXSDKを別記にインストールしました。

    本をよく読んでみると、その時に、ヘッダのインクルードのフォルダ、

    ライブラリの指定。が、行われていないようなのです。

    しかし、これにも困っていまして、どの様にして、各々の指定をすれば良いのかが解りません。

    ツールからオプションを選んでも、それらしい項目が見受けられません。

    また、ライブラリも、何を入れて良いのかが解りません。

    そして、インストールしたフォルダを見てみても、拡張子がCAB、またはmsiのものしか無く、

    .h .lib と言った者が見受けられません。

    私の行っているどこに間違いがありますか?

    もし、よろしければ、お教えいただきたく願います。

    DirectX12です。

    また、インクルードは、

    #include<windows.h>
    #include<ddraw.h>
    #include "framework.h"
    #include "DxSample1.h"

    の順に行っております。

    すると、”LPDIRECTDRAW lpDD”においては、問題が無くなりました。

    しかし、その後の、”DirectDrawCreate”において、LINK時にエラーが出て、進めません。

    どうやら上記した所に問題があると思いますが、何処に問題があるのかが解りません。

    大変お手数をおかけしますが、どうしてもDirectXを動かしたいのです。

    皆様のお知恵を拝借したく願い、なにとぞご協力の程をお願い申し上げます。


    2019年5月19日 23:04
  • ”DirectDrawCreate”において、LINK時にエラーが出て

    DirectDrawCreateのページ末尾には「Library : Ddraw.lib」とあります。これを実現する具体的なコードとして

    #pragma comment(lib, "Ddraw.lib")

    を記述する必要があります。

    2019年5月20日 0:16
  • ddraw.libのリンクエラーについては、佐祐理さんより適切なコメントがついてますので、その通り記載ください。

    どこにddraw.libがあるか知る必要はないです。「ソリューションの再ターゲット」実行することで、勝手に適切なフォルダを設定してくれます。リンクエラーが出たら試してください。

    ★ソリューションの再ターゲット
    https://docs.microsoft.com/ja-jp/cpp/windows/how-to-use-the-windows-10-sdk-in-a-windows-desktop-application?view=vs-2019

    参考として最新のSDKであれば以下です。上記の方法を採用し、直接記載しないように
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\ddraw.h
    C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64\ddraw.lib

    2019年5月20日 13:14
  • 皆様、ありがとうございます。

    理屈は未だまだ解っておりませんが、コンパイル、実行が通るようになりました。

    これからさらに勉強し、皆様に少しでも近づきたく思います。

    誠にありがとうございました。

    感謝です。

    2019年5月21日 2:17
  • 皆様、さならるお知恵を拝借したく願います。

    実は、DirectXのDrawにおいて、私では解決出来ない新たな問題に突き当たってしまいました。

    それは、

     ddrval = lpDD->SetDisplayMode(800, 600, 8);

    と、言う関数において、コンパイルは通るのですが、実行時において、"E_NOTIMPL Not implemented"

    なるエラーの戻り値と共に、この関数がエラーになるのです。

    どうやら、実行時においてライブラリを見つけることが出来ない。と言ったことのようなのです(私の私見ですが)。

    一応プロパティを見まして、ライブラリにddraw.dllの場所"c:\winodws\system32"などを追記してみたのですが、

    全く変化も無く、根本的に何かが間違っているのかとも思っております。

    何をしようとしているのかというのですが、画面を専有化し、フルスクリーンにおいて、解像度を変えようとしています。

    この際後の部分で、躓いてしまい、右にも左にも行かなくなりました。

    度重なることで申し訳ありませんが、なにとぞお力をお借りしたく願い、ご教授願う次第です。

    なにとぞ、宜しく願う次第です。何とかお助けいただきたく願います。

    2019年5月25日 0:44
  • 私も20年前にDirectDrawからプログラミングを始めました。何のプログラミング経験もなしに。
    その頃、ひどい目に遭った経験者として見過ごせずアドバイスしますが、ゲームを作りたいとおもって手探りでDirectXを始めたにしては学ぶ内容が古すぎます。DirectX8でDirectDrawは廃止されました。動かすのに一苦労だと思います。

    さて、古いソースをコピペしている人が陥りそうな罠を書きます。

    1. IDirectDraw7 Interfaceは取得しましたか? そして成功しましたか?
        DirectDrawCreateで戻ってきたlpDDをそのまま使ってもまず動きません。
       
    QueryInterfaceとIID_IDirectDraw7で調べてください。
        QueryInterface出来ないようであれば、もうDirectDrawという技術が古すぎて動かせなくなってます。

    2. 上記がうまくいったとして、貴殿のPCは800*600の256色などというモードをサポートしているのでしょうか。
        サポートしてるビデオモードを取得する関数であるGetCapsで取得出来ますが、必須ではないです。
        16BitカラーでSetDisplayMode(1024,768,16,0,0)すべきでは無いですか。

    最後に、クローズした質問につなげない方がいいですよ。

    これはフォーラムの使い方の問題ですが、1質問1回答で納得したら回答者にお礼をいってそのスレッドはクローズしましょう。私もこのスレッドにこれ以上回答しません。


    • 編集済み konuma 2019年5月25日 3:12 脱字修正
    2019年5月25日 3:11
  • konumaさん、ありがとうございます。

    今のところ、ちんぷんかんぷんですが、何とか理解しようと思っています。

    また、貴重なご意見、そしてアドバイスをありがとうございます。

    追っかけ追っかけ追いつこうと思っておりますので、出来れば長い目で見ていただければと思っております。

    いつも皆さんに助けていただきまして、ありがとうございます。

    これからも精進の気持ちを持ち、邁進する覚悟でございます。

    2019年5月25日 20:12
  • 曖昧な回答で路頭に迷わせたらいかんなとおもって試しました。実験の上、下記の通り訂正します。
    結論としてDirectDrawは小細工なしで動きます。QueryInterface不要。800*600*256でも動く。
    上記の回答は以下です。

    DirectDrawCreate(NULL, &lpDD, NULL);
    lpDD->SetCooperativeLevel( GetActiveWindow(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
    lpDD->SetDisplayMode(640, 480, 8);
    
    【実行環境】
    OS               : Windows 10

    コンパイラ      : Visual Studio 2019
    Windows SDK : 10.0.18362.0
    ビデオカード   : Geforce 1070
    ソース            : 私が1998年に書いて(挫折した)ダ○スタもどきのソース。
                           http://whitecats.dip.jp/up/download/1558841495/attach/1558841495.zip
                           Pass: uma2019

    使用ライセンスはフォーラム準拠。誰でも煮るなり焼くなり好きにしてください。20年前のソースです。
    Visual Studio 2019でビルドできて、Direct2D動く、1998年のコードってところに驚きを感じてください。終了の仕方はAlt+F4とESCです。

    このソースを良く読めば、2Dゲームを作れるようになるかもしれませんが、10年以上前にサポートが終わり、いつ動かなくなるか分からない内容を勉強する意義はないと思います。下記のようなサイトをまず読みましょう。

    https://www.xbox.com/ja-JP/developers/creators-program

    納得したら「参考になった」マークつけてこのスレ閉じてね。>ぷにすけ2さん

    2019年5月26日 4:00
  • ご丁寧に、ご回答をいただきまして、誠にありがとうございます。

    実は私の持っていた本が本当に古いようであったのですが、上位互換だとてっきり思い込んでおりました。

    考えが古く、そして甘かったようです。

    皆様のご厚意を真摯に受け止め、これからの判断の基準にさせていただきたく思います。

    誠にありがとうございました。

    2019年5月29日 17:41