delphi7环境下,动态库的静态声明与动态声明及调用问题,请大家帮忙救急!

SZSGL 2010-07-15 01:19:50
我在delphi 7 环境下,使用天敏VC4000的监控卡进行图片抓拍的应用。
动态库的名称为:Sa7134Capture.dll!
待调用的函数名为:VCAGetVidCapSize;
问题描述:
1、在delphi中采用动态声明方式:
在文件:VC4000Fun.pas中声明
type
TVCAGetVidCapSize=function (ACard: longword; var AWidth, AHeight: longword): longbool; stdcall;
var
VCAGetvidCapSize : TVCAGetvidCapSize;
在文件:main.pas中load动态库
 MVDVRHandle := LoadLibrary('Sa7134Capture.dll');
try
if MVDVRHandle <> 0 then
begin
@VCAGetvidCapSize := GetProcAddress(MVDVRHandle,'VCAGetvidCapSize');
end;
except
end;
在main.pas中调用:
procedure Tfrm_main.MyMessage(var MyMsg: TMessage);
var
nWidth : LongWord;
nHeight : LongWord;
MyVal:integer;
yuv2, rgb4: PChar;
i: longword;
pBuf : PByte;
begin
MyVal:=MyMsg.WParam;
nWidth := 0;
nHeight := 0;
VCAGetvidCapSize(MyVal,nWidth,nHeight);
yuv2 := AllocMem(nWidth * nHeight * 2 * 2);
rgb4 := AllocMem(nWidth * nHeight * 4 * 2);
pBuf := pbufSnapPic[MyVal];
for i := 0 to nHeight - 1 do
begin
Move(pBuf^, yuv2[(nHeight - i - 1) * nWidth * 2 * 2],nWidth * 2);
Move(pBuf^, yuv2[(nHeight - i - 1) * nWidth * 2 * 2 + nWidth * 2],nWidth * 2);
Inc(pBuf,nWidth * 2);
end;
if CaptureFileAsJpeg(PChar(m_ImagePath[MyVal]),yuv2,rgb4,nWidth,nHeight * 2,100) = 0 then
begin
raise Exception.Create('CaptureFileAsJpeg Error!');
end
else
TImage(FindComponent('image'+inttostr(MyVal+1))).Picture.LoadFromFile(m_ImagePath[MyVal]);
FreeMem(yuv2,nWidth * nHeight * 2 * 2);
FreeMem(rgb4,nWidth * nHeight * 4 * 2);
SnapPicture[MyVal] := false;
VCAStopVideoCapture(MyVal);
end;

在运行到:VCAGetvidCapSize(MyVal,nWidth,nHeight)时,不能取回nWidth,nHeight这两个值。

2、如果采用静态声明,如下:
function VCAGetVidCapSize(ACard: longword; var AWidth, AHeight: longword): longbool; stdcall; external 'Sa7134Capture.dll';

再调用的时候,能取回nWidth,nHeight这两个值。

为什么动态申明时,函数不能正常工作?我的申明错在哪?
...全文
187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_world888 2010-07-26
  • 打赏
  • 举报
回复
@VCAGetvidCapSize := GetProcAddress(MVDVRHandle,'VCAGetvidCapSize');改成
VCAGetvidCapSize := GetProcAddress(MVDVRHandle,'VCAGetvidCapSize');就ok了
SZSGL 2010-07-16
  • 打赏
  • 举报
回复
兄弟姐妹们,帮忙救救急啊,谢谢了!
yktd26 2010-07-16
  • 打赏
  • 举报
回复
VCAGetvidCapSize返回的啥?可能只是单纯的这个函数没有找到MyVal呢?因为没理由一个dll中的函数其他都正常这个因为调用的原因不正常啊
SZSGL 2010-07-15
  • 打赏
  • 举报
回复
郁闷了,没几个人回答我的问题吗?是太简单了,不屑回答还是嫌分不够呢!
iqyely 2010-07-15
  • 打赏
  • 举报
回复
来学习下。
SZSGL 2010-07-15
  • 打赏
  • 举报
回复
MVDVRHandle := LoadLibrary(DLL_SA7134CAPTURE);
try
if MVDVRHandle <> 0 then
begin
@VCAInitSdk := GetProcAddress(MVDVRHandle,'VCAInitSdk');
@VCAUnInitSdk := GetProcAddress(MVDVRHandle,'VCAUnInitSdk');
@VCAGetDevNum := GetProcAddress(MVDVRHandle,'VCAGetDevNum');
@VCAStopVideoPreview := GetProcAddress(MVDVRHandle,'VCAStopVideoPreview');
@VCACloseDevice := GetProcAddress(MVDVRHandle,'VCACloseDevice');
@VCAOpenDevice := GetProcAddress(MVDVRHandle,'VCAOpenDevice');
@VCASetVidFieldFrq := GetProcAddress(MVDVRHandle,'VCASetVidFieldFrq');
@VCAStartVideoPreview := GetProcAddress(MVDVRHandle,'VCAStartVideoPreview');
@VCAUpdateOverlayWnd := GetProcAddress(MVDVRHandle,'VCAUpdateOverlayWnd');
@VCAUpdateVideoPreview:= GetProcAddress(MVDVRHandle,'VCAUpdateVideoPreview');
@VCAPauseCapture := GetProcAddress(MVDVRHandle,'VCAPauseCapture');
@VCAGetvidCapSize := GetProcAddress(MVDVRHandle,'VCAGetvidCapSize');
@VCAStopVideoCapture := GetProcAddress(MVDVRHandle,'VCAStopVideoCapture');
@VCASetVidCapSize := GetProcAddress(MVDVRHandle,'VCASetVidCapSize');
@VCARegVidCapCallBack := GetProcAddress(MVDVRHandle,'VCARegVidCapCallBack');
@VCAStartVideoCapture := GetProcAddress(MVDVRHandle,'VCAStartVideoCapture');
end;
except
end;
这些函数中,唯一运行到VCAGetVidCapSize时出错
SZSGL 2010-07-15
  • 打赏
  • 举报
回复
肯定load成功了,因为同时申明的其它的函数,都能成功运行,唯一运行到那个函数时,就出错。用静态的方式能成功,但那是早期邦定的!
我的应用程序被要求只能运行一个副本,早期邦定后,再运行应用程序时就报系统错误!
dinoalex 2010-07-15
  • 打赏
  • 举报
回复
你确定已经LOAD了?

可以写个函数,参数跟VCAGetVidCapSize,函数里就是LOAD这个DLL并传参.

还有,你的except没东西,最好加上以确定LOAD了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