【发布时间】:2011-02-17 02:33:26
【问题描述】:
我已经为一个带有 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
);
其中标记名被定义为一个字符串,其余的是它们相应的结构。
现在,如果我在 C++ dll 中设置调试器,我可以看到所有值都正确传入,serverhandle 符合预期,标记名包含正确的字符串,endTime 具有正确的时间,样本数和 pSamples 符合预期为空白但是当我肯定传入一个有效的结构时,startTime 是“未定义的”。
如果我在调试器中对变量进行虚拟化,它甚至会返回预期的数据,它只是显示它没有正确传递变量。
我做了一些实验并交换了变量的顺序,因此首先传递了服务器句柄,然后传递了标记名,如果这样做,所有变量都是正确的,除了标记名现在是“未定义”
我传递破坏下一个变量的字符串的方式有问题吗?我是否需要指定一些特殊的调用约定,而目前其他一切都可以正常工作只是侥幸?
任何帮助将不胜感激。 :)
编辑:这是调试器的屏幕截图,以显示我对传递的所有变量的意思,除了一个。
【问题讨论】:
标签: c# c++ dll interop dllimport