我有一个很好的库来管理需要返回特定字符串列表的文件.因为我将要使用它的唯一代码是C++(和Java,但是通过JNI使用C++)我决定使用标准库中的vector.库函数看起来有点像这样(其中FILE_MANAGER_EXPORT是平台定义的导出要求):
extern "C" FILE_MANAGER_EXPORT void get_all_files(vector<string> &files)
{
files.clear();
for (vector<file_struct>::iterator i = file_structs.begin(); i != file_structs.end(); ++i)
{
files.push_back(i->full_path);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用向量作为参考而不是返回值的原因是试图保持内存分配的合理性,因为我真的不高兴我在c ++返回类型周围有外部"C"(谁知道为什么,我的理解是所有extern" C"确实可以防止编译器中的名称损坏.无论如何,与其他c ++一起使用的代码通常如下:
#if defined _WIN32
#include <Windows.h>
#define GET_METHOD GetProcAddress
#define OPEN_LIBRARY(X) LoadLibrary((LPCSTR)X)
#define LIBRARY_POINTER_TYPE HMODULE
#define CLOSE_LIBRARY FreeLibrary
#else
#include <dlfcn.h>
#define GET_METHOD dlsym
#define OPEN_LIBRARY(X) dlopen(X, RTLD_NOW)
#define LIBRARY_POINTER_TYPE void*
#define CLOSE_LIBRARY dlclose
#endif
typedef void (*GetAllFilesType)(vector<string> &files);
int main(int argc, char **argv)
{
LIBRARY_POINTER_TYPE manager = LOAD_LIBRARY("library.dll"); //Just an example, actual name is …Run Code Online (Sandbox Code Playgroud) 我在Visual Studio 2010中设置了一个项目,以针对现有的MFC DLL编写单元测试.我正在使用单头单元测试框架,并链接到单元测试项目中的MFC DLL的lib包装器.我正在尝试构建一个接受std::wstring它的构造函数的类.这是我的测试的样子:
TEST_CASE("MyProject/MyTest", "Do the test.")
{
MockDbService mockDbService;
Foobar foo(L"{F00DFACE-FEED-DEAD-BEEF-C0FFEEDECADE}", mockDbService);
foo.loadObject();
REQUIRE(mockDbService.getMethodInvokeCount("query()") >= 1);
}
Run Code Online (Sandbox Code Playgroud)
Foobar从测试中的MFC DLL导出的类在哪里.但是,测试框架会报告意外的异常.std::wstring在将字符串复制到构造函数时,我将其跟踪到了复制构造Foobar函数.MSVC调试器将源字符串报告为<Bad Ptr>.
我创建了一个虚拟构造函数,Foobar::Foobar(long num, IDbService& db)所有的值(包括IDbService&)都很好.
MFC DLL和我的单元测试EXE都共享一个属性表,它应该保持编译器标志等效.我正在调试模式下构建并运行测试.任何想法为什么std::wstring不能跨DLL复制?