在函数中调用dll提供的外部函数,并且调用成功,但该函数返回时发生地址访问。
该dll使用c编写,所以调用方式在stdcall不行后,改为cdel,但还是存在问题。希望高手给点建议。
该dll使用c编写,所以调用方式在stdcall不行后,改为cdel,但还是存在问题。希望高手给点建议。
解决方案 »
- 无句柄窗体如何创建???
- 请问如何用WriteFile()将Byte型数据写到串口
- (1)散分 规则:从一楼到 倒数第2楼每人一分 最后一人=剩余分
- DbGrid中隔行显示问题,急!
- 菜鸟问题,那位大虾帮帮我!!!!!(在线等待)
- 继续散分!α
- sqlserver存储过程能不能返回单个值,而不是一个数据集?可以的话,怎么做
- 有没有cardinaltostr这类的函数?
- 如何保存网页中所有的图片
- 请教关于F1book控件方面的问题
- Property FilerFields :String read FFilterFields write FFilterFields;的问题?
- 关于文件操作的一个问题
封装函数是一个类方法,该类在创建时,从dll中装载函数。
你先把dll注册到系统中regsvr32 **.dll
然后从delphi里面projct-->Import type library-->Install
就会在delphi的imports目录下面产生你的dll对应的pas文件.在你的delphi程序里如果要用这个dll,就在interface 的uses子句
里面use一下,然后就可以直接用了,相当于用一个delphi的控件.不知道对你有没有用.
1。函数指针的声明:
fUSB_StartUp: function ( USBNumber,
MachNumber,
SerialMode,
Status:byte ):integer;cdecl;
//stdcall ; external 'host.dll';2。动态装载:
@fUsb_StartUp := GetProcAddress(fLibHandle, 'USB_StartUp');
...
3。在类方法中的使用:
function TWinComDevice.StartOneComCard(Cardid: byte): integer;
var
MaxMachineNum:integer;
iCardId : byte;
begin
iCardId := Cardid;
MaxMachineNum := fDeviceInfoList[CardId].MaxMachineNum ;
case self.fDeviceType of
ctUsbCard :
begin
//启动Usb通讯卡
result := fUsb_StartUp(iCardid,MaxMachineNum,0,1);
end ;
ctISACard :
begin
//启动Idt通讯卡
//result :=IDT_Startup (bCardNo);
raise Exception.Create('当前版本组件尚不支持ISA通讯卡');
end;
end;
if result <> 0 then
raise Exception.CreateFmt('%d 号通讯卡启动失败。',[CardId]);
end;
在使用时,调用可以成功,且有正确返回值,但在函数返回时地址访问异常。
不过这贴的代码和那贴的代码不一样呀,呵呵,不知哪贴新