У меня есть код C#, вызывающий в неуправляемую C++ DLL. Метод, который я вызываю, предназначен для принятия строки в качестве ссылки. Для этого я передаю StringBuilder, иначе существует исключение StackOverflowException.C# вызов неуправляемой C++ возвращающей строки символов квадратов
Это прекрасно работает, но по некоторым вызовам строка, возвращающаяся из неуправляемого кода, представляет собой перемешанную строку, подобную этой: øŸE~., Ê. Я знаю, что это должно иметь какое-то отношение к кодированию, но я пробовал несколько вещей, перечисленных ниже, и ничего не работает. Это не проблема в коде VB.Net, которую кто-то написал, чтобы сделать что-то подобное.
Вот что я пробовал: 1. Я использую это: [DllImport («dmphnx32.dll»)], но пробовал все варианты Charset без успеха.
- Пытался использовать Encoding.Default.GetBytes, Encoding.ASCII, Encoding.Unicode и остальное без успеха.
У меня нет опыта работы с C++, поэтому я действительно могу использовать справку.
Вот метод DllImport:
[DllImport("dmphnx32.dll")]
public static extern int PhxQueryDataAttributes(int handle,
StringBuilder lTableName,
StringBuilder lColumnName,
ref short lIteration,
ref short type,
ref short maxLen,
ref short endorsement,
StringBuilder endorsementId);
Вот код C++:
short DMEXP PhxQueryDataAttributes(HWND handle,
char *lTableName,
char *lColumnName,
short *lIteration,
short *Type,
short *MaxLen,
short *Endorsement,
char *EndorsementID)
{
handle = PhxInfo.HiddenHwnd;
strcpy(lTableName, PhxInfo.TableName);
strcpy(lColumnName, PhxInfo.ColumnName);
*Type = PhxInfo.PhnxDataType;
// max len
*MaxLen = PhxInfo.MaxDataLen;
*Endorsement = PhxInfo.Endorsement;
strcpy(EndorsementID, PhxInfo.EndorsementID);
// determine which table we need the iteration of
*lIteration = PhxIterationArray[PhxInfo.sEffectiveTableID];
return SUCCESS;
}
Вот C# код, который вызывает в неуправляемый код:
public int PhxQueryDataAttributes(int handle, ref string lTableName, ref string lColumnName,
ref short lIteration, ref short type, ref short maxLen, ref short endorsement,
ref string endorsementId)
{
var sbTableName = new StringBuilder();
var sbColName = new StringBuilder();
var sbEndId = new StringBuilder();
var ret = RatingProxy.PhxQueryDataAttributes(handle, sbTableName, sbColName,
ref lIteration, ref type, ref maxLen, ref endorsement, sbEndId);
lTableName = sbTableName.ToString();
lColumnName = sbColName.ToString();
endorsementId = sbEndId.ToString();
return ret;
}
Спасибо, Corey
Можете ли вы опубликовать объявление метода C++, который вы пытаетесь позвонить? – Christian
И отправьте код C++, если он вам доступен (и достаточно небольшой для публикации). –
Также отправьте фрагмент вызывающего кода – RobertL