嗨我从非托管代码返回一个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;
答案 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)
在黑暗中拍摄,但你的本机函数是否返回堆栈中分配的对象?如果是这样,你就不能这样做。
一旦你完成了这个问题的修复,你就可以开始考虑在它不再有用之后你将如何处理内存,或者你手上会有内存泄漏。