gpt4 book ai didi

C# 调用非托管 C++ 返回正方形符号字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:18 25 4
gpt4 key购买 nike

我有一些 C# 代码调用非托管 C++ DLL。我调用的方法旨在接受一个字符串作为引用。为了处理这个问题,我传入了一个 StringBuilder,否则会出现 StackOverflowException。

这工作正常,但在某些调用中,从非托管代码返回的字符串是一个困惑的字符串,如下所示:øŸE∼.,Ê。我知道这一定与编码有关,但我已经尝试了下面列出的几种方法,但没有任何效果。这不是其他人为执行类似操作而编写的 VB.Net 代码中的问题。

这是我尝试过的:1. 我正在使用这个:[DllImport("dmphnx32.dll")],但尝试了所有字符集选项但都没有成功。

  1. 尝试使用 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;
}

谢谢,科里

最佳答案

好的,我明白你的问题了。您需要为 StringBuilder 分配容量,不能只使用默认值。

关于C# 调用非托管 C++ 返回正方形符号字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1644325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com