1

我是 Visual C++ 的绝对新手,因此我不得不问你,如何在我的托管 C++ 项目(Visual Studio 2008)中创建一个具有一个或多个函数的托管类模块(新类)?例如,如果按下按钮,我将如何调用该类的方法。我无法理解关于它的非常复杂的教程,并且大多数教程都提到了非托管代码或旧版本的 Visual Studio。我自己的尝试完全失败了,只产生了错误,因为我没有找到关于如何将新类文件添加到我的 Visual C++ 托管项目的正确选项。如果我选择一个新的“CLR 组件类”,我会收到一条警告消息,告诉我有关组件填充我屏幕右窗格的信息。如果我选择一个新的“CLR Windows Form Class”,它什么也不会发生,没有扩展名为“.class”的文件 将被添加,或者我不知道新添加的文件。我只需要一个非常基本的类文件,其中包含一个公共函数,我可以从项目的任何位置调用它。

我已经有一个非常大的 main() cpp 文件(main.cpp),里面有很多功能。大约有一千个或更多的功能,因此很难搜索或滚动。现在我想将这 1000 个函数中的一些放在我当前项目中的第二个 cpp 文件中(在 Visual Basic 6 中,它在 CSharp 中被简单地称为“新模块”,它被称为“新类文件”)。问题是,例如,一旦我将它们从 main.cpp 移到 module1.cpp 中,我就无法在 Visual C++ 中调用这些函数。

这就是我不想要的:

  • 一个DLL
  • 第二个项目
  • 添加对某物的引用(在项目/引用中)
  • 双重声明

我知道有一种方法可以只创建一个简单的类,然后创建这个类的一个新对象来使用它的方法。这就是我想要的。Google 中的示例对我不起作用,因为它们适用于早期版本的 Visual Studio,并且与我的版本不兼容。从这个例子中我知道我想要什么,但我没有在 Visual Studio 2008 中实现它的知识。

4

2 回答 2

6

我将再次尝试发布有关如何将类文件添加到 VS2008 WinForm 项目的分步说明。在完成列表之前,我再次没有意识到编号项目在这里并不总是干净利落。我能够修复除一个数字之外的所有数字,所以这应该很好 - David W

  1. 这些步骤假设在 VS2008 中启动一个简单的项目,包括一个带有默认表单和一个按钮控件的 WinForms 应用程序,如下所示: 演示项目的起点。
  2. 要向该项目添加新类,请右键单击“DemoWinFormApp”,选择“添加”,然后选择“类...”,如下所示: 添加班级
  3. 在“添加类”对话框的“名称”字段中为类命名,DemoNewClass,然后单击“添加”按钮: 添加新的类名
  4. Visual Studio 将向您的项目添加两个文件:DemoNewClass.h(用于定义的头文件)和 DemoNewClass.cpp(用于头中定义的函数的实际 C++ 实现)。添加后,Visual Studio 编辑器会激活头文件,但会显示以下内容: 添加头文件后的编辑器消息 单击“单击此处切换到代码视图”链接以打开源代码编辑器。
  5. 编辑器现在显示 DemoNewClass.h 头文件的源代码。该文件包括来自主应用程序 DemoWinFormApp 的命名空间的自动声明,并且还包含“public:”区域中的两个默认构造函数,我们将不涉及它们。我们将在第二个构造函数定义之后立即向 DemoNewClass 添加一个新的公共静态方法。

  6. 我们将添加一个静态方法——一个不需要实例化宿主类的方法——在字符串周围加上星号。该方法将被称为“装饰字符串”

  7. 在第二个构造函数之后,添加如下所示的声明并以蓝色突出显示: 新函数声明

  8. 有了声明,我们现在必须添加实现。在解决方案资源管理器中,双击“DemoNewClass.cpp”以编辑文件: 编辑实现文件

  9. 编辑器窗口打开,文件只有两行 - 两个包含指令指示编译器将引用的文件作为当前源的一部分引入。DemoNewClass.h 中提供的声明是默认提供的。

  10. 将 DecorateString 方法的实现添加到 .cpp 文件中,如下所示: 在此处输入图像描述 这样就完成了新类的定义、DecorateString 声明以及为 DecorateString 方法提供实现。现在剩下的就是允许 WinForms 应用程序从主窗体引用类和方法。

  11. 在解决方案资源管理器中,双击 DemoWinFormApp 项目的“头文件”列表中的“Form1.h”文件,在编辑器中打开 Form1。(按钮已经添加,添加按钮的步骤留给读者): 在此处输入图像描述

  12. 为了演示新的类方法,我们将单击按钮显示一个由我们的 DecorateString 方法通过 MessageBox 类修改的字符串。首先,我们必须通过向 Form1.h 头文件顶部的新类的头提供一个包含指令来使表单知道我们的新类。右键单击设计器中的表单,然后单击“查看代码..”以调出源代码编辑器 在此处输入图像描述

  13. 为了使类及其方法可用于表单,我们必须在 Form1.cpp 实现源文件的顶部附近为类的头文件 DemoNewClass.h 提供包含指令:包含指令

  14. 在解决方案资源管理器中,双击“Form1.h”以使用 Form1 打开表单设计器。或者,如果文件仍然在编辑器中打开,您可以通过单击标记为“Form1.h [Design]”的编辑器选项卡打开设计器

  15. 我们将从绑定到表单上的“button1”按钮的事件处理程序中调用我们的新类方法。Visual Studio 通过在设计器中双击“button1”来提供默认处理程序: 按钮单击处理程序

  16. 键入代码以调用 MessageBox::Show 方法,将由 DemoNewClass::DecorateString 方法修改的字符串作为参数传递,如下所示 - 注意 Intellisense 是如何一路感知我们的新类的: 在此处输入图像描述
  17. 这是完成的事件处理程序/类方法调用: 完整的方法调用
  18. 从 Visual Studio 的“构建”菜单中,选择“构建解决方案”(或按 F6)。这将编译解决方案并显示可能已检测到的任何语法错误。所提供的示例可以干净地编译和构建。

