这样的VC函数怎么样转化为DELPHI的函数,特附上VC的相关代码!急急!300分,搞定之后可多加200分。 (300分)

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

fartripLiao

Unregistered / Unconfirmed
GUEST, unregistred user!
MapLogicScreenToUserScreen这个函数需要译成DELPHI
BOOL WINAPI MapLogicScreenToUserScreen(RECT *rcLogic,
RECT *rcUser,
CAP_WND_POS *pCardPos,
DWORD dwCardCount);
说明: 设置Overlay屏幕区域到用户屏幕区域的映射关系。
系统初始化时创建了一个同屏幕大小一致的Overlay屏幕区域,
我们称之为逻辑屏幕区域,用户屏幕区域则是指我们所看到
的实际屏幕区域。StartOverlay函数中传入的矩形参数实际上
是在逻辑屏幕区域的绝对位置,由于系统初始化时两区域的
1:1关系,所以我们可以得到同坐标同大小用户屏幕区域的
视频图像。利用此函数则可重建此映射关系,以改变图像大
小/位置等比例关系。
参数: rcLogic:
Overlay逻辑屏幕区域指针,NULL表示整个逻辑屏幕
区域(此时等同于用户屏幕区域)
RcUser:用户屏幕区域指针,为NULL表示整个用户屏幕区域。
pCardPos:结构数组指针,NULL表示重置所有窗口。详见下述结构说明。
DwCardCount: pCardPos结构数组的成员个数。
返回值:TRUE: 成功
FALSE: 失败.
结 构:typedef struct tagCardRect
{
DWORD dwCard; //卡号
RECT rcUser; //新的用户屏幕区域位置
}CAP_WND_POS;

例: 我们在逻辑屏幕上相临区域创建了四路(卡)视频输出,
如左图小区域0 1 2 3 所示,如在通常1:1映射方式下工作,
这四路输出将显示到用户屏幕的左下同坐标区域,大小不变,
现在我们改变映射关系,将此逻辑区域映射到全屏,则用户得到
视频图像输出如右图所示。此时,rcLogic参数应传入整个4路输
出所占用区域在逻辑屏幕中的矩形坐标,而RcUser参数则可传入NULL值,
对于pCardPos参数,由于此时重新映射后的用户屏幕区域包含4路输出,
此时DwCardCount参数应为4,再将其卡号和他们在用户屏幕区域对应的
新矩形坐标传入即可。

