我一直在寻找我的问题的答案,但似乎大多数人都有兴趣在.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;
}
答案 0 :(得分:2)
使用指向字符串缓冲区的指针,如LPWSTR
或wchar_t*
等,只要你的dll代码没有调用未指定的行为(内存分配正确,指针初始化),它将始终是安全的,你没有将指针传递给本地缓冲区等)。只要您的dll和主机使用相同的CRT版本,使用std::string
只会安全 。如果版本不同,您的字符串可能会在任何执行阶段导致访问冲突(通常在字符串销毁时发生)。您可以通过分发您的dll源或为所有现有CRT编译不同的dll版本来确保CRT匹配(例如,Oracle为其OCCI
库执行此操作)。如果客户端不使用C ++,这种方法当然不会起作用。