这样的VC语句怎么样转化为DELPHI (200分)

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

fartripLiao

Unregistered / Unconfirmed
GUEST, unregistred user!
_OSD_BASE = $9000;
_OSD_YEAR4 = _OSD_BASE+0;
_OSD_YEAR2 = _OSD_BASE+1;
_OSD_MONTH3 = _OSD_BASE+2;
_OSD_MONTH2 = _OSD_BASE+3;
_OSD_DAY = _OSD_BASE+4;
_OSD_WEEK3 = _OSD_BASE+5;
_OSD_CWEEK1 = _OSD_BASE+6;
_OSD_HOUR24 = _OSD_BASE+7;
_OSD_HOUR12 = _OSD_BASE+8;
_OSD_MINUTE = _OSD_BASE+9;
_OSD_SECOND = _OSD_BASE+10;
USHORT Format2[40] = {24, 240, _OSD_YEAR2, '-',_OSD_MONTH2,'-',_OSD_DAY,'-', _OSD_HOUR24, ':', _OSD_MINUTE,':', _OSD_SECOND, '/0'};
USHORT Format1[40] = {48, 16, '办','公','室','风', '景', '/0'};
VC调用方式:
SetOsdDisplayMode(ChannelHandle, 255, TRUE, 0, Format1, Format2);
VC声明
DLLEXPORT_API int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2);

要转化为DELPHI的方法 ,另请各位测试一下,编译是否通过
 
这样吧
Format1: WideString = #48#16'办公室风景';
在Delphi中定义导入的外部函数
function SetOsdDisplayMode(Format: PWideChar); stdcall; external 'mylib.dll';

调用时
SetOsdDisplayMode(PWideChar(Format1));

 
不好意思,函数定义少定义了返回值,应该为
function SetOsdDisplayMode(Format: PWideChar): Integer; stdcall; external 'mylib.dll';
 
不行请你测试一下。
 
补充,
USHORT Format2[40] = {24, 240, _OSD_YEAR2, '-',_OSD_MONTH2,'-',_OSD_DAY,'-', _OSD_HOUR24, ':', _OSD_MINUTE,':', _OSD_SECOND, '/0'};
USHORT Format1[40] = {48, 16, '办','公','室','风', '景', '/0'};
VC调用方式:
SetOsdDisplayMode(ChannelHandle, 255, TRUE, 0, Format1, Format2);
VC声明
DLLEXPORT_API int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2);

要转化为DELPHI的方法
 
function SetOsdDisplayMode(Format: PWideChar):integer; stdcall; external 'mylib.dll';

PWideChar 改成 pword 也可以,根据需要!或调用的方便。

var
Format1:WideString;
begin
Format1:=#48#16'办公室风景'#0;
SetOsdDisplayMode(pwideChar(@Format1[1]));
 
这样吧:

SetOsdDisplayMode(ChannelHandle, 255, TRUE, 0, Format1, Format2);
VC声明
DLLEXPORT_API int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2);

要转化为DELPHI的方法
function SetOsdDisplayMode(hChannelHandle: THandle; Brightness: Integer; Translucent: LongBool; TwinkleInterbal: Integer; Format1, Format2: PWideChar): Integer; stdcall;
external '此处写成动态连接库的文件名';
定义WideString 调用时 强制转换为PWideChar

因为用的Unicode字符集,在VC中必须用 USHORT *
在Delphi中直接用 PWideChar是等效的

 
方法和思路是这样的,自己要学会灵活运用,
动态链接库的名字要根据需要自己来写,抄我的可不兴啊
 
var
Format1,Format2:widestring;

begin
Format2:=#24#240+
chr(_OSD_YEAR4)+'-'+chr(_OSD_MONTH2)+'-'+
chr(_OSD_DAY)+'-'+chr(_OSD_HOUR24)+'-'+
chr(_OSD_MINUTE)+'-'+chr(_OSD_SECOND)+
#0;
Format1:='我的测试'+chr(0);
SetOsdDisplayMode(ChannelHandle, 255, TRUE, 0, pwidechar(Format1), pwideChar(Format2));
end;
DLL定义:
function SetOsdDisplayMode(HChannelHandle:THandle;
Brightness :integer;
Translucent :Boolean;
TwinkleInterval:integer;
Format1 :PWideChar;
Format2 :PWideChar):integer;
Stdcall; external SDKDLL;

编译可以能过但运行出错。read address 0x00200020
 
是启动时出错还是执行函数时出错呢?
看一下出错的地址可能是哪一个指针的值
 
Format1,Format2两个都出错你有没有QQ,
我的QQ是165901
 
如果DLL不大,你发给我还有相关的文件
 
邮件已发出。
 
很遗憾,我无法调试,打了下面几行,提示要装驱动程序。

function GetTotalDSPs:integer;stdcall;external 'tmsdk.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(GetTotalDSPs));
end;
 
var
Format1,Format2:widestring;

begin
Format2:=#24#240+
chr(_OSD_YEAR4)+'-'+chr(_OSD_MONTH2)+'-'+
chr(_OSD_DAY)+'-'+chr(_OSD_HOUR24)+'-'+
chr(_OSD_MINUTE)+'-'+chr(_OSD_SECOND)+
#0;
Format1:='我的测试'+chr(0);

把上面的 chr 全部改成 wideChar


SetOsdDisplayMode(ChannelHandle, 255, TRUE, 0, @Format1[1], @Format2[1]);
///////// /////////
再不行把 第三个参数声明为 integer 调用时参数给 1
/////
 
这里的问题,有可能是因为将 format1 和 format2 声明为 wideString 的问题。
wideString这种类型是比较讨厌的。
你可以考虑将 format1 和 format2 声明为
array[0..39] of word;
format1[0]:=48; ........ 这样赋值。
format1[1]:=16;
format1[2]:=ord('办');

修改原型,并这样给参数: @format1,@format2
 
很不理解jsxjd为什么说 WideString 比较讨厌
C和C++本身不支持Unicode字符集,
所以他的WideString只能声明成 USHORT*
WideString和String是很类似的,不知道你讨不讨厌String
 
修改原型,并这样给参数: @format1,@format2

function SetOsdDisplayMode(HChannelHandle:THandle;
Brightness :integer;
Translucent :Boolean;
TwinkleInterval:integer;
Format1 :PWideChar;
Format2 :PWideChar):integer;
Stdcall; external SDKDLL;
上面又怎么定义
 
function SetOsdDisplayMode(HChannelHandle:THandle;
Brightness :integer;
Translucent :Boolean;
TwinkleInterval:integer;
Format1 :PWORD;
Format2 :PWORD):integer;
Stdcall; external SDKDLL;
 
后退
顶部