• ベストアンサー

DLLの使い方とerror C2146について。

お世話になります。プログラミングの経験がほとんど無い初心者です。あるゲームソフトのSDKを使い自作デバイスでゲームを操作するプログラムを作りたいのですが、そのテスト段階で躓いています。(ご参考まで→ttp://www.lekseecon.nl/sdk.html) なおIDEはVC++2008ExpressEditionを使っています。エラーの内容は次の通りです。 ************** 1>------ ビルド開始: プロジェクト: PC19, 構成: Debug Win32 ------ 1>コンパイルしています... 1>PC19.cpp 1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C2146: 構文エラー : ';' が、識別子 'LVLDSession' の前に必要です。 1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません ************** 原因となったLVLD_SDK.h中のエラー対象行周辺は次の通りです。 ************** #define SDK_VERSION 202 #define OPEN 1 #define CLOSE 0 //(省略) __declspec(dllexport) LRESULT LVLDSession  (int flag,int LVLDVersion); //※エラー行です //(省略) ******************** プログラム本体についてはまず新規プロジェクトでWindowsフォームアプリケーションを準備し、Timerを組み込みました。SDKには3つのファイル、LVLDSDK.dll、LVLDSDK.lib、LVLD_SDK.hが内包されており、これらすべてをプロジェクトフォルダーにコピーしました。ソリューションエクスプスローラーでLVLD_SDK.hをヘッダーファイルフォルダーに、LVLDSDK.libをリソースフォルダーに参照させました。またプロジェクトのプロパティのリンカの入力、追加の依存ファイルにLVLDSDK.libを追加しました。他のコンパイル時エラーへの対応として、構成プロパティ、全般、共通言語ランタイムサポートを/clrへ変更しています。 Form1.hの先頭行近くに #include "LVLD_SDK.h" を追加し、Timerイベント内に動作確認用の命令を記述しました。 **Form1.h抜粋***** #pragma once #include "LVLD_SDK.h" (中略) #pragma endregion private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { signed int result0; result0=LVLDSession(OPEN,SDK_VERSION); } (中略) ********** 3種類のエラーが出ていますが関連性がよく分からず、まとめて質問する形になってしまいました。質問に不備がありましたらそれも叱咤ご教授いただければと思います。よろしくお願いします。

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

  • ベストアンサー
回答No.1

お疲れ様です。 多分「LRESULT」が何か認識しきれていないのだと思います。 たしか、「windows.h」さえ読み込めば定義されているはずなので、 「Form1.h」で読み込むか、「Form1.h」を使用している箇所で読み込むかのどちらかになります。 ●「Form1.h」で読み込む場合 #include <windows.h> #pragma once #include "LVLD_SDK.h" (中略) #pragma endregion private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { signed int result0; result0=LVLDSession(OPEN,SDK_VERSION); } (中略) ●「Form1.h」を使用する側で読み込む場合 #include<windows.h> #include"Form1.h"

kurukaji
質問者

お礼

即時のご回答に感謝感激しております。大変ありがとうございました。 教えて頂いた方法で、先の問題は無事解決することができました。 しかし新たな問題に頭を抱えています。 ここで引き続きお伺いしてもよろしいでしょうか。 エラーメッセージは次のとおりです。 ********** 1>リンクしています... 1>PC19.obj : error LNK2028: 未解決のトークン (0A00001B) "long __cdecl LVLDSession(int,int)" (?LVLDSession@@$$FYAJHH@Z) が関数 "private: void __clrcall PC19::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@PC19@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。 1>PC19.obj : error LNK2019: 未解決の外部シンボル "long __cdecl LVLDSession(int,int)" (?LVLDSession@@$$FYAJHH@Z) が関数 "private: void __clrcall PC19::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@PC19@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。 1>F:\PIC\MyPrograms\PC\PC19\Debug\PC19.exe : fatal error LNK1120: 外部参照 2 が未解決です。 ************* よろしくお願いします。

その他の回答 (3)

  • z64423
  • ベストアンサー率53% (26/49)
回答No.4

これは #1 の補足への回答です。 リンク先を見ると   The SDK contains functions and data definitions in the C-language となってるので、(C++ではなく)Cとしてコンパイルする必要がありそうです。 #2 さんが指摘している「SDK自体のリンケージ規約がC言語」だと思います。 いま手元にはVS2008しかないのですが、   プロジェクト => (プロジェクト名)のプロパティ   構成プロパティ => C/C++ => 詳細   コンパイル言語の選択 の設定を   C++コードとしてコンパイル (/TP)  <= デフォルト   Cコードとしてコンパイル (/TC)  <= 修正後 にすれば良いのではと思います。 もしくは、ヘッダ内の C 関数プロトタイプ宣言を   #ifdef __cplusplus   extern "C" {   #endif   関数プロトタイプ宣言   …   #ifdef __cplusplus   }   #endif のように、extern "C" { ~ } で囲むかです。 ふつうはライブラリ用ヘッダはこのような書き方になっているはずですが、 「functions and data definitions in the C-language」と明示しているくらいなので、 最初の案のほうがいいかも知れませんね。 ※経験則からいうと、C と C++ が混在するような状況での  リンクエラーやマングル/デマングルに関する問題は初心者では解決できないのではないかと思います。  (自分も過去に悩んだことがあるし、後輩がこの問題に悩むのも何回か見てきた)  はっきりこのことを書いてる初心者向けの本はあまり見たこと無い。

kurukaji
質問者

お礼

ご指摘ありがとうございます。 hiro_knighさんへのお礼欄にも書きましたがSDKのReadmeにもC言語との記述がありました。お恥ずかしながらCとC++の混在が好ましくないことさえ認識していなかった、というのが正直なところです。 アドバイス頂いた[Cコードとしてコンパイル (/TC) ]を試したところ、Cに無い記述方法を指摘する(!?)エラーが沢山出てきてしまいました。 限界は感じますが解決方法はあるのですね。 ここはクローズしますが粘り強く続けてゆこうと思います。ありがとうございました。

noname#96502
noname#96502
回答No.3

まず自称初心者の方は自力でプログラムを書いて、それをコンパイルさせる能力を習得する事を目標として勉強すると良いと思います。 >1>f:\pic\myprograms\pc\pc19\LVLD_SDK.h(897) : error C2146: 構文エラー : ';' が、識別子 'LVLDSession' の前に必要です。 このエラー内容を質問して、プログラムの間違いを他の方に指摘してもらって、修正して意味があるでしょうか? 次のプログラムを作る時に同じエラーが出たときに自力で解決できるようにならないと、いつまで経っても初心者を卒業できません。 まずはエラー内容を理解する努力をしましょう。理解できないならエラーコード(上の例ならC2146)を検索サイトやMSNDで検索して詳細情報を得る努力をすると良いですよ。 自力で調べて理解出来ない事を教えてもらうようにしないと、いつまで経っても自分の知らないコンパイルエラーが発生した時に他人に助けてもらわないと解決できなくなってしまいます。 ちなみにVCならコンパイル時のエラーメッセージを(ダブル?)クリックするとエラーだとコンパイラが判断したコードをすぐ参照できます。

kurukaji
質問者

お礼

やや手痛いご意見ながら確かにおっしゃるとおりでして、コメント頂いたことを感謝しております。 アドバイスを参考にもっと勉強してから出直したいと考えています。  bravheartさん始めコメント頂いた皆様方、本当にありがとうございました。

回答No.2

コンパイルまでは正常終了して、リンクでエラーとなっています。 ライブラリの参照方法ですが、「LVLDSDK.libをリソースフォルダーに参照させました」の方法は違うのではなかったかと記憶しています。 「プロジェクト(P)」→「~のプロパティ(P)」→構成を「全ての構成」に変更→「リンカ:追加のライブラリディレクトリ」でlibを格納したフォルダを指定すればよかったはず。。。 それでも駄目なら、そのSDK自体のリンケージ規約がC言語の物の可能性があります。。。

kurukaji
質問者

お礼

教えて頂いたリンク方法を試しましたが症状は変わりませんでした。 すべてhiro_knighさんが予想されたとおりで、このライブラリはC言語のものでした。 ( SDKに同封されていたReadmeにも"How to use this SDK....for C developpers"と書いてありました ) 続きはz64423さんの欄に書くことにしますがここではお礼申したく、大変ありがとうございました。

関連するQ&A