字符转换的一个问题 ( 积分: 80 )

  • 主题发起人 主题发起人 funxu
  • 开始时间 开始时间
F

funxu

Unregistered / Unconfirmed
GUEST, unregistred user!
最近有个字符转换的任务,但是要求能被vb调用,本人对vb不是很熟,找了个同事人要了个utf8tounicode的dll可是vb调不了<br>另外下面代码中//fillchar(p,255,0);之后会将输入的字符串也清空,不知到为什么,而且不仅vb调不了,同时delphi调用也会出错,感觉上是使用了string的缘故,请问如何修改<br>问题<br>1.为什么fillchar(p,255,0);之后会将输入的字符串也清空<br>2.为什么delphi无法正常使用,总是说无效的指针入口云云<br>3.怎么让vb调用呀<br>library Project1;<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> &nbsp;Dialogs, StdCtrls, ShlObj,shellapi,ActiveX, ComObj, CommCtrl;<br><br>{$R *.res}<br>procedure freemm(id:pwidechar);<br>var<br> &nbsp;Malloc:IMalloc;<br>begin<br> &nbsp;if ID = nil then Exit;<br> &nbsp;OLECheck(SHGetMalloc(Malloc));<br> &nbsp;Malloc.Free(ID);<br>end;<br><br>function Createmm(cbSize:UINT):pwidechar;<br> &nbsp;var<br> &nbsp;lpMalloc:IMalloc;<br> &nbsp;begin<br> &nbsp;if SHGetMalloc(lpMalloc) &amp;lt;&amp;gt; NOERROR then<br> &nbsp;begin<br> &nbsp;Result := nil;<br> &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;Result := lpMAlloc.Alloc(cbSize);<br> &nbsp;if Result &amp;lt;&amp;gt; nil then<br> &nbsp;FillChar(Result^, cbSize,#0);<br> &nbsp;end;<br><br>function pp(Dest: PWideChar; Source: PChar; MaxChars: Integer): Integer;stdcall;<br>var<br> &nbsp;len: Cardinal;<br>begin<br> &nbsp;len := 0;<br> &nbsp;if Source &amp;lt;&amp;gt; nil then<br> &nbsp; &nbsp;while Source[len] &amp;lt;&amp;gt; #0 do<br> &nbsp; &nbsp; &nbsp;Inc(len);<br> &nbsp;Result := Utf8ToUnicode(Dest, MaxChars, Source, len);<br> &nbsp;end;<br><br>function utf8toun(str:string):string;stdcall;<br>var<br>p:pwidechar;<br>begin<br>p:=Createmm(255);<br>//fillchar(p,255,0);//此处如果使用fillchar输入的str就会被清空为什么?<br>pp(p,@str,length(str));<br>result:=p;<br>freemm(p);<br>end;<br><br>exports<br>utf8toun;<br>begin<br><br>end.
 
