gpt4 book ai didi

c++ - Win32 DLL 没有返回正确的数据

转载 作者:行者123 更新时间:2023-12-01 14:20:23 26 4
gpt4 key购买 nike

我是 C++ 编程的新手。我有一个可以使用 Win32 DLL 的第三方应用程序。我正在处理的测试项目编译没有错误,但在使用中似乎并没有真正返回预期的数据。

对于下面的函数 Foo,期望传入的 char 数组将返回相同的值。

相反,无论在我的第 3 方应用程序中传递的数据如何,都只会看到返回值: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 风格的、以 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;
}

关于c++ - Win32 DLL 没有返回正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60779444/

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