请问一个汉字类型转换的问题(88分)

  • 主题发起人 主题发起人 xiaer_wang
  • 开始时间 开始时间
X

xiaer_wang

Unregistered / Unconfirmed
GUEST, unregistred user!
我从一个C++Dll里面调用了一个函数,原型:
SetOsdDisplayMode(Handle hChannelHandle,int Brightness,Bool Translucent,int twinkle,ushort Format1,ushort format2);
其中ushort format1,format2是描述字符叠加顺序的格式串,具体定义是:
Ushort x,ushort y,CHAR,CHAR1...CHARN.CharN也是Ushort类型的参数。
还有一个例子uShort Format[]={16,19,'办','公','室'};

请问,我怎么把这个format类型在delphi中重新定义,然后达到能显示汉字的效果?
 
wideChar(Format[2])+.......
//////
pwideString(PWideChar(pointer(format))+2);
 
呵呵,我刚学delphi

能不能解释一下啊

看不懂//shy
 
你可以执行一下以下程序,自己去悟吧!

procedure TForm1.Button1Click(Sender: TObject);
var
F:array[0..10] of word;
s:string;
begin

f[2]:=21150;
f[3]:=20844;
f[4]:=23460;
s:=wideChar(integer(F[2]));
s:=s+wideChar(integer(F[3]));
s:=s+wideChar(integer(F[4]));
showmessage(s);

F[5]:=0;
showmessage(pwidechar(@f[2]));

end;
 

可能我没把问题说清楚
我是想传一个格式串过去,然后让动态联接库来显示汉字。
我自己的程序是这么写的,无法输出。
我很想知道上面程序里面 f[2],f[3]的值是怎么得到的

var tempWideChar:Widechar;
begin
tempScenePosition:='办公室';
k:=sizeof(tempScenePosition);
if k<> 0 then
begin
format1[1]:=Widechar(16);
Format1[2]:=Widechar(19);
Format2[1]:=Widechar(0);
format2[2]:=Widechar(0);
format2[3]:=Widechar(0);
for i:=1 to k+1 do
Format1[2+i]:==tempScenePosition;
Format1[k+2]:=WideChar(0);
SetOsdDisplayMode(ChannelHandle[j-1],255,TRUE,0,format1,format2);
end;
然后运行结果是得不到任何的输出;
 
你是怎么声明的。
改一下原型:

SetOsdDisplayMode(Handle hChannelHandle,int Brightness,Bool Translucent,int twinkle,ushort Format1,ushort format2)
stdcall;
============================= ======//看看要不要这个
改成 var format1:word;var format2:word
不行的话,你把完整的原型声明和示例贴出来。
 
to jsxjd
我有个C++写的实例代码
USHORT Format1[40] = {48, 16, '办','公','室','/0'};
USHORT Format2[40] = {24, 270, _OSD_YEAR2, '-',_OSD_MONTH2,'-',_OSD_DAY,'-', _OSD_HOUR24, ':', _OSD_MINUTE,':', _OSD_SECOND, '/0'};

我把我完整的代码给你看看
type arrayWord=array[0..40] of word;
function SetOsdDisplayMode(hChannelHandle: THandle;
Brightness: Integer;
Translucent: Bool;
TwinkleInterval: Integer;
var Format1: arrayWord;
var Format2: arrayWord): integer
cdecl {$IFDEF WIN32} stdcall {$ENDIF};
procedure TfMainFormMonitor.SetOsdMode;
var i,j,k:integer;
tempScenePosition:widestring;
format1,format2:ArrayWord;
TempString:Widechar;
begin
for i:=0 to 40 do
begin
format1:=0;
format2:=0;
end;
for j:=1 to channelTotalNum do
begin
tempScenePosition:=scenePosition[j]
//这里是从一个数组读场景
k:=sizeof(tempScenePosition);
if k<> 0 then
begin
format1[1]:=16;
Format1[2]:=19;
Format2[1]:=0;
format2[2]:=0;
format2[3]:=0;
for i:=1 to k+1 do
begin
tempstring:=tempScenePosition

Format1[2+i]:=PWord(@tempstring)^
//这里返回每个汉字的Word值
end;
try
SetOsdDisplayMode(ChannelHandle[j-1],255,TRUE,0,format1,format2);
SetOsd(ChannelHandle[j-1], TRUE);
except
SetOsd(ChannelHandle[j-1],false);
end;
end;
//哎,我觉得我写得没错,可是输出的时候是乱码,一些很奇怪的字符。
end;
end;
 
注意一下参数传递顺序的问题,最好把你的c++写的函数声明为WINAPI的。
 
to bxch_1000

能说的详细一点吗?不是特别明白你的意思
 
你用的 stdcall 是指名参数传递顺序是从右到左,这是WINAPI的调用方式,
所以你的c++的函数声明应该写为
int WINAPI 函数名(参数);
 
谢谢大家,我的问题已经解决了。

好像是编码的问题,不能直接使用汉字的Word值,而是高位和低位各加$100。呵呵

我也不清楚为什么。

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部