Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享一个C++;与客户的DLL和H文件_C++_Dll_Visibility_Header Files_Class Visibility - Fatal编程技术网

C++ 共享一个C++;与客户的DLL和H文件

C++ 共享一个C++;与客户的DLL和H文件,c++,dll,visibility,header-files,class-visibility,C++,Dll,Visibility,Header Files,Class Visibility,这是我职业生涯中的第一次,我必须向客户提供一个DLL,其中包含我们的基础通用软件和一个接口,使其按照客户希望的方式工作,并允许客户输入输入和读取输出 现在我最大的问题是,由于知识产权,我可能不会向我的客户展示任何他绝对不需要知道的东西。这包括数据类型,因此我甚至不能向他显示任何内部方法的签名。我创建了数据类型和结构,这些数据类型和结构模仿我们自己的内部逻辑,但例如,它们自愿省略不必要的属性/元素,或者给它们不同的名称,以隐藏对我们私有内部逻辑的提示。然后,获取数据的方法将我们自己的数据结构映射到

这是我职业生涯中的第一次,我必须向客户提供一个DLL,其中包含我们的基础通用软件和一个接口,使其按照客户希望的方式工作,并允许客户输入输入和读取输出

现在我最大的问题是,由于知识产权,我可能不会向我的客户展示任何他绝对不需要知道的东西。这包括数据类型,因此我甚至不能向他显示任何内部方法的签名。我创建了数据类型和结构,这些数据类型和结构模仿我们自己的内部逻辑,但例如,它们自愿省略不必要的属性/元素,或者给它们不同的名称,以隐藏对我们私有内部逻辑的提示。然后,获取数据的方法将我们自己的数据结构映射到这些结构中。你明白了

另外,这次从纯软件架构的角度来看,我不希望他访问某些成员、属性、变量。。。因为我不需要他知道它们的存在,也不想让他在他喜欢的时候和他喜欢的方式去修改它们。然而,它们仅与该接口相关,根本不是我们内部软件的一部分

我现在拥有的是一个作为接口的类,他可以实例化它。它基本上提供了用于输出的get方法、用于输入和启动更新计算的方法,以及用于其他参数和值(如软件版本或当前状态)的getter和setter。这些参数和其他变量的实际数据变量隐藏在我的CPP文件中,该文件被编译到DLL中,因此它们甚至没有声明为类的属性,我们在我给他的H文件中使用该类作为接口,甚至没有声明为私有的,他也不知道它们-他只有getter和setter

我应该在这里使用什么设计模式?我是否可以将变量作为类的属性,作为private,放入与客户共享的H文件中?但是,他是否能够将它们从private更改为public,并为类编写新方法,访问它们并自由修改它们,而无需编译器抱怨?我是否可以对我的类做出贡献,并将其扩展到我的CPP文件或其他他无权访问的H文件中

这么多的问题,因为这对我来说是全新的。但是您可以大致了解:我想在这个H文件中与我的客户共享严格必要的、最大限度最小的信息,这样他就可以使我的DLL正常工作并获得数据输出。再也没有了

提前感谢,, 查尔斯

我应该在这里使用什么设计模式

有关更多详细信息,请参阅

我是否可以将变量作为类的属性,作为private,放入与客户共享的H文件中?但是,他是否能够将它们从private更改为public,并为类编写新方法,访问它们并自由修改它们,而无需编译器抱怨


是的,他会的。piml仍然是可能的,但是更难,需要逆向工程。

首先,您应该考虑用纯C接口<强>建立一个强> dll,因为在dll边界上与STL类的C++接口是高度约束的。(例如,客户端必须使用相同的VisualC++编译器版本,并动态链接到用于构建DLL的CRT味道)。

在此,您可以自由开发一个薄层,它将屏蔽/隐藏您的C++实现(在DLL编译并以二进制方式传递)给客户。


您还可以提供一个简单的公共头文件,它可以以良好的C++面向对象方式封装DLL接口的C接口层(类似于Win32 PURE C API函数的ATL和WTL DO).

这根本没有解决DLL问题。请阅读。因此,这基本上依赖于实现主体的正向声明,包括我想隐藏的变量,其声明为1。推迟到编译过程的稍后阶段,但不会引发错误。2。位于另一个文件中t不与客户共享。如果我的客户只有一个H文件,没有声明实现体,我的DLL有声明(和定义)我担心的是,除非有人有更好的建议,否则我的客户只会有一个DLL和一个H文件来声明他需要的导出内容。@Moo Juice,Charles问如何从他的公共头中隐藏所有可能的实现细节。这正是pimpl专为。客户可以在不知道实现类定义的情况下编译代码。@Moo Juice,DLL的创建和编译没有什么特殊之处。您可以使用pimpl隐藏导出的所有类的实现详细信息。您可以像通常那样将头文件分为public头文件和internal头文件(公用转到包含文件夹,专用标题靠近其.cpp文件)。当然,你用dllexport标记公共类,但这对Charles来说似乎不是问题。然后你编译它并分发dll、lib和公共头。除了pimpl之外,没有什么魔法。事实上,我们已经这样做了,因为我们确实面临着由于不同编译器中不同的名称损坏模式而导致的问题。这一问题不迟于昨天得到修复我知道,像我的客户一样,在VisualStudio Express 2015下编译。我们还没有尝试恢复到C++接口。如果我确实限制了C接口,把所有的对象都作为静态变量放在源文件中,那么我们就可以了。但是现在我们认为我们可以使用C++,问题又出现了。查尔斯:这不仅是关于NM的。我们可以处理差异,但也可以处理更深刻的问题,例如,不同版本的Visual Studio之间STL数据结构的不同实现