C ++通过单击窗口中的按钮来调用dll

时间:2016-05-25 10:42:27

标签: winforms visual-studio c++-cli dllimport

我是C ++的新手。我最近构建了一个dll,其中包含一些从csv文件中读取数据并将它们存储在地图容器中的函数。现在我想创建一个用户界面,允许用户指定CSV文件的完整路径和文件名,然后单击按钮运行我的dll函数。

似乎Windows Forms Application可能会这样做。创建表单后,我知道我可以将一些代码放在以下函数的括号内:

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

如果我只是操纵表单,它工作正常。例如,一个简单的随机数生成器:

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]);
...

但是,如果我将其更改为客户端程序来运行dll,它就无法工作。

例如,使用msdn dll示例 https://msdn.microsoft.com/en-gb/library/ms235636.aspx

我把驱动程序:

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;

进入button1_Click函数的括号并按照通常的步骤包含其他目录。然后我遇到添加引用的问题。我正在使用visual studio 2013,因此正常步骤将是解决方案资源管理器中的右键单击项目名称添加新参考。然后dll将出来并检查框将执行。但是,visual studio无法找到dll,因此如果我在没有引用dll的情况下构建项目,则会出现错误LNK2028。

所以我只是想知道是否可以通过单击Windows窗体中的按钮来调用dll中的某些函数?如果是,我该如何解决上述参考问题?还是我的方向错了?

非常感谢。

2 个答案:

答案 0 :(得分:3)

您将C ++ / CLI与C ++混淆。 C ++ / CLI是C ++的超集,它允许C ++和.NET之间的紧密互操作。

在第一个示例中,您正在编写.NET代码,但在第二个示例中,您要引用本机DLL。 Visual Studio隐藏它,因为“添加引用”仅适用于.NET程序集(有点令人困惑的DLL文件)。

您有两种选择:将导入库(MathLibrary.lib)与您的程序相关联,并包含相应的标题。考虑到MathLibrary示例使用静态类成员函数,您可以更轻松地使用此方法。为此,请构建MathLibrary示例,并将生成的lib添加到Linker - &gt;输入 - &gt; C ++项目属性中的其他依赖项。

另一种方法可以是使用P/Invoke。如果您要调用的函数是普通函数(不是类成员),我建议使用其他选项。 C ++名称修改使这更难和更脆。您需要找出成员函数的导出名称是什么,并将它们提供给P / Invoke。但是,您将使用此(甚至版本)绑定到特定的编译器。

答案 1 :(得分:-2)

将DLL放在VS可以找到的地方。