[英]Win32 DLL Not Returning correct data
我对 C++ 编程很陌生。 我有一个可以使用 Win32 DLL 的 3rd 方应用程序。 我正在处理的测试项目编译没有错误,但在使用中似乎实际上并没有返回预期的数据。
使用下面的函数 Foo,期望传入的 char 数组将返回相同的值。
相反,无论在我的 3rd 方应用程序中传递的数据如何,都只能看到返回值:0
我怀疑我没有正确使用指针 'char *data_out'。
DemoLib.h:
#pragma once
#define DLL_EXP extern "C" __declspec(dllexport)
DLL_EXP void Foo(char* data_in, char *data_out);
DemoLib.cpp:
#include "stdafx.h"
#include "DemoLib.h"
#include <iostream>
DLL_EXP void Foo(char* data_in, char *data_out)
{
int a_size = sizeof(data_in) / sizeof(char);
std::string s_a = convertToString(data_in, a_size);
char strArray[100];
strcpy_s(strArray, s_a.c_str());
data_out = strArray;
}
std::string convertToString(char* a, int size)
{
int i;
std::string s = "";
for (i = 0; i < size; i++) {
s = s + a[i];
}
return s;
}
出口.def:
LIBRARY DemoLib
EXPORTS
Foo @1
您的代码中有几个问题。 首先,线路:
int a_size = sizeof(data_in) / sizeof(char);
不会给你data_in
字符串的长度! 相反,它会给你一个(固定的)值,它是指针的大小除以字符的大小。 因此,假设您有一个 C 风格的空终止字符串,请使用以下命令:
int a_size = int(strlen(data_in));
其次,你的线路:
data_out = strArray;
不字符串数据复制从strArray
到data_out
! 相反,它只是将data_out
保存的指针值(地址)替换为(本地) strArray
数组的地址。 (但是,这不会改变调用模块中任何指针的值。)
在这里,您需要做的实际上是将数据直接从std::string
复制到data_out
参数指向的字符串中(假设它是一个足够大的缓冲区)。
考虑到这些变化,您的Foo
函数可能如下所示:
DLL_EXP void Foo(char* data_in, char *data_out)
{
int a_size = int(strlen(data_in)); // Note: "strlen" returns a "size_t" (unsigned) type
std::string s_a = convertToString(data_in, a_size);
strcpy(data_out, s_a.c_str());
}
static
;
(b) 使相应的参数成为一个指向指针的指针:
DLL_EXP void Foo(char* data_in, char** data_out) { int a_size = int(strlen(data_in)); // Note: "strlen" returns a "size_t" (unsigned) type std::string s_a = convertToString(data_in, a_size); static char strArray[100]; strcpy(strArray, s_a.c_str()); *data_out = strArray; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.