相关疑难解决方法(0)

从dll返回std :: string/std :: list

简短的问题.

我只是得到了一个我应该与之接口的DLL.Dll使用来自msvcr90D.dll的crt(注意D),并返回std :: strings,std :: lists和boost :: shared_ptr.操作员new/delete不会在任何地方超载.

我假设crt mixup(发布版本中的msvcr90.dll,或者如果其中一个组件使用较新的crt重建等)最终会导致问题,并且应该重写dll以避免返回任何可能调用new/delete的内容(即任何可以在我的代码中调用删除在dll中分配的内存块(可能使用不同的crt)的任何内容).

我是对还是不对?

c++ dll winapi

12
推荐指数
2
解决办法
6479
查看次数

用C/C++编写DLL以实现.Net互操作性

在我的C#应用​​程序中,我想在C中编写一部分代码.我计划编写一个可与​​.Net互操作的DLL.我怎样才能做到这一点?

c# interop native

12
推荐指数
1
解决办法
1万
查看次数

C++跨越边界使用std :: vector

假设EXE和DLL使用相同的编译器和STL版本.如果我在我的EXE中使用std :: vector并使用reserve来保留内存.然后我将它作为DLL的引用传递给它.

我在DLL中执行push_back以向我的向量添加元素.如果我没有超过实际容量,那么在DLL或EXE中分配的新元素的内存是多少?

c++ dll stl vector c++11

10
推荐指数
1
解决办法
726
查看次数

创建C ++ API库

我试图了解为非开放源代码项目提供相当大的C ++ API的正确方法或正确方法。我不想提供“仅标头”库,因为代码库很大,并且打算封闭源代码。目标如下:

  • 提供本机C ++ API,用户可以实例化C ++类,在C ++中传递数据,而无需C-only包装器
  • 允许方法作为参数并返回C ++对象,尤其是STL类型(std :: string,std :: vector等)
  • 没有自定义分配器
  • 大多数行业标准/规范方法可以做到这一点,如果存在这样的标准
  • 无需重新创建COM或使用MS COM
  • 假设所有C ++编译器至少符合“ C ++ 11”标准

我的目标是Windows以及其他平台(Linux)。

我的理解是由于DLL边界问题,无法创建DLL或共享库。为了解决DLL边界问题,必须使用动态链接的运行时(以及Windows上的正确版本,多线程/调试/等)编译DLL和调用代码,然后所有调试器设置都必须与调试符号相匹配(迭代器调试设置等)。我有一个问题是,例如,如果在Windows上使用Visual Studio中的默认“调试”和“发布”设置来确保编译器设置在/ MD方面匹配,那么我们是否真的可以“安全”使用DLL是否以这种方式(即来回传递STL对象,以及在发生不匹配时肯定会造成危险/失败的各种事物)?做共享对象,*。

使用静态库是否可以解决此问题?静态库和链接到该库的调用代码之间需要多少匹配编译器设置?与DLL(在Windows上)几乎一样的问题吗?

我尝试过在线查找图书馆的示例,但在此方面找不到太多指导。许多资源都在讨论开放源代码解决方案,该解决方案似乎是将标头和实现文件复制到代码库中(仅用于非标头),不适用于封闭源代码。

什么是正确的方法?看来这应该是一个普遍的问题;尽管我想知道大多数商业供应商是否仅使用C接口。

如果可以解决问题,我可以使用静态库。我还可以接受这样的想法:拥有一组具有Y设置变体的X编译器(其中X和Y是要支持的预定选项列表),并拥有一个生成X * Y共享二进制库的构建系统,如果那样的话是“安全的”。

答案是否真的只是与工厂一起执行C接口或创建Pure Abstract接口?(如果是这样,是否有规范的书籍或指南用于编写此文档,但未实现Microsoft COM?)。

我知道Stefanus DuToit的沙漏图案:https//www.youtube.com/watch? v = PVYdHDm0q6Y

我担心这是很多代码重复。

我并不是在抱怨事物的状态,我只是想了解“正确”的方式,希望对其他处于类似位置的人来说,这是一个很好的问题。

我已经查看了这些Stackoverflow参考:

何时使用动态库与静态库

如何安全地将对象(尤其是STL对象)与DLL传递?

分发Windows C ++库:如何决定创建静态库还是动态库?

静态库API问题(std :: string与char *)

简单的方法来保证C ++库和C链接的二进制兼容性?

也有评论:

https://www.acodersjourney.com/cplusplus-static-vs-dynamic-libraries/

https://blogs.msmvps.com/gdicanio/2016/07/11/the-perils-of-c-interface-dlls/

c++ api-design dynamic-linking static-linking

6
推荐指数
1
解决办法
491
查看次数

结构/对象内的存储顺序

