2016-05-25 6 views
0

C++を新しくしました。私は最近、csvファイルからデータを読み込んでマップコンテナに格納するいくつかの関数を含むdllを構築しました。今私はユーザーがCSVファイルの完全なパスとファイル名を指定し、ボタンをクリックして私のDLL機能を実行できるようにするユーザーインターフェイスを作成したいと思います。ウィンドウフォームのボタンをクリックしてC++を呼び出す

Windows Formsアプリケーションがこれを行う可能性があります。フォームを作成した後、次の関数の括弧の中にいくつかのコードを入れることができます。

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {} 

フォームを操作するだけでうまくいきます。たとえば、単純な乱数ジェネレータ:私はdllファイルを実行するために、クライアントプログラムにこれを変更した場合

int num[7] = { 0 }; 
seed 
srand((int)time(0)); 

for (int i = 0; i < 7; i++) 
num[i] = (rand() % 99) + 1; 

this->label1->Text = Convert::ToString(num[0]); 
this->label2->Text = Convert::ToString(num[1]); 
this->label3->Text = Convert::ToString(num[2]); 
... 

しかし、それは動作しません。 button1_Click機能のブラケットに

double a = 7.4; 
int b = 99; 

cout << "a + b = " << 
MathLibrary::Functions::Add(a, b) << endl; 
cout << "a * b = " << 
MathLibrary::Functions::Multiply(a, b) << endl; 
cout << "a + (a * b) = " << 
MathLibrary::Functions::AddMultiply(a, b) << endl; 

と追加のディレクトリが含まれるように、通常の手順に従ってください:MSDNのdll例 https://msdn.microsoft.com/en-gb/library/ms235636.aspx

を使用して例えば

は、私はドライバプログラムを置きます。次に、参照を追加する際に問題が発生しました。私はVisual Studio 2013を使用していますので、通常の手順はプロジェクトエクスプローラのプロジェクト名を右クリックしてを追加します。新しいリファレンスを追加します。その後、DLLが出てボックスがチェックすることを確認します。しかし、Visual Studioはdllを見つけることができないので、dllを参照せずにプロジェクトをビルドするとエラーLNK2028が出ます。

Windowsフォームのボタンをクリックすると、DLLからいくつかの関数を呼び出すことが可能ですか?はいの場合は、上記の参照問題をどのように解決できますか?または私は間違った方向にいますか?

多くのありがとうございます。

+1

**正確な**エラーメッセージを必ず引用してください。そして、LNK2028のMSDN記事を読んで、C++/CLIプログラムで実行している問題の種類について明示的に話します。一般に、.hファイルにはマネージコードが含まれていないことをコンパイラーに伝える必要があります。 #pragma managed(push、off)を#includeの前に置き、#pragma managed(pop)の後に置いてください。 –

答えて

3

C++/CLIとC++を混同しています。 C++/CLIは、C++との緊密な相互運用を可能にするC++のスーパーセットです。

最初の例では、.NETコードを記述していますが、2番目の例ではネイティブDLLを参照します。 Visual Studioでは、「参照の追加」は.NETアセンブリ(あまり混乱してもDLLファイル)のためだけに使用されるため、非表示にしています。

2つの選択肢があります。インポートライブラリ(MathLibrary.lib)をプログラムにリンクし、適切なヘッダーを含めます。 MathLibraryの例では、静的なクラスメンバ関数を使用していることを考慮すると、この方法では簡単に時間がかかることがあります。これを行うには、MathLibraryのサンプルをビルドし、生成されたlibをC++プロジェクトのプロパティのLinker - > Input - > Additional Dependenciesに追加します。

P/Invokeを使用することもできます。あなたが呼びたい関数が普通の関数(クラスメンバではない)であれば、私はこれを他のオプションよりも提案します。 C++の名前のマングリングはこれをより困難にし、より脆くします。エクスポートされたメンバ関数の名前が何であるかを調べ、それらをP/Invokeに供給する必要があります。しかし、これを使って特定のコンパイラにバインドされます(バージョンも同じです)。

+0

あなたの返信ありがとうございます。それは有用だった。あなたの最初の提案に従ってください、私は私のフォームとインポートライブラリをリンクし、プログラムにヘッダファイルを含めます。ビルドは成功し、コードを実行すると期待どおりのフォームが生成されます。ただし、ボタンをクリックしても何も生成されないようです。私は上の私のコードを与えられたコンソールウィンドウを期待していた。なにか提案を?あなたの助けをもう一度ありがとう。 – Ben10

+0

@ Ben10、私は本当にわかりませんが、.NETがコンソールを別々に割り当てて、あなたのcout出力が見えなくなる可能性があります。 Console :: WriteLineを試すことができます。それでも問題が解決しない場合は、別の質問をすることをお勧めします。 –

+0

dllを考慮しません。 System :: Void button1_Click(System :: Object^sender、System :: EventArgs^e){ \t \tコンソール:: WriteLine( "Hello World"); \t} 'はコンソールを起動できません。 – Ben10

-2

VSが見つけられる場所にDLLを置きます。

+0

私はdllを見つけるために**ブラウズ**オプションを使用しました。しかし、チェックボックスをオンにすると、次のいずれかの理由で参照を追加できないというエラーメッセージが表示されました。 - 上位バージョンの.NET Frameworkを対象とする。 - .NETアセンブリではありません。 - 登録されていないActiveXコントロール – Ben10

関連する問題