将字符串值从非托管代码传递到托管代码?

时间:2011-06-01 19:13:01

标签: c# visual-c++ unmanaged managed

嗨我从非托管代码返回一个LPTSTR类型的对象,它实际上指向一个字符串。我现在在托管代码中,我无法在C#中阅读它。返回的字符串只是“YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY”..

这是我的托管代码段。

[DllImport("TableConfig.dll", EntryPoint = "?getTableConfigDlg@@QAEPA_WXZ", CharSet = CharSet.Ansi)]
        static extern String getColumnNamesFormat();

这有什么问题吗? 如何从非托管代码返回的字符串中获取有意义的数据?

由于

原生代码: -

for(int i=0; i<numCols; ++i)
{
    const bet_TableConfigColumn *col_p = tc_p->getColumn(i);
    const char* colName = tc_p->getKeyName(i);
    const char* colFormat = col_p->getFormat();
    str+=",";
    str+=colName;
    cout << "Col Name" << colName << "Format: " << colFormat;

} // end of for(i)
         LPTSTR pString=str.GetBuffer(0);
            str.ReleaseBuffer();
      return pString;

2 个答案:

答案 0 :(得分:-1)

托管:

DllImport("TableConfig.dll", EntryPoint = "?getTableConfigDlg@@QAEPA_WXZ")]
static extern void getColumnNamesFormat( StringBuilder tableNames );

StringBuilder result = new StringBuilder( 255 );
getColumnNamesFormat( result );

本机:

更改方法签名以返回void,为受管缓冲区接收LPTSTR。

_tcscpy(managedBuffer, str);

答案 1 :(得分:-1)

在黑暗中拍摄,但你的本机函数是否返回堆栈中分配的对象?如果是这样,你就不能这样做。

一旦你完成了这个问题的修复,你就可以开始考虑在它不再有用之后你将如何处理内存,或者你手上会有内存泄漏。