请教函数调用问题GetAddressInt(一个新的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;
平凡的我,平凡的你,追求不平的生活
怎么用返回指针?这的看你了,我也不知道
平凡的我,平凡的你,追求不平的生活