现在最主要的是第三个及第四个参数压入时有问题,现附上VC的相关代码
void CSdk2500Dlg::SetScreenThirdToOne(RECT rc)
{
RECT m_rc[6];
int iCards = 4;

MapLogicScreenToUserScreen(NULL,NULL,NULL,0);

ZeroMemory(m_rc,sizeof(RECT) * 6);

//make the x,y
int i,l1,l2,xb,yb,xs,ys,xStart,yStart,xLen,yLen;
double bix,biy;

bix = 0.75;
biy = 0.6;

xLen = (int)((rc.right - rc.left) * bix) ;
yLen = (int)((rc.bottom - rc.top) * biy) ;

l1 = 2;//xLen * 0.01;
l2 = 2;//yLen * 0.01;

xb = int(xLen * 0.7);
yb = yLen - (2 * l2);
xs = xLen - xb - l1;
ys = (yLen - (4 * l2))/3;

xStart = rc.left ;
yStart = rc.top;
//so we have the x,y
m_rc[0].left = xStart;
m_rc[0].top = yStart + l2;
m_rc[0].right =xStart + xb;
m_rc[0].bottom=yStart + yLen - l2;

m_rc[1].left = xStart + xb + l1;
m_rc[1].top = yStart + l2;
m_rc[1].right = xStart + xLen;
m_rc[1].bottom= yStart + ys + l2;

m_rc[2].left = xStart + xb + l1;
m_rc[2].top = yStart + ys + (2*l2);
m_rc[2].right = xStart + xLen;
m_rc[2].bottom= yStart + ((2 * ys) + (2 * l2));

m_rc[3].left = xStart + xb + l1;
m_rc[3].top = yStart + (2 * ys) + (3 * l2);
m_rc[3].right = xStart + xLen;
m_rc[3].bottom= yStart + yLen - l2;

for(i=0;i<iCards;++i)
{
m_pButton.MoveWindow(&amp;m_rc,TRUE);
}

for(i=0;i<iCards;++i)
{
StartOverlay(i,m_pButton.m_hWnd,&amp;m_rc);
//新增函数,将TRUE该为FALSE即可屏蔽用户双击
EnableRespondDbClk(i,FALSE);
}

//Map to all the video screen
RECT rcLogic,rcDest;

rcLogic.left = m_rc[0].left;
rcLogic.top = m_rc[0].top;
rcLogic.right = m_rc[3].right;
rcLogic.bottom = m_rc[3].bottom;

rcDest.left = rc.left ;
rcDest.top = rc.top ;
rcDest.right = rc.right ;
rcDest.bottom = rc.bottom ;

CAP_WND_POS *CardPos = new CAP_WND_POS[4];

//下面的计算稍繁,暂时没有其他更好的办法
CardPos[0].dwCard = 0;
CardPos[0].rcUser.left = rc.left;
CardPos[0].rcUser.top = rc.top;
CardPos[0].rcUser.right = rc.left + 410;
CardPos[0].rcUser.bottom = rc.bottom;

CardPos[1].dwCard = 1;
CardPos[1].rcUser.left = rc.left + 412;
CardPos[1].rcUser.top = rc.top;
CardPos[1].rcUser.right = rc.right;
CardPos[1].rcUser.bottom = rc.top + 128;

CardPos[2].dwCard = 2;
CardPos[2].rcUser.left = rc.left + 412;
CardPos[2].rcUser.top = rc.top + 130;
CardPos[2].rcUser.right = rc.right;
CardPos[2].rcUser.bottom = rc.top + 256;

CardPos[3].dwCard = 3;
CardPos[3].rcUser.left = rc.left + 412;
CardPos[3].rcUser.top = rc.top + 260;
CardPos[3].rcUser.right = rc.right;
CardPos[3].rcUser.bottom = rc.bottom;

BOOL ret = MapLogicScreenToUserScreen(&amp;rcLogic,&amp;rcDest,CardPos,4);

delete CardPos;
}
 
BOOL WINAPI MapLogicScreenToUserScreen(RECT *rcLogic,
RECT *rcUser,
CAP_WND_POS *pCardPos,
DWORD dwCardCount);
function MapLogicScreenToUserScreen(var rcLogic,rcUser:TRect;
pCardPos:pCAP_WND_POS; //可能类型是PPoint=^TPoint;
dwCardCount:DWORD):BOOL;stdcall;
 
刚才不好意思,没看清楚,哪个结构应该如下:
typedef struct tagCardRect
{
DWORD dwCard; //卡号
RECT rcUser; //新的用户屏幕区域位置
}CAP_WND_POS;
tagCardRect=record
dwCard:DWORD;
rcUser:TRECT;
end;
CAP_WND_POS=tagCardRect;
PCAP_WND_P0S=^CAP_WND_POS;
 
如何使用,你直接调用就可以,填充几个结构而已,和DELPHI的差不多
 
你是哪里有问题,是SetScreenThirdToOne函数译成Delphi代码以后不对还是MapLogicScreenToUserScreen
函数译成Delphi代码以后不对?要帮你译哪一个?
 
var
ret:BOOL;
rcLogic,rcDest:TRect;
CardPos:pCAP_WND_P0S;
这样调用
ret = MapLogicScreenToUserScreen(rcLogic,rcDest,CardPos,4);
 
MapLogicScreenToUserScreen这个函数不对只需要这个函数就行了。
其它的函数暂不需要。
这个函数总是译不对。
我的译法如下:
TtagCardRect=record
dwCard:longWord; //卡号
rcUser:Trect; //新的用户屏幕区域位置
end;
PTRect=^TRect;
PTagCardRect=^TtagCardRect;
PArrTagCardRect=array of PTagCardRect;


