您的位置:程序门 -> delphi -> windows sdk/api



dll调用问题,分配内存出错


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


dll调用问题,分配内存出错[已结贴,结贴人:xiaofeng_cxy]
发表于:2007-04-13 11:47:17 楼主
用一个dll封装了几个iphlpapi.dll的函数
然后进行调用时,会报内存readerror
但如果用exe将封装单元引入,则完全正常,有没有大牛能帮我分析一下???

dllunit

type
  parprec   =   ^tarprec;
    tarprec   =   record
        ip:   string[15];
        index:   integer;
        mac:   array[0..7]   of   byte;
    end;

function   _refresharptable:   boolean;
var
    i,   j:   integer;
    dwresult,   dwsize:   dword;
    p_arptable:   pmibipnettable;
    p_arprow:   pmibipnetrow;
    sztemp:   string;
    parp:   parprec;
begin
    sztemp   :=   ' ';
    p_arptable   :=   nil;

    for   i   :=   0   to   _arptable.count   -   1   do
        freemem(   parprec(   _arptable.objects[i]   )   );
    _arptable.clear;
    dwsize   :=   0;
    dwresult   :=   getipnettable(p_arptable,   dwsize,   false);
//     if   p_arptable   =   nil   then
    //报错的就是这行
    p_arptable   :=   allocmem(dwsize);

    try
        if   no_error   =   getipnettable(p_arptable,   dwsize,   false)   then
        begin
            for   i   :=   0   to   p_arptable.dwnumentries   -   1   do
            begin
                p_arprow   :=   allocmem(sizeof(tmibipnetrow));
                zeromemory(p_arprow,   sizeof(tmibipnetrow));
                move(p_arptable^.table[i],   p_arprow^,   sizeof(tmibipnetrow));
                parp   :=   allocmem(   sizeof(   tarprec)   );
                parp^.ip   :=   inet_ntoa(   in_addr(   p_arprow^.dwaddr   )   );
                parp^.index   :=   p_arprow^.dwindex;
                for   j   :=   0   to   5   do
                    parp^.mac[j]   :=   p_arprow^.bphysaddr[j];

                _arptable.addobject(parp^.ip,   tobject(   parp   ));
            end;
        end;
    finally
//         if   p_arptable   <>   nil   then
            freemem(p_arptable);
    end;
end;

错误信息:
access   violation   at   address   014663e2   in   module   'arpwatch.dll '   write   of   address   0147fdcc

在线等待,不胜感谢!!!
发表于:2007-04-13 11:51:411楼 得分:0
有无exports接口,有无用stdcall?
发表于:2007-04-13 11:58:112楼 得分:0
是另外一个函数调用_refresharptable,
function   aw_checkarptable(aarptable:   string):   string;   stdcall;

refresharptable为单元内函数,且也加过stdcall试过了
exports
    aw_checkarptable   index   1;
发表于:2007-04-13 12:01:273楼 得分:0
另外,在library   arpwatch中引用了fastmm4,未引用sharemem
发表于:2007-04-13 15:41:264楼 得分:100
需要引用sharemem,并且放在第一个位置
发表于:2007-04-13 16:50:595楼 得分:0
这不会是别的问题,一定是指针没有分配空间就用或者其他指针使用不当出的问题
发表于:2007-04-13 17:12:356楼 得分:0
我认为实际出错的是这行
dwresult   :=   getipnettable(p_arptable,   dwsize,   false);
这里面的指针没有分配空间就用了,如果没有猜错的话getipnettable这个函数应该是dll文件里面写的

如果前面不错,下面两行不应该报错
  if   p_arptable   =   nil   then
    p_arptable   :=   allocmem(dwsize);
发表于:2007-04-13 17:45:007楼 得分:0
getipnettable需要调用两次,实际上应该是这样
getipnettable(nil,   dwsize,   false);
p_arptable   :=   allocmem(dwsize);

getipnettable(p_arptable,   dwsize,   false);

第一次,获取size大小
第二次,才获取真正的arp   table

getipnettable是iphlpapi.dll里面的函数
发表于:2007-04-13 17:46:238楼 得分:0
问题是相同的单元,在dll中,就会报错
在exe中则一点错误都没有!!
发表于:2007-04-14 16:21:469楼 得分:0
最终找出原因
由于使用了fastmm4,不知道是否fastmm对于dll存在着内存管理方面的问题?会引起分配内存报错,但在exe中都很正常.....
将所有工程文件中的第一行加上sharemem,只能在发布时,连borlandmm.dll一起了


快速检索

最新资讯
热门点击