Win32 DLL未返回正确的数据

  • 本文关键字:数据 返回 DLL Win32 c++
  • 更新时间 :
  • 英文 :


我对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;
}

最新更新