繁体   English   中英

Win32 DLL 没有返回正确的数据

[英]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;

字符串数据复制从strArraydata_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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM