如何在 dll 项目中的 C++ 中创建命名空间和构造函数?

Posted

技术标签:

【中文标题】如何在 dll 项目中的 C++ 中创建命名空间和构造函数?【英文标题】:How do i create a namespace and constructor in c++ in a dll project? 【发布时间】:2013-04-25 15:59:04 【问题描述】:

我在我的 Visual Studio 2012 Pro 上创建了一个新的 dll 项目,主 .cpp 文件是空的,除了这一行:

#include "stdafx.h"

在这个 dll 项目中,我有一个新的 c 语言项(模块),我在里面添加了一些函数。

事实上,我想在我的主 .cpp 文件中创建一些函数,这些函数将从 c 项(模块)调用该函数。

例如,在 .cpp 文件中,我会有这样的内容:

void start()



   encoder.start();


然后在 .cpp 中我需要添加一个构造函数,以便我可以在那里调用 start()

我该怎么做?

这是我的解决方案中的一个示例,我有两个项目一个控制台应用程序一个 dll。 这是控制台应用程序项目中主 cpp 文件的内容:

#include "stdafx.h"
#include "targetver.h"

extern "C" 
    void  video_encode_example(const char *filename);



int _tmain(int argc, _TCHAR* argv[])


    video_encode_example("adi.avi");
    return 0;

vide_encode_example 是我在控制台应用程序项目中创建的这个 c 项(文件/模块)中的一个函数。我有一个名为 example.c 的文件,video_encode_example 在 example.c 中

现在我在解决方案中添加了一个新的 dll 项目,并且 main.cpp 文件为空,除了以下行:#include "stdafx.h"

我想在 main.cpp 中的这个 dll 项目中做两件事:

    例如创建一些函数

    void thisstart()

然后我想在这个启动函数中调用我在 dll 项目中创建的 c 文件/模块中的 start() 函数。

所以它应该是这样的:

void thisstart()
  
    start();
  

哪里开始();来自 c 模块/文件

然后我将在 c# 中使用这个 dll,在 c# 中我希望能够使用 thisstart() 函数。

编辑

这是main.h的内容:

namespace dllproj

    extern "C" void start();
    void thisstart();

我现在在 dllproj 上遇到两个错误:

    错误 2 错误 C2054:预期 '(' 跟随 'namespace' 4 IntelliSense:需要一个标识符

那么这就是现在的cpp文件内容:

#define dllproj;

#include "stdafx.h"
#include "targetver.h"
#include "main.h"

void thisstart()
 
     dllproj;::start();
 

我遇到了两个错误:

    在定义行:错误 1 ​​错误 C2008:';' : 宏定义中的意外 在 dllproj;::start();错误 3 错误 C2143:语法错误:缺少 ';'在':'之前

请向我展示完整的解决方案,并向我解释稍后我将在 CSHARP 中使用哪个变量来为它创建一个实例并在 cpp 中调用此函数?

例如,在 csharp 中,当我添加 dll 时:test = new something();然后 test.thisstart();

【问题讨论】:

这个问题很难理解。我认为如果您发布您编写的代码会有所帮助。没关系,如果它是错误的,它会帮助人们理解你想要做什么。 不应该是start()嵌入到encode.start()里面吗?你的例子是试图从 c 调用 c++ 我猜?请澄清 为什么你认为你需要一个构造函数和/或命名空间?你以前用过吗?为什么您认为它们在 DLL 中的用法与在任何其他类型的项目中的用法不同?确定要 DLL 吗? n.m 我在一个解决方案中有两个项目。第一个项目也在 C++ 中,但在 main.cpp 文件中的控制台应用程序创建了类似于构造函数的自动 main。然后我向解决方案添加了一个新项目,这次是 dll 类型,main.cpp 文件为空。我将更新我的问题以澄清它。 更新了我的问题。我需要在 dll 项目中创建一个函数,该函数将在我在这个 dll 项目中创建的 c 语言文件/模块中的另一个函数中调用。然后我需要使用 c# 中的这个 dll 并能够从 main.cpp 文件中调用函数。因此,如果我在 c# 中,我将能够输入 something.thisstart();或某事.config();在 c# 中,我将为 dll 创建一个实例,然后我将能够使用 main.cpp 文件中的函数。 【参考方案1】:

来自cmets “start()在dll项目中的一个(c语言文件我创建test.c)”

1) 创建一个头文件,例如 main.h 并添加以下内容

namespace dllproj

    extern "c" 
    
       extern void start();
    
    void thisstart();

2)将main.h添加到main.cpp并定义thisstart()

 void dllproj::thisstart()
 
     dllproj::start();
 

确保 start() 在 dll 中声明为 __declspec(dllexport)

【讨论】:

如何将我创建的 h 文件添加到 cpp 文件中? @BenKochavi 错误 1 ​​是因为您添加了 ;在定义行中,删除它。并且错误 2 只是 dllproj;::start() 之后的额外分号。让它像这样 dllproj::start(). C# 的事我帮不了你,因为我不懂 C#。对不起 我仍然在 h 文件中收到错误:错误 1 ​​错误 C2054:预期 '(' 跟随 'namespace' 我现在将其复制为 h 文件中的代码并收到此错误。 在 cpp 文件中我在 dllproj::start();毕竟更改说:错误2错误C2143:语法错误:缺少';'在':'之前

以上是关于如何在 dll 项目中的 C++ 中创建命名空间和构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中创建命名空间包?

在标头和源代码 (cpp) 中创建 C++ 命名空间

如何检查是不是在 Visual C++ 应用程序中的第三方 DLL 中创建了新线程

如何在 C++ 中创建 shell 使用的 IconHandler?

如何在 C# 中创建具有命名空间的文档

如何在 C# 中创建具有命名空间的文档