求大虾求命 调用DLL时 Invalid point operation 200分全送 ( 积分: 200 )

  • 主题发起人 主题发起人 jxdxlzx
  • 开始时间 开始时间
J

jxdxlzx

Unregistered / Unconfirmed
GUEST, unregistred user!
这段代码我在窗体中运行正常,可转换成DLL后,程序调用报Invalid pointer operation我实在是找不到原因,请各位大虾指点迷津!!

unit Unit1;//DLL的代码

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
ip=^integer;

///////////////调用外部IC卡读卡器的DLL函数
function OpenPort(PortName:string;PortHandle:ip):integer;stdcall;external 'mi00.dll';
function ClosePort():integer;stdcall;external 'mi00.dll';
function SelectPort(PortHandle:integer):integer;stdcall;external 'mi00.dll';
function PowerOn():integer;stdcall;external 'mi00.dll';
function PowerOff():integer;stdcall;external 'mi00.dll';
function CardPresent():integer;stdcall;external 'mi00.dll';
function CardChanged():integer;stdcall;external 'mi00.dll';
function GetCardType(ATRBuffer:string):integer;stdcall;external 'mi00.dll';
function GetCardName(CardType:integer):pchar;stdcall;external 'mi00.dll';
function Read_4428_With_PB(StrartPos:integer;NOB:integer;Bfr:Pchar;PB_Bfr:Pchar):Integer;stdcall;external 'mi00.dll';
function Read_4442_With_PB(StrartPos:integer;NOB:integer;Bfr:Pchar;PB_Bfr:Pchar):Integer;stdcall;external 'mi00.dll';


///////////////输出函数
function Ric():string;export; //读IC卡30-37内容


////////////////////////
implementation

function Ric():string;
var
re,aa:integer;
porth:ip;
ATR:array[0..3] of char;
StrartPos:integer;
NOB:integer;
Bfr:array[0..256] of char;
PB_Bfr:array[0..256] of char;
i:integer;
str,str1:string;
begin
re:=OpenPort('COM1',Porth);//打开端口
if re=0 then //安装读卡器检测
begin
str1:='';
re:=PowerOn();
re:=CardPresent();
if re<>1 then
showmessage('没有插入IC卡')
else
begin
re:=GetCardType(ATR);
if re>0 then
begin
if re=2 then
begin
StrartPos:=0;
NOB:=256;
re:=Read_4442_With_PB(StrartPos,NOB,Bfr,PB_Bfr);
str1:='';
for i:=30 to 37 do
begin
str:=bfr;
str1:=str1+str;
end;
end
else //判断4442卡
showmessage('对不起卡型不对,请检查IC卡');
end
else
showmessage('对不起未知IC卡,请检查IC卡');
end;
re:=PowerOff();
re:=ClosePort();
end
else
showmessage('没有检测到读卡器,请检查读卡器连线是否正常!'); //读卡器检测

Result:=str1;

end;


end.
 
这段代码我在窗体中运行正常,可转换成DLL后,程序调用报Invalid pointer operation我实在是找不到原因,请各位大虾指点迷津!!

unit Unit1;//DLL的代码

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
ip=^integer;

///////////////调用外部IC卡读卡器的DLL函数
function OpenPort(PortName:string;PortHandle:ip):integer;stdcall;external 'mi00.dll';
function ClosePort():integer;stdcall;external 'mi00.dll';
function SelectPort(PortHandle:integer):integer;stdcall;external 'mi00.dll';
function PowerOn():integer;stdcall;external 'mi00.dll';
function PowerOff():integer;stdcall;external 'mi00.dll';
function CardPresent():integer;stdcall;external 'mi00.dll';
function CardChanged():integer;stdcall;external 'mi00.dll';
function GetCardType(ATRBuffer:string):integer;stdcall;external 'mi00.dll';
function GetCardName(CardType:integer):pchar;stdcall;external 'mi00.dll';
function Read_4428_With_PB(StrartPos:integer;NOB:integer;Bfr:Pchar;PB_Bfr:Pchar):Integer;stdcall;external 'mi00.dll';
function Read_4442_With_PB(StrartPos:integer;NOB:integer;Bfr:Pchar;PB_Bfr:Pchar):Integer;stdcall;external 'mi00.dll';


