如何在 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++ 中创建命名空间和构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查是不是在 Visual C++ 应用程序中的第三方 DLL 中创建了新线程