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

我一直在寻找我的问题的答案,但似乎大多数人都有兴趣通过.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;


}

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

点赞