gpt4 book ai didi

c# - 将C#中的char*和struct传递给c++ DLL,除一个变量外,所有变量都成功传递

转载 作者:行者123 更新时间:2023-11-28 01:08:12 25 4
gpt4 key购买 nike

我已经用我拥有的 lib 文件为 C dll 编写了一个 c++ 包装器 dll,现在一切都在部分工作,我在 c++ 包装器类中编写的所有函数都按预期工作。

在C++ dll中

__declspec(dllexport) long ReadRawDataByTime(char * tagname, long serverhandle, IHU_TIMESTAMP * StartTime, IHU_TIMESTAMP * EndTime, int * number_of_samples, IHU_DATA_SAMPLE **data_values){
return ihuReadRawDataByTime(serverhandle, tagname, StartTime, EndTime, number_of_samples, data_values);
}

这是我的定义以及我如何在 C# 中调用它

        [DllImport("IHUAPIWrapper.dll")]
public static extern long ReadRawDataByTime(String tagname, long serverhandle, IHU_TIMESTAMP* StartTime, IHU_TIMESTAMP* EndTime, int* number_of_samples, IHU_DATA_SAMPLE** data_values);
...
long lRet = ReadRawDataByTime
(
tagname,//the handle returned from the connect
serverhandle, //the single tagname to retrieve
&temp_start_time, //start time for query
&temp_end_time, //end time for query
&number_of_samples, //will be set by API
&pSamples //will be allocated and populated in the user API
);

其中 tagname 被定义为一个字符串,其余的是它们适当的结构。

现在,如果我在 C++ dll 中设置调试器,我可以看到所有值都被正确传递,serverhandle 是预期的,tagname 包含正确的字符串,endTime 具有正确的时间,样本数和 pSamples 是预期的空白然而,当我肯定传递一个有效的结构时,startTime 是“未定义的”。

如果我在调试器中虚拟化变量,它甚至会返回预期的数据,它只是看起来没有正确传递变量。

我做了一些实验并交换了变量的顺序,所以先传递服务器句柄,然后传递标记名,如果我这样做,所有变量都是正确的,除了标记名现在是“未定义”

我传递破坏下一个变量的字符串的方式有问题吗?我是否需要指定一些特殊的调用约定,目前其他一切正常只是侥幸?

任何帮助将不胜感激。 :)

编辑:这里是调试器的屏幕截图,显示了我所说的关于传递的所有变量的意思,只有一个变量除外。 http://img602.imageshack.us/img602/5281/47739520.jpg

最佳答案

这里有很多危险信号。它不起作用,因为您没有指定 CallingConvention.Cdecl。 long 参数在 C# 端是 int。这将解决您原来的问题,现在一切都应该正确通过。当指针导致 AccessViolation 时开始另一个问题。

关于c# - 将C#中的char*和struct传递给c++ DLL,除一个变量外,所有变量都成功传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5024479/

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