DLInitial 是DLCWB的一个函数,DLL文件是别人用VC编好了的 函数: DLCWB_API int DL_Initial( OUT HANDLE *hDevice, HWND hWnd, int nCom = 1 ); 功能: 初始化设备,返回设备句柄 参数: hDevice 函数调用成功则返回设备句柄,用于调用其他 API 函数 hWnd 主窗口的句柄,用来接收 WM_CAPTURE,WM_EXITBTNDOWN 消息 nCom 使用的 COM 端口号,默认为 COM1。该 COM 口用于连接按钮触 发设备。华旗数码技术实验室为特殊用户提供外触发按钮。通过 该设备,用户应用程序可以接收到按钮按下的消息。 说明: 此函数要先于所有的 API 函数,并且每一次调用,都要有 DL_UnInitial 相对应。当返回 DL_SUCCESS 时表示函数调用成功,hDevice 是返回给用 户设备句柄。这个句柄将作为其它 API 函数的参数。 这是代码 implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject); type TDL_Initial=function(hDevice:Thandle):integer;stdcall;//定义函数指针,不知道这样对不对 var Handle:Thandle; DL_Initial:TDL_Initial; hDevice:integer; begin Handle:=LoadLibrary( 'DLCWB.dll '); if Handle <> 0 then begin showmessage('S1'); @DL_Initial:=GetProcAddress(Handle, 'DL_Initial'); //取址 if (@DL_Initial <> nil) then begin hDevice:=DL_Initial(Handle); // 经过测试,到这步就出现问题了,Delphi运行就出现Error //并提示Access Violation at address 10004FB2 in module 'DLCWB.dll'.Write of address 10000000 end else if @DL_Initial=nil then ShowMessage( '调用函数“GetProcAddress”时出错!'); end; FreeLibrary(Handle); end; end.如果说是函数指针定义时 参数的问题,请问怎么解决 ,我是新手,谢谢各位高手的帮忙!!
C++ DLCWB_API int DL_Initial( OUT HANDLE *hDevice, HWND hWnd, int nCom = 1 ); Delphi: TDL_Initial=function(hDevice:Thandle):integer;stdcall;一看这定义就有问题了,参数都不同. 试一下 TDL_Initial=function(var hDevice:Thandle, hWnd: HWND, nCom: Integer):integer;stdcall;
@DL_Initial:=GetProcAddress(Handle, 'DL_Initial'); //取址 if (@DL_Initial <> nil) then begin hDevice:=DL_Initial(Handle); // 经过测试,到这步就出现问题了,Delphi运行另外你这里传入的Handle也有问题,这里的Handle是指Dll的句柄, 跟你调用的参数的Handle不用,你应该定义一另外一个参数, 例如 var hDevice: THandle; iComm: Integer; begin iComm := 1; //使用的COM口 调用DL_Initial(hDevice,Self.Handle,iComm);然后在窗体TForm1里处理消息WM_CAPTURE,WM_EXITBTNDOWN
函数: DLCWB_API int DL_Initial( OUT HANDLE *hDevice, HWND hWnd, int nCom
= 1 );
功能: 初始化设备,返回设备句柄
参数: hDevice 函数调用成功则返回设备句柄,用于调用其他 API 函数
hWnd 主窗口的句柄,用来接收 WM_CAPTURE,WM_EXITBTNDOWN 消息
nCom 使用的 COM 端口号,默认为 COM1。该 COM 口用于连接按钮触
发设备。华旗数码技术实验室为特殊用户提供外触发按钮。通过
该设备,用户应用程序可以接收到按钮按下的消息。
说明: 此函数要先于所有的 API 函数,并且每一次调用,都要有 DL_UnInitial
相对应。当返回 DL_SUCCESS 时表示函数调用成功,hDevice 是返回给用
户设备句柄。这个句柄将作为其它 API 函数的参数。 这是代码
implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
type
TDL_Initial=function(hDevice:Thandle):integer;stdcall;//定义函数指针,不知道这样对不对
var
Handle:Thandle;
DL_Initial:TDL_Initial;
hDevice:integer;
begin
Handle:=LoadLibrary( 'DLCWB.dll ');
if Handle <> 0 then
begin
showmessage('S1');
@DL_Initial:=GetProcAddress(Handle, 'DL_Initial'); //取址
if (@DL_Initial <> nil) then
begin
hDevice:=DL_Initial(Handle); // 经过测试,到这步就出现问题了,Delphi运行就出现Error
//并提示Access Violation at address 10004FB2 in module 'DLCWB.dll'.Write of address 10000000
end
else if @DL_Initial=nil then ShowMessage( '调用函数“GetProcAddress”时出错!');
end;
FreeLibrary(Handle);
end;
end.如果说是函数指针定义时 参数的问题,请问怎么解决 ,我是新手,谢谢各位高手的帮忙!!
DLCWB_API int DL_Initial( OUT HANDLE *hDevice, HWND hWnd, int nCom
= 1 );
Delphi:
TDL_Initial=function(hDevice:Thandle):integer;stdcall;一看这定义就有问题了,参数都不同.
试一下
TDL_Initial=function(var hDevice:Thandle, hWnd: HWND, nCom: Integer):integer;stdcall;
if (@DL_Initial <> nil) then
begin
hDevice:=DL_Initial(Handle); // 经过测试,到这步就出现问题了,Delphi运行另外你这里传入的Handle也有问题,这里的Handle是指Dll的句柄,
跟你调用的参数的Handle不用,你应该定义一另外一个参数,
例如
var
hDevice: THandle;
iComm: Integer;
begin
iComm := 1; //使用的COM口
调用DL_Initial(hDevice,Self.Handle,iComm);然后在窗体TForm1里处理消息WM_CAPTURE,WM_EXITBTNDOWN
我想问DL_initial 函数到底返回的是什么,哪个变量可以表示,你的方法我试过,不行!!谢谢!!
问题希望各位多帮帮忙!!在这多谢了!!分不多,结帖的时候按有用的程度给分,再次多谢!!
例如
const
DL_SUCCESS = 0; //具体什么值要查看你的文档关于DL_SUCCESS的定义.var
ret: Integer;
begin
ret := DL_Initial(hDevice,Self.Handle,iComm);
if ret = DL_SUCCESS then
ShowMessage('调用成功!');
end;另外调用失败是否有其他提示?
声明的var看改成out行不行,估计应该一样
TDL_Initial=function(out hDevice:Thandle, hWnd: HWND, nCom: Integer):integer;stdcall;另外确定dll是否为stdcall的声明方式.
改成safecall或cdecl(反正试试又不会怎样)
谢谢!!那应该怎么解决self.hanle呢?