TCallMapLogicScreenToUserScreen=function(
LogicRect:pTRect;
rcUser:pTRect;
var pCardPos:array of TTagCardRect
//pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean;
最主要是第三个参数怎么样才能正确的压入的问题。上面的VC程序给出了调用函数的
原型第三个参数据在DELHP中需要怎么样定义才能正确的压入。
请写出整个调用函数的代码I
 
var
ret:BOOL;
rcLogic,rcDest:TRect;
PHeader,CardPos:pCAP_WND_P0S;
这样调用
CardPos:=AllocMem(SizeOf(CAP_WND_POS)*3);
PHeader:=CardPos;
try
for i:=1 to 3 do
begin
CardPos^.// 设置他的值
Inc(CardPos,SizeOf(CAP_WND_POS));
end;
ret = MapLogicScreenToUserScreen(rcLogic,rcDest,PHeader,4);
finally
freemem(CardPos);
end;
//这样绝对没有问题
 
定义
TtagCardRect=record
dwCard:longWord; //卡号
rcUser:Trect; //新的用户屏幕区域位置
end;
PTRect=^TRect;
PTagCardRect=^TtagCardRect;
PArrTagCardRect=array of PTagCardRect;

CAP_WND_POS=TtagCardRect;
PCAP_WND_P0S=^CAP_WND_POS;

声明函数类
TCallMapLogicScreenToUserScreen=function(
LogicRect:pTRect;
rcUser:pTRect;
pCardPos:pCAP_WND_P0S
//pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean;

声明函数
function CallMapLogicScreenToUserScreen(
{Var LogicRect:TRect;
var rcUser:Trect;
pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean; }

LogicRect:pTRect;
rcUser:pTRect;
pCardPos:pCAP_WND_P0S
;dwCardNum:LongWord
):Boolean;
函数实现
function CallMapLogicScreenToUserScreen(
{ Var LogicRect:TRect;
var rcUser:Trect;
pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean; }
LogicRect:pTRect;
rcUser:pTRect;
pCardPos:pCAP_WND_P0S
;dwCardNum:LongWord
):Boolean;
var
ProcAddress:pointer;
LoadFunType:TCallMapLogicScreenToUserScreen;
begin
ProcAddress:=GetProcAddress(DllHandle,Pchar('MapLogicScreenToUserScreen'));
if ProcAddress<>nil then begin
LoadFunType:=TCallMapLogicScreenToUserScreen(ProcAddress);
Result:=LoadFunType(LogicRect,rcUser,pCardPos
,dwCardNum
);
end;
end;
函数据调用

function ChangeVCVideo(dwCard:LongWord;HlComponent:Thandle;
ALeft,ATop,ARigth,Bottom:integer;
AShowText:Array of char):Boolean;
var
myDWDATETIME:TDWDATETIME;
CardIndex:Byte;
BlnSucced:Boolean;
NewVideo:TRect;
NewCardRect:pCAP_WND_P0S;
begin
for CardIndex:=0 to 3 do
CallViUnLoad(CardIndex);
//for CardIndex:=0 to 3 do
// CallEnableRespondDbClk(CardIndex,False);
BlnSucced:=CallOpenDev(dwCard);
//for CardIndex:=0 to 3 do
// if CardIndex<>dwCard then
// CallEnableScreenOut(CardIndex,False);
//for CardIndex:=0 to 99 do
// my[CardIndex]:=' ';

CallSetVideoProValue(dwCard,VideoProperty_Brightness,90);
CallSetVideoProValue(dwCard,VideoProperty_Contrast,$F4);
CallSetVideoProValue(dwCard,VideoProperty_Hue,$FE);
CallSetVideoProValue(dwCard,VideoProperty_Saturation,$80);
myVideo:=rect(ALeft,ATop,ARigth,Bottom);

CallSetVformat(dwCard,VIDEOFORMATPAL);
CallSetCformat(dwCard,YUY2);
myDWDATETIME.dwYear:=strtoint('$'+inttostr(YearOf(Date))); //需要转化为十六进
myDWDATETIME.dwMonth:=monthof(Date);
myDWDATETIME.dwDay:=dayof(Date);
myDWDATETIME.dwHour:=Hourof(Time);
myDWDATETIME.dwMinute:=MinuteOf(Time);
myDWDATETIME.dwSecond:=SecondOf(Time);
CallSetContrInfo(dwCard,DATE_SHADOW+VIEW_LOG);
CallSetTimeView(dwCard,myDWDATETIME);
//CallSetContrInfo(dwCard,VIEW_LOG);
CallSetTextVeiw(dwCard,@AShowText);

CallStartOverlay(dwCard,HlComponent,myVideo);
myVideo:=Rect(0,20,400,350);

new(NewCardRect);
//setlength(NewCardRect,4);
//setlength(NewCardRect,1);
NewCardRect.dwCard:=0;
NewCardRect.rcUser.top:=1;
NewCardRect.rcUser.left:=0;
NewCardRect.rcUser.Right:=600;
NewCardRect.rcUser.Bottom:=500;
{NewCardRect[1].dwCard:=1;
NewCardRect[1].rcUser.top:=1;
NewCardRect[1].rcUser.left:=0;
NewCardRect[1].rcUser.Right:=600;
NewCardRect[1].rcUser.Bottom:=500;
NewCardRect[2].dwCard:=2;
NewCardRect[2].rcUser.top:=1;
NewCardRect[2].rcUser.left:=0;
NewCardRect[2].rcUser.Right:=600;
NewCardRect[2].rcUser.Bottom:=500;
NewCardRect[3].dwCard:=3;
NewCardRect[3].rcUser.top:=1;
NewCardRect[3].rcUser.left:=0;
NewCardRect[3].rcUser.Right:=600;
NewCardRect[3].rcUser.Bottom:=500;}
CallMapLogicScreenToUserScreen(@myVideo,@myVideo,NewCardRect,4);
Dispose(NewCardRect);
end;
上面已列出了我所做的尝试,
问题在于,我无法压入正确的参数,特别是参数NewCardRect在压入前怎么定义及
怎么样给其附值,这样还是不行。/帮我多看看。
 
看错了,不过这样应该没有什么问题了
 
你忘了在函数后面加上[red]stdcall[/red]!!!!!!
看我翻译的,以后看帖子要注意,仔细点...
 
参照下面改一下你的程序

函数声明:
function MapLogicScreenToUserScreen(rcLogic, rcUser: PRect;
pCardPos: PCAP_WND_POS, dwCardCount: DWORD);Boolean;stdcall;

调用:
type
tagCardRect = record
dwCard:DWORD;
rcUser:TRECT;
end;
CAP_WND_POS = tagCardRect;
PCAP_WND_P0S = ^CAP_WND_POS;

TMapScreen = function MapLogicScreenToUserScreen(rcLogic, rcUser: PRect;
pCardPos: PCAP_WND_POS, dwCardCount: DWORD);Boolean;stdcall;

var
LoadFunType: TMapScreen;
ARect, BRect: TRect;
ACardPos: CAP_WND_POS;
dwCardNum: DWORD;
begin
LoadFunType := TMapScreen(GetProcAddress(DllHandle, 'MapLogicScreenToUserScreen'));
if @LoadFunType<>nil then
begin
//ARect := ...
//ACardPos := ...
Result := LoadFunType(@ARect, @BRect, @ACardPos, dwCardNum);
end;
end;

你看看,如果还不行的话把你认为可以发给我的代码发过来(只要关键部分,不要业务逻辑),
我帮你改。(我的E-Mail在我的个人资料上有)
 
TMapScreen = function MapLogicScreenToUserScreen(rcLogic, rcUser: PRect;
pCardPos: PCAP_WND_POS, dwCardCount: DWORD);Boolean;stdcall;//返回值错了,
应该是BOOL,BOOL<!=boolean
 
我写的代码:
unit PasVC404SDK;

interface
uses
windows,Types,Dateutils,SysUtils;
Const
SDKDLL = 'sdk4878.dll';
VIDEOFORMATNTSC = $1;
VIDEOFORMATPAL = $3;
VIDEOFORMATSECAM = $6;

RGB32 = $0;
RGB24 = $1;
RGB16 = $2;
RGB15 = $3;
YUY2 = $4;
BTYUV = $5;
Y8 = $6;
RGB8 = $7;
PL422 = $8;
PL411 = $9;
YUV12 = $A;
YUV9 = $B;
RAW = $E;
DATE_SHADOW = 0;
DATE_NOSHADOW = 1;
IS_PAL = 2;
IS_NTSC = 3;
VIEW_DATE = 4;
NOVIEW_DATE = 5;
VIEW_LOG = 6;
NOVIEW_LOG = 7;
RESET_IC = 8;

var
DllHandle:THandle;
HlComponent:Thandle;
IsInitVideo:Boolean=False;
myVideo:TRect;

type
TVideoProperty = (
VideoProperty_Brightness,
VideoProperty_Contrast,
VideoProperty_Hue,
VideoProperty_Saturation
);

TtagCardRect=record
dwCard:longWord; //卡号
rcUser:Trect; //新的用户屏幕区域位置
end;
PTRect=^TRect;
PTagCardRect=^TtagCardRect;
PArrTagCardRect=array of PTagCardRect;

CAP_WND_POS=TtagCardRect;
PCAP_WND_P0S=^CAP_WND_POS;

TDWDATETIME = Record
dwYear :word; // /*年*/
dwMonth :word; // /*月*/
dwDay :word; // /*日*/
dwHour :word; // /*时*/
dwMinute :word; ///*分*/
dwSecond :word; // /*秒*/
end;
{TCallMapLogicScreenToUserScreen=function(
Var LogicRect:TRect;
var rcUser:Trect;
pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean; }
TCallMapLogicScreenToUserScreen=function(
LogicRect:pTRect;
rcUser:pTRect;
pCardPos:pCAP_WND_P0S
//pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean;
function CallMapLogicScreenToUserScreen(
{Var LogicRect:TRect;
var rcUser:Trect;
pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean; }

LogicRect:pTRect;
rcUser:pTRect;
pCardPos:pCAP_WND_P0S
;dwCardNum:LongWord
):Boolean;


procedure ChangeVideoProperty(ACurVideoSource:longword;ABright,AContrast:integer);
implementation

function CallMapLogicScreenToUserScreen(
{ Var LogicRect:TRect;
var rcUser:Trect;
pCardPos:pTagCardRect
;dwCardNum:LongWord
):Boolean; }
LogicRect:pTRect;
rcUser:pTRect;
pCardPos:pCAP_WND_P0S
;dwCardNum:LongWord
):Boolean;
var
ProcAddress:pointer;
LoadFunType:TCallMapLogicScreenToUserScreen;
begin
ProcAddress:=GetProcAddress(DllHandle,Pchar('MapLogicScreenToUserScreen'));
if ProcAddress<>nil then begin
LoadFunType:=TCallMapLogicScreenToUserScreen(ProcAddress);
Result:=LoadFunType(@LogicRect,@rcUser,@pCardPos
,dwCardNum
);
end;
end;

function ChangeVCVideo(dwCard:LongWord;HlComponent:Thandle;
ALeft,ATop,ARigth,Bottom:integer;
AShowText:Array of char):Boolean;
var
myDWDATETIME:TDWDATETIME;
CardIndex:Byte;
BlnSucced:Boolean;
NewVideo:TRect;
NewCardRect:pCAP_WND_P0S;
PHeader,CardPos:pCAP_WND_P0S;
i:integer;
ret:boolean;
begin
for CardIndex:=0 to 3 do
CallViUnLoad(CardIndex);
//for CardIndex:=0 to 3 do
// CallEnableRespondDbClk(CardIndex,False);
BlnSucced:=CallOpenDev(dwCard);
//for CardIndex:=0 to 3 do
// if CardIndex<>dwCard then
// CallEnableScreenOut(CardIndex,False);
//for CardIndex:=0 to 99 do
// my[CardIndex]:=' ';

CallSetVideoProValue(dwCard,VideoProperty_Brightness,90);
CallSetVideoProValue(dwCard,VideoProperty_Contrast,$F4);
CallSetVideoProValue(dwCard,VideoProperty_Hue,$FE);
CallSetVideoProValue(dwCard,VideoProperty_Saturation,$80);
myVideo:=rect(ALeft,ATop,ARigth,Bottom);

CallSetVformat(dwCard,VIDEOFORMATPAL);
CallSetCformat(dwCard,YUY2);
myDWDATETIME.dwYear:=strtoint('$'+inttostr(YearOf(Date))); //需要转化为十六进
myDWDATETIME.dwMonth:=monthof(Date);
myDWDATETIME.dwDay:=dayof(Date);
myDWDATETIME.dwHour:=Hourof(Time);
myDWDATETIME.dwMinute:=MinuteOf(Time);
myDWDATETIME.dwSecond:=SecondOf(Time);
CallSetContrInfo(dwCard,DATE_SHADOW+VIEW_LOG);
CallSetTimeView(dwCard,myDWDATETIME);
//CallSetContrInfo(dwCard,VIEW_LOG);
CallSetTextVeiw(dwCard,@AShowText);

CallStartOverlay(dwCard,HlComponent,myVideo);
NewVideo:=Rect(0,20,400,350);

//new(NewCardRect);
//setlength(NewCardRect,4);
//setlength(NewCardRect,1);
// NewCardRect.dwCard:=0;
// NewCardRect.rcUser.top:=1;
// NewCardRect.rcUser.left:=0;
// NewCardRect.rcUser.Right:=600;
// NewCardRect.rcUser.Bottom:=500;
{NewCardRect[1].dwCard:=1;
NewCardRect[1].rcUser.top:=1;
NewCardRect[1].rcUser.left:=0;
NewCardRect[1].rcUser.Right:=600;
NewCardRect[1].rcUser.Bottom:=500;
NewCardRect[2].dwCard:=2;
NewCardRect[2].rcUser.top:=1;
NewCardRect[2].rcUser.left:=0;
NewCardRect[2].rcUser.Right:=600;
NewCardRect[2].rcUser.Bottom:=500;
NewCardRect[3].dwCard:=3;
NewCardRect[3].rcUser.top:=1;
NewCardRect[3].rcUser.left:=0;
NewCardRect[3].rcUser.Right:=600;
NewCardRect[3].rcUser.Right:=500;}
CardPos:=AllocMem(SizeOf(CAP_WND_POS)*3);
PHeader:=CardPos;
try
for i:=1 to 3 do
begin
CardPos^.dwCard:=i;
CardPos^.rcUser.Left:=1;
CardPos^.rcUser.top:=1;
CardPos^.rcUser.Right:=600;
CardPos^.rcUser.Right:=600;

// 设置他的值
Inc(CardPos,SizeOf(CAP_WND_POS));
end;
ret := CallMapLogicScreenToUserScreen(@Myvideo,@NewVideo,PHeader,4);
finally
freemem(CardPos);
end;
//CallMapLogicScreenToUserScreen(@myVideo,@myVideo,NewCardRect,4);
//Dispose(NewCardRect);
end;
VC的头文件
#ifndef ___SDK4878H__
#define ___SDK4878H__

typedef enum
{
RGB32 = 0x0,
RGB24 = 0x1,
RGB16 = 0x2,
RGB15 = 0x3,
YUY2 = 0x4,
BTYUV = 0x5,
Y8 = 0x6,
RGB8 = 0x7,
PL422 = 0x8,
PL411 = 0x9,
YUV12 = 0xA,
YUV9 = 0xB,
RAW = 0xE
}COLORFORMAT;


typedef enum
{
VIDEOFORMATNTSC = 0x1,
VIDEOFORMATPAL = 0x3,
VIDEOFORMATSECAM = 0x6
}VIDEOFORMAT;


typedef enum
{
VideoProperty_Brightness=0,
VideoProperty_Contrast,
VideoProperty_Hue,
VideoProperty_Saturation,
} VideoProperty;


typedef enum
{
OFF=0,
ON
}VIEW_STATUS;

typedef struct DWDATETIME
{
WORD dwYear;
WORD dwMonth;
WORD dwDay;
WORD dwHour;
WORD dwMinute;
WORD dwSecond;
}DATETIME;

typedef enum
{
DATE_SHADOW = 0,
DATE_NOSHADOW = 1,
IS_PAL = 2,
IS_NTSC = 3,
VIEW_DATE = 4,
NOVIEW_DATE = 5,
VIEW_LOG = 6,
NOVIEW_LOG = 7,
RESET_IC = 8
}PRECONTROLINFO;

typedef struct tagCardRect
{
RECT rcUser; //窗口位置
DWORD dwCard; //卡号
DWORD reserve; //保留,8字节边界对齐
}CAP_WND_POS;

typedef struct tagProperty
{
DWORD VFormat;
DWORD BitRate;
DWORD KeyFrmInterval;
DWORD FrmRate;
}MPEGPro;

//CUSTOM MESSAGE
#define WM_CUSTOM_DBCLK WM_USER+0x300
#define WM_CUSTOM_ERROR WM_USER+0x301

#define CTLD_FULLSCREEN 1 /*窗口点击放大*/
#define CTLD_NORMALSHOW 2 /*窗口电击缩小*/

//VIDEO CONTROL FUNCTION PART
DWORD WINAPI ViInit(HWND hWnd);
DWORD WINAPI GetDevNum(void);
void WINAPI ViUnInit(void);
void WINAPI ViUnLoad(DWORD dwCard);

BOOL WINAPI OpenDev(DWORD dwCard);
BOOL WINAPI StartOverlay(DWORD dwCard,HWND hWnd,RECT *rc);
BOOL WINAPI ReSetOverlay(DWORD dwCard);
DWORD WINAPI ViGetData(DWORD dwCard);
BOOL WINAPI PrepareVideoCapture(DWORD dwCard,char *filename,DWORD dwMode);
BOOL WINAPI StartVideoCapture(DWORD dwCard);
void WINAPI StopVideoCapture(DWORD dwCard);

void WINAPI EnableRespondDbClk(DWORD dwCard,BOOL bEnable);
BOOL WINAPI EnableScreenOut(DWORD dwCard,BOOL bEnable);
BOOL WINAPI MapLogicScreenToUserScreen(RECT *rcLogic,
RECT *rcUser,
CAP_WND_POS *pCardPos,
DWORD dwCardCount);

BOOL WINAPI SetCformat(DWORD dwCard, COLORFORMAT cformat);
BOOL WINAPI SetVformat(DWORD dwCard, VIDEOFORMAT vformat);
BOOL WINAPI SetVideoProValue(DWORD dwCard, VideoProperty pro, DWORD dwValue);

//log setting item
BOOL WINAPI SetTimeView(DWORD dwCard, DATETIME *dwDate);
BOOL WINAPI SetTextVeiw(DWORD dwCard, char *logtext);
BOOL WINAPI SetContrInfo(DWORD dwCard, PRECONTROLINFO vstatus);

//video stream output
typedef void (CALLBACK *PrcCallBack)(DWORD dwCard, BYTE *pbuff,DWORD dwSize);
void WINAPI OutBuff(DWORD dwCard, PrcCallBack ppCall);
//MEPG stream output
void WINAPI SetStreamPro(DWORD dwCard, MPEGPro *pro, DWORD dwMode);
typedef void (CALLBACK *PrcMpegCallBack)(DWORD dwCard, BYTE *pbuff,DWORD dwSize,BOOL isKeyFrm);
void WINAPI OutMpegBuff(DWORD dwCard, PrcMpegCallBack ppCall);
//SAVE ERROR CALLBACK

typedef void (CALLBACK *ViSaveErrCallBack)(DWORD dwCard);

typedef void (CALLBACK *AuSaveErrCallBack)(DWORD dwCard);

void WINAPI RegisterViSaveExceptionProc(DWORD dwCard,ViSaveErrCallBack pViErrProc);
void WINAPI RegisterAuSaveExceptionProc(DWORD dwCard,AuSaveErrCallBack pAuErrProc);

//IO ALERT
typedef void (CALLBACK *IoCallBack)(DWORD dwCard);

DWORD WINAPI IORegAlert(DWORD dwCard);
BOOL WINAPI IOAlertOut(DWORD dwCard);
BOOL WINAPI IOAlertLevelOut(DWORD dwCard,BOOL bHighLevel);
void WINAPI IOAlertPrc(DWORD dwCard, IoCallBack IoCall);
void WINAPI IOQuit(DWORD dwCard);

//save picture file function
//save picture function
BOOL WINAPI SaveBmpFile(DWORD dwCard,char *filename, RECT * prc);
BOOL WINAPI SaveJpegFile(DWORD dwCard,char *filename, RECT * prc, DWORD dwQuality);
BOOL WINAPI SaveBitsToBuf(DWORD dwCard, PVOID pDestBuf, RECT * prc);

//Audio function part
DWORD WINAPI GetAuNum(void);

void WINAPI OpenAuDev(DWORD dwCard);
void WINAPI PrepareAudioCapture(DWORD dwCard, char *filename,DWORD dwMode);
BOOL WINAPI StartAudioCapture(DWORD dwCard);
void WINAPI StopAudioCapture(DWORD dwCard);
void WINAPI AuUnLoad(DWORD dwCard);

//audio stream output
typedef void (CALLBACK *AuPrcCallBack)(DWORD dwCard, BYTE*pbuf, DWORD siz);
void WINAPI OutAuBuff(DWORD dwCard, AuPrcCallBack pAuCall);

//Get-Set video Capture size
void WINAPI GetVidCapSize(DWORD dwCard,DWORD &amp;dwCapWidth,DWORD &amp;dwCapHeight);
BOOL WINAPI SetVidCapSize(DWORD dwCard,DWORD dwCapWidth,DWORD dwCapHeight);

BOOL WINAPI CreateAudioAviFile(DWORD dwCard);

#endif
 
To 张无忌:在Delphi中BOOL和Boolean的确不完全一样,但不表示不可以这样用,按照我的
定义,像下面这样用是没有问题的(由于用惯了C++,我总会不由自主地按照C/C++的思路写
程序):
if LoadFunType(@ARect, @BRect, @ACardPos, dwCardNum) then
ShowMessage('调用成功!')
else
ShowMessage('调用失败!');

而如果像这样用的话,就得不到希望的结果了:
if LoadFunType(@ARect, @BRect, @ACardPos, dwCardNum) = True then
ShowMessage('调用成功!')
else
ShowMessage('调用失败!');

以上仅是对技术的探讨,我完全赞同将返回值封装为BOOL。

To fartripLiao:你发给我的那个.pas文件不包含任何对MapLogicScreenToUserScreen的封
装和调用,我怎么知道你错在哪里呀?
 
to fartripLiao:
你的函数声明后面都没有加stdcall!!!真是晕,我告诉你了,你为什么不修改了???
加上应该是没问题!
 
to Sachow:
其实你上面的两种写法都可以运行,结果是一样的。。。
DELPHI在后台自动转换了。。。但是对于纯用API写的程序
还是严格一些好,否则很有可能出莫名其妙的问题,我以前
就碰到过这样的问题,找了好久才找到答案。。。
 
to 张无忌
其实我定义了其它许多的函数, 这个是后来加上去的真的忘了加其它的都有,
真糊涂我现在试试行了的都加分,
若真的这样其实我自己就可以搞定的。
 
顶部