Oracle Forms 6i で使用するために、Pascal コードを PL/SQL に変換しています。以下の私のパスカルコードは完全に機能します。
program WebcamTest;
//cswi
//www.delphibasics.info
const
WM_CAP_DRIVER_CONNECT = 1034;
WM_CAP_GRAB_FRAME = 1084;
WM_CAP_SAVEDIB = 1049;
WM_CAP_DRIVER_DISCONNECT = 1035;
function SendMessageA(hWnd: Integer;
Msg: Integer;
wParam: Integer;
lParam: Integer): Integer;
stdcall;
external 'user32.dll' name 'SendMessageA';
function capGetDriverDescriptionA(DrvIndex: Cardinal;
Name: PAnsiChar;
NameLen: Integer;
Description: PAnsiChar;
DescLen: Integer) : Boolean;
stdcall;
external 'avicap32.dll' name 'capGetDriverDescriptionA';
function capCreateCaptureWindowA(lpszWindowName: PAnsiChar;
dwStyle: Integer;
x : Integer;
y : Integer;
nWidth : Integer;
nHeight : Integer;
ParentWin: Integer;
nId: Integer): Integer;
stdcall;
external 'avicap32.dll' name 'capCreateCaptureWindowA';
function IntToStr(i: Integer): String;
begin
Str(i, Result);
end;
var
WebCamId : Integer;
CaptureWindow : Integer;
x : Integer;
FileName : PAnsiChar;
begin
WebcamId := 0;
CaptureWindow := capCreateCaptureWindowA('CaptureWindow', 0, 0, 0, 0, 0, 0, 0);
if CaptureWindow <> 0 then
begin
if SendMessageA(CaptureWindow, WM_CAP_DRIVER_CONNECT, WebCamId, 0) = 1 then
begin
for x := 1 to 20 do // Take 20 photos.
begin
SendMessageA(CaptureWindow, WM_CAP_GRAB_FRAME, 0, 0);
FileName := PAnsiChar('C:\Test' + IntToStr(x) + '.bmp');
SendMessageA(CaptureWindow, WM_CAP_SAVEDIB, 0, LongInt(FileName));
end;
end;
SendMessageA(CaptureWindow, WM_CAP_DRIVER_DISCONNECT, 0, 0);
end;
end.
ora_ffi パッケージを使用して、すべての API を正常に翻訳しました。
以下の行を Pascal から PL/SQL に変換するのに問題があります (キャプチャした画像を FileName で識別される指定された場所に保存します)。
SendMessageA(CaptureWindow, WM_CAP_SAVEDIB, 0, **LongInt**(FileName));
SendMessageA 定義が必要とする FileName を PLS_INTEGER として渡す方法がわからないため (パスカルでこれを達成する方法については太字を参照)。Pascal を使用すると、FileName を LongInt にキャストできます (これは FileName へのポインターを返しますか? もしそうなら、PL/SQL でこのキャストをエミュレートしたいと思います)。
注: 問題は、PascalをPL/SQLに変換する方法に関するものです。Pascal コードは問題なく動作します。
何か案は?