質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

4823閲覧

C++/CLIでC++で書かれたDLLを使いたい。

yogrt3

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/10/15 17:12

###前提・実現したいこと
初心者です。
C++/CLIで.net frameworkライブラリを利用したものを作っていますが
C++で書かれたDLLの関数を利用したいのですがラッパークラスを下記のように作成し
ビルドすると下記のようなエラーが出てしまいます。

###該当のソースコード

C++/CLI

1value class MyAPI 2{ 3 public: 4 [DllImport("xdwapi.dll")] 5 static int XDW_OpenDocumentHandle (const char* lpszFilePath, XDW_DOCUMENT_HANDLE* pHandle, XDW_OPEN_MODE* pMode); 6};

###発生している問題・エラーメッセージ

error C2061: syntax error : identifier 'XDW_DOCUMENT_HANDLE'

###試したこと
引数のXDW_DOCUMENT_HANDLEはヘッダーファイルでは下記のように記述されています。
typedef struct { int dummy; } *XDW_DOCUMENT_HANDLE;
構造体の引数の渡し方の問題なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

C2061は宣言しないまま識別子を使うと出るエラーのようです。
ならば、XDW_DOCUMENT_HANDLEを定義しているヘッダをインクルードしていないとか、#if文で該当定義を外している等が考えられます。
ただ、DLLの場合、ちょっとややこしいです。__declspec(dllimport)が必要な時もあります。

試しに、該当の定義をtypedef void *XDW_DOCUMENT_HANDLE;に変更してみては如何でしょうか?
該当定義が適切にインクルードされていないならエラーは変わらないと思います。適切にインクルードされているならエラーは消える筈です。
後者の場合は__declspec(dllimport)が居るかも知れません。(C++/CLIは使ったことがないので外しているかも。)

投稿2016/10/16 01:28

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yogrt3

2016/10/16 23:26

いつもありがとうございます。 おっしゃられる通りインクルードされていませんでした。すいません。 .cppファイルに記述していたのですが それをForm1.h(ウィンドウズファームアプリケーションでつくっています。)に記述したら通りました。 .cppに書くのではダメなのですね。。 関数も動いているようです。 どうもありがとうございました!
Chironian

2016/10/17 01:26

.cppからのインクルードがダメというわけではないです。 たぶん、Form1.hでXDW_DOCUMENT_HANDLEを使っていて、.cppではForm1.hのインクルードより後でXDW_DOCUMENT_HANDLEを宣言しているヘッダをインクルードされていたのではないでしょうか? もしくは、他の.cppからもForm1.hをインクルードし、そちらからはXDW_DOCUMENT_HANDLEのヘッダをインクルードしていないことも考えられます。 C/C++言語の場合、使う前に宣言されていることが必要です。なので、使うより前にインクルードする必要が有ります。 これを確実にするために、識別子を使っているファイルの先頭付近で、当該識別子を宣言しているヘッダをインクルードすることも多いです。
yogrt3

2016/10/19 14:12

コメントありがとうございます。 確認しましたところ、おっしゃられる通りインクルードをForm1.hより 後にしていました。 大変勉強になりました。(初歩的なことで申し訳ありません) どうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問