最近有个字符转换的任务,但是要求能被vb调用,本人对vb不是很熟,找了个同事人要了个utf8tounicode的dll可是vb调不了<br>另外下面代码中//fillchar(p,255,0);之后会将输入的字符串也清空,不知到为什么,而且不仅vb调不了,同时delphi调用也会出错,感觉上是使用了string的缘故,请问如何修改<br>问题<br>1.为什么fillchar(p,255,0);之后会将输入的字符串也清空<br>2.为什么delphi无法正常使用,总是说无效的指针入口云云<br>3.怎么让vb调用呀<br>library Project1;<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> &nbsp;Dialogs, StdCtrls, ShlObj,shellapi,ActiveX, ComObj, CommCtrl;<br><br>{$R *.res}<br>procedure freemm(id:pwidechar);<br>var<br> &nbsp;Malloc:IMalloc;<br>begin<br> &nbsp;if ID = nil then Exit;<br> &nbsp;OLECheck(SHGetMalloc(Malloc));<br> &nbsp;Malloc.Free(ID);<br>end;<br><br>function Createmm(cbSize:UINT):pwidechar;<br> &nbsp;var<br> &nbsp;lpMalloc:IMalloc;<br> &nbsp;begin<br> &nbsp;if SHGetMalloc(lpMalloc) &amp;lt;&amp;gt; NOERROR then<br> &nbsp;begin<br> &nbsp;Result := nil;<br> &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;Result := lpMAlloc.Alloc(cbSize);<br> &nbsp;if Result &amp;lt;&amp;gt; nil then<br> &nbsp;FillChar(Result^, cbSize,#0);<br> &nbsp;end;<br><br>function pp(Dest: PWideChar; Source: PChar; MaxChars: Integer): Integer;stdcall;<br>var<br> &nbsp;len: Cardinal;<br>begin<br> &nbsp;len := 0;<br> &nbsp;if Source &amp;lt;&amp;gt; nil then<br> &nbsp; &nbsp;while Source[len] &amp;lt;&amp;gt; #0 do<br> &nbsp; &nbsp; &nbsp;Inc(len);<br> &nbsp;Result := Utf8ToUnicode(Dest, MaxChars, Source, len);<br> &nbsp;end;<br><br>function utf8toun(str:string):string;stdcall;<br>var<br>p:pwidechar;<br>begin<br>p:=Createmm(255);<br>//fillchar(p,255,0);//此处如果使用fillchar输入的str就会被清空为什么?<br>pp(p,@str,length(str));<br>result:=p;<br>freemm(p);<br>end;<br><br>exports<br>utf8toun;<br>begin<br><br>end.
 
用delphi写DLL当函数返回字符串时的确会出现无效的指针这种情况<br>解决方法是:不要以字符串的类型返回,或者以PCHAR的类型返回
 
?我相知道问题是出现在string上可是怎么让vb调用呀 为什么fillchar(p,255,0);之后会将输入的字符串也清空?<br>
 
谁能告诉我为什么fillchar(p,255,0);之后会将输入的字符串也清空呀?<br>
 
这也没人答呀,唉心情像冬天的气温,气温像delphibbs里无人问津的帖子,帖子像老牛定律证明的那样,会直线下降
 
FillChar函数<br>procedure FillChar(var X; Count: Integer; Value: Byte);<br><br>Description<br>FillChar fills Count contiguous bytes (referenced by X) with the value <br>specified by Value (Value can be type Byte or Char).<br>Warning: This function does not perform any range checking.<br>
 
我问的不是fillcha函数,我问的是<br>function utf8toun(str:string):string;stdcall;<br>var<br>p:pwidechar;<br>begin<br>p:=Createmm(255);<br>//fillchar(p,255,0);//此处如果使用fillchar但是输入的str就会被清空为什么?str是函数体的参数<br>pp(p,@str,length(str));<br>result:=p;<br>freemm(p);
 
看来是没人答了,倒数3.14天没人答就结贴,唉,白薯白薯便宜卖啦,感觉问问题还不如卖白薯舒畅,老是问的压抑、答的离题、看的不理、结的费尽
 
to funxu:,<br> &nbsp; 这个问题,我回答过,但是回帖丢了,再答一次:<br> &nbsp; 你的p虽然申请的是pwidechar,但是在用createmm时,缺是把它当成普通的pointer来申请内存,createmm后p已经不是指向widechar的指针了,而是指向widechar指针的指针,注意:是指针的指针,你看在createmm函数中,对result的值进行初始化是用 FillChar(Result^, cbSize,#0);就可以看出来,所有不能使用fillchar(p,255,0);来初始化p的内容,因为这样只是清p的指针,不是清他的内容,你应该用fillchar(p^,255,0);来初始化内容。因为你非法使用内存,所有把str的内容清掉了。<br> &nbsp; 应该这样使用:fillchar(p^,255,0);
 
深度感谢TYZhang同志的再次协助
 
后退
顶部