构建解决方案...

在此处输入图像描述 20. 构建成功后,剩下的就是测试应用程序。按 F5 运行应用程序并显示测试表单:

在此处输入图像描述

  1. 单击“button1”运行处理程序,并查看修饰字符串:

在此处输入图像描述

传递的参数“foo”成功传递给新类的DecorateString方法,并返回给MessageBox方法显示。新的类方法声明和表单引用现已完成。

祝你好运。

于 2012-08-27T05:40:32.653 回答
2

**注意:为了确保代码块和编号步骤的格式正确,我与 MarkDown 编辑器进行了相当大的角力,但由于某种原因,一些元素仍然存在潜在的错误。我将尝试在以后的帖子中修复。目前,我选择至少以某种形式为您发布所要求的信息。

使用 Visual Studio 2008 作为基准工具,请执行以下步骤:

  1. 选择“文件->新建项目”
  2. 从“新建项目”对话框的“项目类型”列表中,在“其他语言”下的“Visual C++”下,单击“CLR”。
  3. 从“Visual Studio 已安装模板”列表中,单击“类库”
  4. 在“新建项目”对话框下半部分的名称框中,为您的项目提供一个名称。例如,使用“SampleCPPAssembly”
  5. Visual Studio 2008 将创建一个“shell”类和命名以匹配项目的头文件,例如 SampleCPPAssembly.h 和 SampleCPPAssembly.cpp
  6. 打开“SampleCPPAssembly.h”
  7. 将类的名称更改为“public ref class SampleClass”
  8. 在打开的花括号内,添加一个文本行,上面写着“public:”。这定义了包含类的公共方法的部分。
  9. 在“public:”声明下,插入以下内容:
   
    static String ^ DecorateString(String ^ foo);
    

  • 10. 保存文件。
  • 11. 通过在解决方案资源管理器中双击打开“SampleCPPAssembly.cpp”。
    12. 在“命名空间 SampleCPPAssembly”之后的花括号内,插入以下内容:

        
        String ^ SampleClass::DecorateString(String ^ foo){
            return gcnew String("*"+foo+"*");
        }
        
    

  • 13. 保存文件。
  • 14. 从构建菜单中,选择“构建解决方案”。
    15. 如果项目确实构建成功,请重新检查步骤 1-12 是否有任何可能的错误。

    这样就完成了 C++ CLR 程序集的构建。我们现在努力创建一个简单的控制台应用程序来练习该方法。

    1. 在同一解决方案的“解决方案资源管理器”中,右键单击,然后选择“添加->新建项目”
    2. 在“其他语言”条目下的“Visual C++”下的“添加新项目”对话框中,选择“CLR”
    3. 从“Visual Studio 安装的模板”中选择“CLR 控制台应用程序”。
    4. 在“添加新项目”对话框底部附近的“名称”框中,键入“ConsumeSampleAssembly”
    5. 单击确定。
    6. 在“解决方案资源管理器”中,右键单击“ConsumeSampleAssembly”项目,然后选择“属性”。
    7. 在“属性页”对话框中,单击“通用属性”标题下方的“框架和引用”条目。
    8. 在对话框中间,单击“添加新引用...”按钮。
    9. 从“添加引用”对话框中,单击以选择“项目”选项卡。
    10. 从项目列表中,单击以选择“SampleCPPAssembly”
    11. 单击“确定”关闭“添加引用”对话框。
    12. 单击“确定”关闭“属性页”对话框。
    13. 在新创建的“ConsumeSampleAssembly”项目下的“Source Files”文件夹下,双击“ConsumeSampleAssembly.cpp”源文件。
    14. 在“使用命名空间系统;”的正下方,添加以下行:
        
        using namespace SampleCPPAssembly;
        
    

  • 15. 删除“int main(...)”后面的大括号之间的现有代码。(不要删除花括号。
  • 16. 将花括号内的内容替换为以下内容:

       
        Console::WriteLine(SampleClass::DecorateString(L"Hello"));
        return 0;
       
    

  • 17. 保存源文件。
  • 18. 在编辑器中,就在左边界内,沿着包含“return 0;”的源代码行,单击以设置断点。这会导致调试器在应用程序运行时在此处停止,并允许您查看应用程序的结果。如果没有断点,应用程序将启动和完成太快而无法观察。
  • 19. 在解决方案资源管理器中,右键单击“ConsumeSampleAssembly”项目,然后选择“设置为启动项目”。
  • 19. 按 F5 编译并运行工程。
  • 20. 你应该看到一个控制台窗口,输出“ Hello ”。
  • 简介:您创建了一个包含单个方法 DecorateString 的 C++ CLR 程序集,该方法接受一个字符串作为参数并返回由星号包围的字符串。然后,您创建了一个简单的 C++ CLR 控制台应用程序,添加了对新程序集的项目引用,然后从“main(..)”方法调用了 DecorateString 方法,其值为“Hello”,该方法由该方法修改以“ Hello ”的形式返回。这表明您的 CLR 控制台应用程序正在成功调用 C++ CLR 程序集。

    希望这可以帮助!

    于 2012-08-24T18:45:19.330 回答