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

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

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

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

Q&A

3回答

6815閲覧

c++でハンドルをローカル変数に格納する方法

Praline

総合スコア46

C++

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

0グッド

0クリップ

投稿2016/07/09 11:26

こちらの質問の続きとなります。
https://teratail.com/questions/38984

c++で作成したクラス内の複数のメソッドで、外部dllから生成したインスタンスを参照したいです。
そこでコンストラクタに、ハンドルをローカル変数に代入する処理を書いたのですが、「IntelliSense: 静的ストレージ存続期間のある変数にハンドルや追跡参照型を指定することはできません」とエラーが表示されコンパイルが出来ない状態となっております。

#include <iostream> #using "CallDllTest.dll" CallDllTest::CallDllTest ^ test; //ローカル変数を定義して int main() { test = gcnew CallDllTest::CallDllTest(); //コンストラクタで生成 return 0; } int getInfo() { return test->getPrm(); } //少なくともこの書き方だと上記IntelliSenseエラーが表示される。

お手数ですが、ハンドルを静的変数に代入する方法はあるでしょうか…。
ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答3

0

こんなことがやりたいんだろか...

C++

1// C++/CLI 2#include <iostream> 3#using "CallDllTest.dll" 4 5ref class Factory { 6 CallDllTest^ test = nullptr; 7public: 8 CallDllTest^ getDll() { 9 if ( test == nullptr ) { 10 test = gcnew CallDllTest(); 11 } 12 return test; 13 } 14}; 15 16ref class Foo { 17 CallDllTest^ test; 18public: 19 Foo(Factory^ factory) { test = factory->getDll(); } 20 int f1() { return test->getInt(); } 21 int f2() { return test->getInt(); } 22}; 23 24int main() { 25 Factory^ factory = gcnew Factory(); 26 Foo^ foo1 = gcnew Foo(factory); 27 Foo^ foo2 = gcnew Foo(factory); 28 std::cout << foo1->f1() << std::endl; 29 std::cout << foo2->f2() << std::endl; 30}

投稿2016/07/10 02:39

episteme

総合スコア16614

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

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

Praline

2016/07/10 15:09

自分の意図が伝わっていないようで申し訳ございません。 最初に例示したように、getInfoメソッド内から、ハンドルを代入した変数testを使用したいのです。 mainメソッド内だけで使用する変数ではありません。
episteme

2016/07/10 20:17

その考え、捨てたほうがいい。 ref class Application {  CallDllTest^ test; public:  Application() { test = gcnew CallDllTest(); }  void run() {   // これがmain。test使える   int info = getInfo();  }  int getInfo() {   // ここでもtest使える  } }; int main() {  Application^ app = gcnew Application();  app->run(); }
Praline

2016/07/11 13:42

何度も申し訳ないです…Bのクラスを呼ぶAのメソッドは既に処理が決まっていて、Bのメソッドを変更することが出来ないのです…最初に説明しておけばよかったです
episteme

2016/07/11 23:44 編集

「最終的にこれらのメソッドをまとめた一つのクラスにする予定で、そのクラス内で参照できる変数というニュアンスでローカル変数と説明しておりました…」 ってことやったのでコメントで例示したんだが、これでダメなら僕はサジ投げる。他をあたってください。 # .NETではグローバル・オブジェクトを定義できないハズ。
guest

0

' CallDllTest.vb Public Class CallDllTest Private _int As Integer Public Sub New() _int = 100 End Sub Public Function getInt() As Integer Return _int End Function End Class
// foo.cpp #include <iostream> #using "CallDllTest.dll" ref class Foo { public: CallDllTest^ test; Foo() { test = gcnew CallDllTest(); } }; int main() { Foo^ foo = gcnew Foo(); std::cout << foo->test->getInt() << std::endl; }
D:\work>vbc /target:library CallDlltest.vb Microsoft (R) Visual Basic Compiler バージョン 1.2.0.60317 Copyright (C) Microsoft Corporation. All rights reserved. D:\work>cl /clr foo.cpp Microsoft(R) C/C++ Optimizing Compiler Version 19.00.23918 for Microsoft(R) .NET Framework Version 4.06.1080.0 Copyright (C) Microsoft Corporation. All rights reserved. foo.cpp Microsoft (R) Incremental Linker Version 14.00.23918.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:foo.exe foo.obj D:\work>foo 100

何の問題もありませんけど。

投稿2016/07/09 21:06

episteme

総合スコア16614

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

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

Praline

2016/07/09 23:31

例のご提示ありがとうございます…! この場合、自分が最初に提示したgetInfoメソッド内からfooにはアクセスができるのでしょうか?getInfo内で生成した場合別のオブジェクトになるのかなと…
episteme

2016/07/10 00:41 編集

やってみたらいいじゃん。 てか、"なんでそんなことしたいの? 設計間違ってねぇ?"
Praline

2016/07/10 01:31 編集

Aのコンソール、Aから呼ばれるBクラス(c++のクラス)、Bから呼ばれるCクラス(vbのクラス)という構造になっております。そのためBクラスの内部でCクラスをどのメソッドからも参照できるよう、Bクラス内部のグローバル変数として保持したいのです。 一応試したのですが参照できなかったもので…
guest

0

CallDllTest::CallDllTest ^ test; //ローカル変数を定義して

それローカル変数じゃない。グローバル変数だ。

投稿2016/07/09 12:54

episteme

総合スコア16614

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

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

Praline

2016/07/09 13:32

あぁ説明足りずで申し訳ないです… 最終的にこれらのメソッドをまとめた一つのクラスにする予定で、そのクラス内で参照できる変数というニュアンスでローカル変数と説明しておりました… この例だとグローバルが正しいです。ご指摘ありがとうございます。
episteme

2016/07/09 14:01

ならば ref class Foo { public: CallDllTest::CallDllTest ^ test; Foo() { test = gcnew CallDllTest::CallDllTest(); } }; してみてはいかがでしょ。
Praline

2016/07/09 15:06 編集

そうすると、Publicの部分に「識別子が必要です」とエラーが出てしまうんですよね… 他の変数の宣言と同様の(char hoge[256];のような)書き方って難しいでしょうか…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問