我一直在寻找我的问题的答案,但似乎大多数人都有兴趣通过.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,这种方法当然不会起作用.