我对C++编程很陌生。我有一个可以利用Win32 DLL的第三方应用程序。我正在进行的测试项目编译时没有出错,但在使用中似乎并没有实际返回预期的数据。
对于下面的函数Foo,期望传入的char数组将返回相同的值。
相反,无论在我的第三方应用程序中传递的数据如何,都只能看到返回值: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;
}
Exports.def:
LIBRARY DemoLib
EXPORTS
Foo @1
您的代码中有几个问题。首先,线路:
int a_size = sizeof(data_in) / sizeof(char);
不会给您data_in
字符串的长度!相反,它会给您一个(固定(值,即指针的大小除以字符的大小。因此,假设您有一个C风格的、以null结尾的字符串,请使用以下内容:
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());
}
或者,如果您确实希望函数返回指向某些本地数据的指针,那么您将:(a(需要声明本地数据
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;
}