hi我从非托管代码返回一个LPTSTR
类型的对象,该对象本质上指向一个字符串。我现在在托管代码中,无法在C#中读取它。返回的字符串只是"YYYYYYYYYYYYYYYYYYYYYYY"。。
这是我的托管代码片段。
[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;
托管:
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);
这是一个未知数,但您的本机函数是否返回了堆栈上分配的对象?如果是这样,你就不能那样做。
一旦你解决了这个问题,你就可以开始考虑在内存不再有用后如何处理它,或者你的手上会有内存泄漏。