考虑这两种情况:

struct customType
{
   dataType1 var1; 
   dataType2 var2;
   dataType3 var3;
} ;

customType instance1;
// Assume var1, var2 and var3 were initialized to some valid values.

customType * instance2 = &instance1;    
dataType1 firstMemberInsideStruct = (dataType1)(*instance2);
Run Code Online (Sandbox Code Playgroud)
class CustomType
{
   public:
       dataType1 member1;
       dataType2 member2;

       retrunType1 memberFunction1();

   private:
       dataType3 member3;
       dataType4 member4;

       retrunType2 memberFunction2();
};

customType object;
// Assume member1, member2, member3 and member4 were initialized to some valid values.

customType *pointerToAnObject = &object ;
dataType1 firstMemberInTheObject = (dataType1) (*pointerToAnObject);
Run Code Online (Sandbox Code Playgroud)

是否总是 …

c c++ pointers structure class

5
推荐指数
2
解决办法
1881
查看次数

从DLL返回std :: wstring是否安全?

根据一些较旧的StackOverflow问题(无法通过DLL传递std :: wstring,C++ DLL返回指向std :: list <std :: wstring>的指针),对于C++ DLL返回a并不安全,std::wstring因为不能保证main程序具有相同的定义,std::wstring因此可能导致崩溃.

但是,在http://en.cppreference.com/w/cpp/string/basic_string中,它现在似乎std::wstring可以与WCHAR数组互换使用:

(从C++ 11开始)basic_string的元素是连续存储的,也就是说,对于basic_string s,&*(s.begin()+ n)==&*s.begin()+ n对于任何n in [0,s.size()),或者,等效地,指向s [0]的指针可以传递给期望指向CharT []数组的第一个元素的指针的函数.

我已经通过传递&s[0]给期望WCHAR*缓冲区的WINAPI函数测试了它,它似乎工作(std::wstring正确填充了WINAPI的结果).所以既然std::wstring现在显然可以像对待WCHAR数组一样对待,我决定重新审视这个问题:可以std::wstring从DLL中安全地返回吗?为什么或者为什么不?

c++ dll std wchar c++11

5
推荐指数
1
解决办法
1255
查看次数

c ++何时返回const char*而不是std:string

在下面的课程中是否有任何好处或原因,为什么speak()返回一个const char*而不是std::string

class Animal
{
protected:
    std::string m_name;

    Animal(std::string name)
    : m_name(name)
    {
    }

public:
    std::string getName() { return m_name; }
    const char* speak() { return "???"; }
};
Run Code Online (Sandbox Code Playgroud)

c++ string pointers char

5
推荐指数
2
解决办法
1150
查看次数

是否有按值传递类对象的标准过程?

是否有按值传递类的标准过程?换句话说,如果我这样做:

struct Test
{
  int a;
  double b;
}

void DoSomething(Test t)
{
  std::cout << t.a << std::endl;
  std::cout << t.b << std::endl;
}

//...

Test myObj;
myObj.a = 5;
myObj.b = 10.5;

DoSomething(myObj);
Run Code Online (Sandbox Code Playgroud)

假设标准打包和布局,标准是否提供任何保证,无论编译器如何,都将以一致的方式发送和接收类?


因为我预期会有"你为什么要这样做?"的问题.或者"感觉就像一个XY问题",这是(冗长的)背景.我试图在EXE和用不同编译器编译的DLL之间来回传递一个类对象,看起来没有从正确的起始地址读取类对象.但是,如果我通过引用传递对象,这个问题就会消失.(奖金问题 - 为什么通过参考工作时传递值不会?我在传递值的印象下会复制对象并传递对副本的引用.显然我在这里误解了一些东西.)

c++ standards winapi c++11

3
推荐指数
1
解决办法
386
查看次数

#pragma pack(16)和#pragma pack(8)的效果总是一样吗?

我试图通过使用对齐数据成员#pragma pack (n).以下面的例子为例:

#include <iostream>
using namespace std;

#pragma pack(8) // or (16)

struct A
{
    int a;
    char b;
    char c;
    char d;
    char e;
    char f;
    double g;
};
int main()
{
    cout << sizeof(A) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

两者都打印24#pragma pack(8)#pragma pack(16).根据我的理解,我可以理解n=8数据对齐的结果如下:

Bytes: |1 2 3 4|5|6|7|8|9|10 11 12 13 14 15 16|17 18 19 20 21 22 23 24|
 Data: |a      |b|c|d|e|f|padding             |g                      |
Run Code Online (Sandbox Code Playgroud)

但我无法理解为什么结果仍然24 …

c++ pragma memory-alignment c-preprocessor preprocessor-directive

3
推荐指数
1
解决办法
822
查看次数