///////////////输出函数
function Ric():string;export; //读IC卡30-37内容


////////////////////////
implementation

function Ric():string;
var
re,aa:integer;
porth:ip;
ATR:array[0..3] of char;
StrartPos:integer;
NOB:integer;
Bfr:array[0..256] of char;
PB_Bfr:array[0..256] of char;
i:integer;
str,str1:string;
begin
re:=OpenPort('COM1',Porth);//打开端口
if re=0 then //安装读卡器检测
begin
str1:='';
re:=PowerOn();
re:=CardPresent();
if re<>1 then
showmessage('没有插入IC卡')
else
begin
re:=GetCardType(ATR);
if re>0 then
begin
if re=2 then
begin
StrartPos:=0;
NOB:=256;
re:=Read_4442_With_PB(StrartPos,NOB,Bfr,PB_Bfr);
str1:='';
for i:=30 to 37 do
begin
str:=bfr;
str1:=str1+str;
end;
end
else //判断4442卡
showmessage('对不起卡型不对,请检查IC卡');
end
else
showmessage('对不起未知IC卡,请检查IC卡');
end;
re:=PowerOff();
re:=ClosePort();
end
else
showmessage('没有检测到读卡器,请检查读卡器连线是否正常!'); //读卡器检测

Result:=str1;

end;


end.
 
高手快来,救求我啊!!!
给个提示也可以啊!!
 
自已顶一下,希望高手来看一下.
 
function Ric():string;export; //读IC卡30-37内容
你不能输出String类型的。你看看Dll前面的那段注释。

exports
Ric;
 
//读IC卡30-37内容
30-37一般是十六进制的,也就是要读十进制48-55的内容;

StrartPos可以直接从48读起;
 
exports
Ric;
没错,注册那里是这样的,可我该怎样改变一下呢?
不好意思再请提示一下[?]
我也写了其它的DLL也是这样输出String类型的,也可以啊,可这里为什么就不行呢?
 
呵呵。。上次和楼上两位学了点东西,这回也用一下。
如果返回STRING类型的,是不是得加上sharemem单元啊?
或者把string 改成pchar吧。
 
呵呵,楼上的就让楼主看你的3042201帖子好了,大富翁后继有人啊[:D]
 
你如果用DELPHI程序调用是没问题,但如果用其它的比如说常用到的VB或是VC程序来调用的话,string是不兼容的数据类型。
 
谢谢各位大哥,我去试一下.等下再给分.
 
不如用pchar吧
兼容性好
 
问题解决了,谢谢delphibbs_Lee的指点,谢谢各位大虾。
只是还有一个很菜的问题,请各位大哥好人做到底!
我在函数申明改成如下:
///DLL中
function Ric(Icno:pchar):Pchar;
begin
...
...
...
str:=........
Icno:=strpas(str);//测试一下这样是否能返回正确数据
Ric:=Icno;
end;
////调用程序
procedure TForm1.Button2Click(Sender: TObject);
var
icno,kk:Pchar;
stricno,bb:string;
begin

kk:=Ric(Icno);
stricno:=Icno;
bb:=kk;

edit1.Text:=bb;
END;
/////
bb是正确的stricno不正确,可是为何这个Icno不能传回正确的数据?
是调用处出了问题,还是DLL中出了问题?
 
我自已再顶一下,在线等.
 
function Ric(Icno:pchar):Pchar;
begin
...
...
...
str:=........
//Icno:=strpas(str);//测试一下这样是否能返回正确数据
StrPCopy(Icno, str);
Ric:=Icno;
end;

////调用程序
procedure TForm1.Button2Click(Sender: TObject);
var
icno,kk:Pchar;
stricno,bb:string;
begin
Icno := strAlloc(128); //对于传出型的字符参数,必须预先分配内存
kk:=Ric(Icno);
stricno:=Icno;
bb:=kk;
strDispose(Icno); //释放
edit1.Text:=bb;
END;
 
终于对了,谢谢Xianguo 大哥,谢谢大家!!!!!大富翁真是个好地方!!!!!!!!!!!
 
后退
顶部