你能在第三方dll中使用std :: string吗?

时间:2016-10-24 05:45:30

标签: c++ dll

我一直在寻找我的问题的答案,但似乎大多数人都有兴趣在.dll边界传递std :: string。但我更感兴趣的是在我正在创建的.dll类中使用std :: string。

我将我的.dll(电子邮件)发布给论坛上的一群人我是分开的,所以我的问题是你可以在.dll中使用std :: string而不受编译器需要相同的限制,版本,CRT需要相同,等等。

你能举例说明什么是不安全的,什么是安全的?

示例:“下载程序”使用SetSender功能是否安全?

Mail.h

class _declspec(dllexport) Mail {

    struct ENVELOPE {
        std::wstring SenderEmail; //Should the type be LPWSTR or can it safely be std::wstring
        LPWSTR SenderName;

    }Envelope;

public:
    int SetSender(LPWSTR SenderEmail);
    Mail();
    ~Mail();

};

Mail.cpp

#include "stdafx.h"
#include "Mail.h"

int CoffeeBeans::Mail::SetSender(LPWSTR Email) {
 //Pass LPWSTR instead of std::wstring across .dll boundary

    if (Email == nullptr || lstrcmp(Email, L"") == 0) {
        throw L"Email was either nullptr or empty.";
    }

    this->Envelope.SenderEmail = SenderEmail;
    return 0;


}

1 个答案:

答案 0 :(得分:2)

使用指向字符串缓冲区的指针,如LPWSTRwchar_t*等,只要你的dll代码没有调用未指定的行为(内存分配正确,指针初始化),它将始终是安全的,你没有将指针传递给本地缓冲区等)。只要您的dll和主机使用相同的CRT版本,使用std::string只会安全 。如果版本不同,您的字符串可能会在任何执行阶段导致访问冲突(通常在字符串销毁时发生)。您可以通过分发您的dll源或为所有现有CRT编译不同的dll版本来确保CRT匹配(例如,Oracle为其OCCI库执行此操作)。如果客户端不使用C ++,这种方法当然不会起作用。