【发布时间】:2009-10-29 14:59:41
【问题描述】:
我有一些 C# 代码调用非托管 C++ DLL。我正在调用的方法旨在接受一个字符串作为参考。为了处理这个问题,我传入了一个 StringBuilder,否则会出现 StackOverflowException。
这工作正常,但在某些调用中,从非托管代码返回的字符串是这样的混乱字符串:øŸE~.,Ê。我知道这一定与编码有关,但是我尝试了下面列出的几件事,但没有任何效果。这不是其他人编写的用于执行类似操作的 VB.Net 代码中的问题。
这是我尝试过的: 1. 我正在使用这个:[DllImport("dmphnx32.dll")],但是尝试了所有字符集选项都没有成功。
- 尝试使用 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;
}
谢谢, 科里
【问题讨论】:
-
您能否发布您尝试调用的 C++ 方法的声明?
-
如果您可以使用 C++ 代码(并且足够小可以发布),请发布。
-
另外发布调用代码的 sn-p
标签: c# c++ encoding unmanaged dllimport