VC中Dll的函数定义如下:
char* GetSplitedWords(HANDLE hHandle , int i)
{
char* sWord;
SHLSegWord* pWord; //一个结构体
pWord = HLGetWordAt(hHandle,i); //注:海量分词函数,在另一dll中
sWord = pWord->s_szWord; //s_szWord为字符串(char*)
return sWord;
}
C#中调用定义:
[DllImport("Split.dll",CharSet = CharSet.Ansi,
CallingConvention=CallingConvention.Cdecl)]
static extern StringBuilder GetSplitedWords(IntPtr hHandle,int i);
//以下是C#函数定义部分
public string GetWords(string strText)
{
StringBuilder sResult = new StringBuilder();
……
for(int i=0;i<wordCnt;i++)
{
StringBuilder sTmp = GetSplitedWords(m_Handle,i);
sResult.Append(sTmp);
sResult.Append('/');
}
return sResult.ToString();
}
执行结果:有些文本(strText)能正常执行,有些执行过程中出现"未将对象引用设置到对象的实例"错误。例如,strText="我爱北京天安门。"可以正确执行,strText="我爱北京天安门,天安门上太阳升。"就会出现错误。
需要说明的是,上述定义在VC中调用一切正常。另外,如果将VC函数定义中的返回值改为空字符串,并加入MessageBox()测试,测试结果正常,即将VC定义中的最后两句改为:
MessageBox(NULL,sWord,"Test",MB_OK);
return "";
char* GetSplitedWords(HANDLE hHandle , int i)
{
char* sWord;
SHLSegWord* pWord; //一个结构体
pWord = HLGetWordAt(hHandle,i); //注:海量分词函数,在另一dll中
sWord = pWord->s_szWord; //s_szWord为字符串(char*)
return sWord;
}
C#中调用定义:
[DllImport("Split.dll",CharSet = CharSet.Ansi,
CallingConvention=CallingConvention.Cdecl)]
static extern StringBuilder GetSplitedWords(IntPtr hHandle,int i);
//以下是C#函数定义部分
public string GetWords(string strText)
{
StringBuilder sResult = new StringBuilder();
……
for(int i=0;i<wordCnt;i++)
{
StringBuilder sTmp = GetSplitedWords(m_Handle,i);
sResult.Append(sTmp);
sResult.Append('/');
}
return sResult.ToString();
}
执行结果:有些文本(strText)能正常执行,有些执行过程中出现"未将对象引用设置到对象的实例"错误。例如,strText="我爱北京天安门。"可以正确执行,strText="我爱北京天安门,天安门上太阳升。"就会出现错误。
需要说明的是,上述定义在VC中调用一切正常。另外,如果将VC函数定义中的返回值改为空字符串,并加入MessageBox()测试,测试结果正常,即将VC定义中的最后两句改为:
MessageBox(NULL,sWord,"Test",MB_OK);
return "";
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货