C++通过点击window形式的按钮调用dll
C++ calling dll by clicking button in window form
我是 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 中调用某些函数?如果是,我该如何解决上述参考问题?还是我走错方向了?
非常感谢。
将 DLL 放在 VS 可以找到的地方。
您将 C++/CLI 与 C++ 混淆了。 C++/CLI 是 C++ 的超集,它允许 C++ 和 .NET 之间的紧密互操作。
在您的第一个示例中,您正在编写 .NET 代码,但在第二个示例中您想要引用本机 DLL。 Visual Studio 隐藏它,因为 "adding a reference" 仅适用于 .NET 程序集(有些令人困惑的还有 DLL 文件)。
您有两个选择:link 将导入库 (MathLibrary.lib) 与您的程序一起包含适当的 headers。考虑到 MathLibrary
示例使用静态 class 成员函数,您可能更容易使用这种方法。为此,构建 MathLibrary 示例,并将生成的库添加到 C++ 项目属性中的链接器 -> 输入 -> 附加依赖项。
另一种方法可以使用 P/Invoke。如果您要调用的函数是普通函数(不是 class 成员),我会建议使用其他选项。 C++ 名称重整使这变得更难和更脆弱。您需要找出成员函数的导出名称并将其提供给 P/Invoke。但是,您将被绑定到一个特定的编译器(偶数版本)。
我是 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 中调用某些函数?如果是,我该如何解决上述参考问题?还是我走错方向了?
非常感谢。
将 DLL 放在 VS 可以找到的地方。
您将 C++/CLI 与 C++ 混淆了。 C++/CLI 是 C++ 的超集,它允许 C++ 和 .NET 之间的紧密互操作。
在您的第一个示例中,您正在编写 .NET 代码,但在第二个示例中您想要引用本机 DLL。 Visual Studio 隐藏它,因为 "adding a reference" 仅适用于 .NET 程序集(有些令人困惑的还有 DLL 文件)。
您有两个选择:link 将导入库 (MathLibrary.lib) 与您的程序一起包含适当的 headers。考虑到 MathLibrary
示例使用静态 class 成员函数,您可能更容易使用这种方法。为此,构建 MathLibrary 示例,并将生成的库添加到 C++ 项目属性中的链接器 -> 输入 -> 附加依赖项。
另一种方法可以使用 P/Invoke。如果您要调用的函数是普通函数(不是 class 成员),我会建议使用其他选项。 C++ 名称重整使这变得更难和更脆弱。您需要找出成员函数的导出名称并将其提供给 P/Invoke。但是,您将被绑定到一个特定的编译器(偶数版本)。