请教函数调用问题GetAddressInt(一个新的IP数据格式:ipwry)

jensgn
看到篇一个新的IP数据格式:ipwry

http://blog.csdn.net/cnss/archive/2004/10/14/ipwry.aspx



ipsearcher.dll新增了几个导出函数:

void* __cdecl GetAddressInt(unsigned int ip);

功能同_GetAddress,参数IP是整型而不是字符串,字节序为little-endian.

bool __cdecl Reload();

重新加载ipwry.dat,适用于网站统计程序不间断运行的升级IP数据.

unsigned int __cdecl IPCount();

返回有多少条IP

char* __cdecl DateTime();

返回数据生成的日期时间



不知道这个:void* __cdecl GetAddressInt(unsigned int ip);函数怎么调用???

下面两个道会了.

function IPCount(): Integer; stdcall; external 'ipsearcher.dll';

function DateTime(): PChar; stdcall; external 'ipsearcher.dll';


附_GetAddress:

作者没有公开这个dll的接口函数原型(真不符合开放源代码的精神),给我们带来了一些麻烦。这里就需要进行一些猜测。首先,用Tdump看了一下,这个dll只有一个导出函数_GetAddress,注意前面有个下划线。最困难的是猜测参数和返回值类型,在“大富翁论坛”朋友的帮助下,终于摆平。这个函数的参数是一个char型的指针,返回值是一个指向字符串数组的指针。开始怎么也没想到这个返回值的类型,猜了好几天。这下真的简单了,还有一些需要注意的地方我在下面的程序里指出。


#include <windows.h>
#include <stdio.h>

typedef char**
(__stdcall *GETLOCATION)(char *IP) ;//定义函数类型

int main(int argc, char
**argv)
{
char **Loc;
char IP[16];//注意这个地方,一定是16,还有下面红字的地方
HMODULE hDll;
GETLOCATION
GetLocation;
if(argc!=2)
{
  fprintf(stderr,"ip <IP
address>\n");
  return
0;
}
hDll=LoadLibrary(TEXT("ipsearcher.dll"));//这个ipsearcher.dll就是从QQ查IP软件里拷出来的,
if(!hDll)
                               
//同时wry.dll也是那里面的,我把他们打包放在这里了
{
  fprintf(stderr,"LoadLibrary()
fail.\n");
  return
0;
}
GetLocation=(GETLOCATION)GetProcAddress(hDll,"_GetAddress");
if(!GetLocation)
{
 
fprintf(stderr,"GetProcAddress() fail.\n");
  return
0;
}
lstrcpyn(IP,argv[1],16);//这里,把要查询的IP地址字符串拷贝到数组里
Loc=GetLocation(IP);    //这里,如果直接写argv[1]就会出错,莫名其妙。
fprintf(stderr,"%s\n",*Loc);//返回值是一个指向字符串数组的指针,这个数组里的第一个字符串是物理地址
fprintf(stderr,"%s\n",*(Loc+1));//第二个字符串是更详细的物理地址
FreeLibrary(hDll);

return
0;
}



野狼

你看行不行

procedure TForm1.Button1Click(Sender: TObject);
type
  TFun = function(Time: Integer):Pointer;cdecl;
  THandle = Integer;
var
  Handle: THandle;
  fun: TFun;
begin
  Handle := LoadLibrary('ipsearcher.dll');
  if Handle <> 0 then
  begin
    @fun := GetProcAddress(Handle, 'GetAddressInt');
    if @fun <> nil then
    begin
      fun(1);
    end;
    FreeLibrary(Handle);
  end
end;

平凡的我,平凡的你,追求不平的生活
jensgn
老大,动态调用DLL后返回来的:fun(1);指针类型应该怎么让显示数据呀?
野狼
jensgn
老大,动态调用DLL后返回来的:fun(1);指针类型应该怎么让显示数据呀?


怎么用返回指针?这的看你了,我也不知道

平凡的我,平凡的你,追求不平的生活