gpt4 book ai didi

c++ - 将 STL 字符串从 C++/CLI 应用程序传递到 C++ DLL

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:42 24 4
gpt4 key购买 nike

我有一个使用 OpenCV 的 C++/CLI 项目。我自己在 VS 2010 中编译了这个版本的 OpenCV,我可以在非托管项目中毫无问题地使用它——当我试图在托管项目中使用它时,问题就开始了。

感兴趣的函数是cv::imread(std::string&, int)。简单地从托管模块调用它根本不起作用,在接收端产生 。我有点期待。毕竟,托管代码有自己的 std::string 实现。

当我创建一个单独的 C++ 文件、从其模块中删除 CLI 支持并将我的代码放入其中时,事情变得更有趣了。现在,imread 得到了一个有效的指针,但它的内容被打乱了。显然,我传递给它的 string 包含偏移 4 个字节的字符串指针,但它期望它位于 0 偏移处。

非托管模块使用与 OpenCV 相同的 CRT DLL,并将所有选项设置为适合正常 OpenCV 使用的值。为什么它会有不同的 string 布局?我迷路了。

示例代码:

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <string>

using namespace cv;
using namespace std;

void Run()
{
string path("C:\\Users\\Don Reba\\Pictures\\Merlin 1D.jpg");

Mat image(imread(path, CV_LOAD_IMAGE_GRAYSCALE));
imwrite("image.jpg", image);
}

最佳答案

回答标题中的问题:不,您不能直接将 std::string 从托管代码编码到非托管代码。查看 another SO question 的答案关于原因。主要原因是 std::string 是一个模板而不是“真实”类型。

基本上,您需要编写一个小的非托管模块,为 openCV 函数提供简单的包装,摆脱 STL 类型。使用您的示例函数,它可以这么简单:

declspec(__dllexport) imread(char* c, int i) {
string s = c;
cv::imread(s, i);
}

至于字符串偏移的问题...尝试创建一个单独的项目,从一开始就使用“Unmanaged”类型。将项目切换到托管和返回可能会导致项目设置困惑,产生不可预测的后果 - 至少,我已经两次遇到这样的坑......

关于c++ - 将 STL 字符串从 C++/CLI 应用程序传递到 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14971590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com