我给你以个例子: The cdecl convention is useful when you call functions from DLLs written in C or C++;unit SwDes;interfaceuses SysUtils,Dialogs,windows,commstruct;type
TCalCRC=function (pData:Pointer;Datalen:integer):word;cdecl;
TDeDES=procedure (Block:Pchar);cdecl;
TDESinit=function(Mode:integer):integer;cdecl;
TDESDone=function :integer;cdecl;
TDESSetKey=function(Key:pchar):integer;cdecl;
TEnDES=procedure (Block:pchar);cdecl;
Tseczh=procedure (id:integer;key:pchar;srcdata:pchar;destdata:pchar;datalen:integer);cdecl;
TUnixTime=function :integer;cdecl;
TUnixTimeStr=procedure (tim:integer;buf:pchar);cdecl;var
HModule :Thandle;
SWIHModule :Thandle;
CalCRC :TCalCRC;
DeDES:TDeDES;
DESInit:TDESinit;
DESDone:TDESDone;
DESSetKey:TDESSetKey;
EnDES:TEnDES;
swiseczh:tseczh;
UnixTime:TUnixTime;
UnixTimeStr:TUnixTimeStr;
procedure setdeskey(key:pchar); // des key 设置
procedure Encode(p:pointer;len:integer);
procedure Decode(p:pointer;len:integer);
procedure CRC(Data:pSLI_BlockHead);
function LoadSecurityParam(Mode:integer):boolean;
procedure UnLoadSecurityParam;
procedure createdeskey(methord:integer;key:pchar);
procedure seczh(id:integer;zh:pchar;key:pchar;len:integer);
function validcrc(pinfo:pSLI_BlockHead):boolean;
function punixtime:integer;
procedure punixtimestr(tim:integer;var buf:string); procedure unloadswisec;
procedure loadswisec;
function gennet(netnum:pbyte):string;
function gennode(nodenum:pbyte):string;
implementationprocedure CRC(Data:pSLI_blockhead);
begin
Data^.crc:=CalCRC(@Data.blocktype,Data^.blocksize-4);
end;procedure setdeskey(key:pchar); // des key 设置
begin
DESSetKey(key);
end;procedure Encode(p:pointer;len:integer);
var
i,time:integer;
begin
time:=len div 8;
for i:=1 to time do
begin
EnDes(p);
p:=pointer(integer(p)+8);
end;
end;procedure Decode(p:pointer;len:integer);
var
i,time:integer;
begin
time:=len div 8;
for i:=1 to time do
begin
DeDES(p);
p:=pointer(integer(p)+8);
end;
end;procedure loadswisec;
begin
SWIHModule:=LoadLibrary(pchar('swisecu.dll'));
if SWIHModule <> 0 then
begin
swiseczh:=GetProcAddress(SWIHModule,'SWI_SEC');
end;
end;function LoadSecurityParam(Mode:integer):boolean; //导入安全参数 值
begin
Result:=false;
UnloadSecurityParam;
HModule:=LoadLibrary(pchar('descrc.dll'));
if HModule<>0 then
begin
CalCRC:=GetProcAddress(HModule,'CalCRC');
DeDES:=GetProcAddress(HModule,'dedes');
EnDES:=GetProcAddress(HModule,'endes');
DESInit:=GetProcAddress(HModule,'desinit');
DESDone:=GetProcAddress(HModule,'desdone');
DESSetKey:=GetProcAddress(HModule,'dessetkey');
UnixTime:=GetProcAddress(HModule,'UnixTime');
UnixTimeStr:=GetProcAddress(HModule,'UnixTimeStr');
if (not assigned(CalCRC)) or (not assigned(DeDES))or(not assigned(EnDES))or(not assigned(desinit))or(not assigned(dessetkey))or(not assigned(desdone)) then
begin
UnloadSecurityParam;
end
else
begin
Result:=DESInit(Mode)=0;
end;
end;
end;procedure unloadswisec;
begin
FreeLibrary(SWIHModule);
swiseczh:=nil;
end;procedure UnLoadSecurityParam;
begin
try
if assigned (DesDone) then
begin
DESdone;
end;
finally
FreeLibrary(HModule);
CalCRC:=nil;
DeDES:=nil;
DESInit:=nil;
DESDone:=nil;
DESSetKey:=nil;
EnDES:=nil;
UnixTime:=nil;
UnixTimeStr:=nil;
end;
end;procedure createdeskey(methord:integer;key:pchar);
var t:array[0..8] of char;
i,k:integer;
begin
for i:=0 to 7 do
begin
k:=random(256);
if k <> 0 then
begin
t[i]:=char(k);
end
else
begin
t[i]:=char(1);
end;
end;
t[8]:=char(0);
strcopy(key,pchar(@t));
end;
procedure seczh(id:integer;zh:pchar;key:pchar;len:integer);
var szh:array[0..16] of char;
dzh:array[0..16] of char;
t:string;
var i:integer;
begin
strcopy(pchar(@szh),zh);
t:=strpas(zh);
for i:=length(t) to len-1 do
begin
szh[i]:=char(32);
end;
t:=strpas(szh);
swiseczh(id,key,pchar(@szh),pchar(@dzh),length(t));
for i:=0 to len-1 do
begin
pchar(integer(zh)+i)^:=dzh[i];
end;
end;function validcrc(pinfo:pSLI_blockhead):boolean;
var i:integer;
begin
i:=CalCRC(@pinfo.blocktype,pinfo^.blocksize-4);
if pinfo^.crc=i then
result:=true
else
result:=false;
end;function gennet(netnum:pbyte):string; //取得网络名称
var i:integer;
s,p:string;
begin
s:='';
for i:=0 to 3 do //10101010
begin
p:=inttohex((pbyte(integer(netnum)+i)^ shr 4),1);
s:=s+p;
p:=inttohex((pbyte(integer(netnum)+i)^ and $0f),1);
s:=s+p;
end;
result:=s;
end;function gennode(nodenum:pbyte):string;
var i:integer;
s,p:string;
begin
s:='';
for i:=0 to 5 do
begin
p:=inttohex((pbyte(integer(nodenum)+i)^ shr 4),1);
s:=s+p;
p:=inttohex((pbyte(integer(nodenum)+i)^ and $0f),1);
s:=s+p;
end;
result:=s;
end;function punixtime:integer;
begin
result:=UnixTime;
end;procedure punixtimestr(tim:integer;var buf:string);
var pbuf:array[0..90] of char;
begin
try
UnixTimeStr(tim,@pbuf);
buf:=strpas(pbuf);
except
buf:='';
end;
end;
end.#include <windows.h>
#include <time.h>
#include "DLL.h"
__declspec( dllexport )WORD CalCRC(void *pData, int nDataLen)
{
WORD acc = 0;
int i;
unsigned char* Data = (unsigned char*) pData; while(nDataLen--)
{
acc = acc ^ (*Data++ << 8);
for(i = 0; i++ < 8; )
if(acc & 0x8000)
acc = (acc << 1) ^ 0x1021;
else
acc <<= 1;
} // Swap High and Low byte
i = ( (WORD) ( ((UCHAR)acc) << 8) ) | ((WORD)(acc >> 8)); return i;
}__declspec( dllexport )long UnixTime()
{
time_t t; t=time(NULL);
return (long)t;
}__declspec( dllexport )void UnixTimeStr(long t,char *buf)
{
struct tm* h;
time_t m; m=(time_t)t;
h=localtime(&m);
strftime(buf,80,"%Y%m%d",h);
}include <windows.h>
#ifndef DLL#if defined(__cplusplus)
extern "C"{
#endif__declspec( dllexport ) WORD CalCRC(void *pData, int nDataLen);
__declspec( dllexport ) void dedes(char *block);
__declspec( dllexport ) int desdone();
__declspec( dllexport ) int desinit(int mode);
__declspec( dllexport ) int dessetkey(char *key);
__declspec( dllexport ) void endes(char * block);
__declspec( dllexport )void UnixTimeStr(long t,char *buf);
__declspec( dllexport )long UnixTime();#if defined(__cplusplus)
}
#endif
#define DLL
#endif
TCalCRC=function (pData:Pointer;Datalen:integer):word;cdecl;
TDeDES=procedure (Block:Pchar);cdecl;
TDESinit=function(Mode:integer):integer;cdecl;
TDESDone=function :integer;cdecl;
TDESSetKey=function(Key:pchar):integer;cdecl;
TEnDES=procedure (Block:pchar);cdecl;
Tseczh=procedure (id:integer;key:pchar;srcdata:pchar;destdata:pchar;datalen:integer);cdecl;
TUnixTime=function :integer;cdecl;
TUnixTimeStr=procedure (tim:integer;buf:pchar);cdecl;var
HModule :Thandle;
SWIHModule :Thandle;
CalCRC :TCalCRC;
DeDES:TDeDES;
DESInit:TDESinit;
DESDone:TDESDone;
DESSetKey:TDESSetKey;
EnDES:TEnDES;
swiseczh:tseczh;
UnixTime:TUnixTime;
UnixTimeStr:TUnixTimeStr;
procedure setdeskey(key:pchar); // des key 设置
procedure Encode(p:pointer;len:integer);
procedure Decode(p:pointer;len:integer);
procedure CRC(Data:pSLI_BlockHead);
function LoadSecurityParam(Mode:integer):boolean;
procedure UnLoadSecurityParam;
procedure createdeskey(methord:integer;key:pchar);
procedure seczh(id:integer;zh:pchar;key:pchar;len:integer);
function validcrc(pinfo:pSLI_BlockHead):boolean;
function punixtime:integer;
procedure punixtimestr(tim:integer;var buf:string); procedure unloadswisec;
procedure loadswisec;
function gennet(netnum:pbyte):string;
function gennode(nodenum:pbyte):string;
implementationprocedure CRC(Data:pSLI_blockhead);
begin
Data^.crc:=CalCRC(@Data.blocktype,Data^.blocksize-4);
end;procedure setdeskey(key:pchar); // des key 设置
begin
DESSetKey(key);
end;procedure Encode(p:pointer;len:integer);
var
i,time:integer;
begin
time:=len div 8;
for i:=1 to time do
begin
EnDes(p);
p:=pointer(integer(p)+8);
end;
end;procedure Decode(p:pointer;len:integer);
var
i,time:integer;
begin
time:=len div 8;
for i:=1 to time do
begin
DeDES(p);
p:=pointer(integer(p)+8);
end;
end;procedure loadswisec;
begin
SWIHModule:=LoadLibrary(pchar('swisecu.dll'));
if SWIHModule <> 0 then
begin
swiseczh:=GetProcAddress(SWIHModule,'SWI_SEC');
end;
end;function LoadSecurityParam(Mode:integer):boolean; //导入安全参数 值
begin
Result:=false;
UnloadSecurityParam;
HModule:=LoadLibrary(pchar('descrc.dll'));
if HModule<>0 then
begin
CalCRC:=GetProcAddress(HModule,'CalCRC');
DeDES:=GetProcAddress(HModule,'dedes');
EnDES:=GetProcAddress(HModule,'endes');
DESInit:=GetProcAddress(HModule,'desinit');
DESDone:=GetProcAddress(HModule,'desdone');
DESSetKey:=GetProcAddress(HModule,'dessetkey');
UnixTime:=GetProcAddress(HModule,'UnixTime');
UnixTimeStr:=GetProcAddress(HModule,'UnixTimeStr');
if (not assigned(CalCRC)) or (not assigned(DeDES))or(not assigned(EnDES))or(not assigned(desinit))or(not assigned(dessetkey))or(not assigned(desdone)) then
begin
UnloadSecurityParam;
end
else
begin
Result:=DESInit(Mode)=0;
end;
end;
end;procedure unloadswisec;
begin
FreeLibrary(SWIHModule);
swiseczh:=nil;
end;procedure UnLoadSecurityParam;
begin
try
if assigned (DesDone) then
begin
DESdone;
end;
finally
FreeLibrary(HModule);
CalCRC:=nil;
DeDES:=nil;
DESInit:=nil;
DESDone:=nil;
DESSetKey:=nil;
EnDES:=nil;
UnixTime:=nil;
UnixTimeStr:=nil;
end;
end;procedure createdeskey(methord:integer;key:pchar);
var t:array[0..8] of char;
i,k:integer;
begin
for i:=0 to 7 do
begin
k:=random(256);
if k <> 0 then
begin
t[i]:=char(k);
end
else
begin
t[i]:=char(1);
end;
end;
t[8]:=char(0);
strcopy(key,pchar(@t));
end;
procedure seczh(id:integer;zh:pchar;key:pchar;len:integer);
var szh:array[0..16] of char;
dzh:array[0..16] of char;
t:string;
var i:integer;
begin
strcopy(pchar(@szh),zh);
t:=strpas(zh);
for i:=length(t) to len-1 do
begin
szh[i]:=char(32);
end;
t:=strpas(szh);
swiseczh(id,key,pchar(@szh),pchar(@dzh),length(t));
for i:=0 to len-1 do
begin
pchar(integer(zh)+i)^:=dzh[i];
end;
end;function validcrc(pinfo:pSLI_blockhead):boolean;
var i:integer;
begin
i:=CalCRC(@pinfo.blocktype,pinfo^.blocksize-4);
if pinfo^.crc=i then
result:=true
else
result:=false;
end;function gennet(netnum:pbyte):string; //取得网络名称
var i:integer;
s,p:string;
begin
s:='';
for i:=0 to 3 do //10101010
begin
p:=inttohex((pbyte(integer(netnum)+i)^ shr 4),1);
s:=s+p;
p:=inttohex((pbyte(integer(netnum)+i)^ and $0f),1);
s:=s+p;
end;
result:=s;
end;function gennode(nodenum:pbyte):string;
var i:integer;
s,p:string;
begin
s:='';
for i:=0 to 5 do
begin
p:=inttohex((pbyte(integer(nodenum)+i)^ shr 4),1);
s:=s+p;
p:=inttohex((pbyte(integer(nodenum)+i)^ and $0f),1);
s:=s+p;
end;
result:=s;
end;function punixtime:integer;
begin
result:=UnixTime;
end;procedure punixtimestr(tim:integer;var buf:string);
var pbuf:array[0..90] of char;
begin
try
UnixTimeStr(tim,@pbuf);
buf:=strpas(pbuf);
except
buf:='';
end;
end;
end.#include <windows.h>
#include <time.h>
#include "DLL.h"
__declspec( dllexport )WORD CalCRC(void *pData, int nDataLen)
{
WORD acc = 0;
int i;
unsigned char* Data = (unsigned char*) pData; while(nDataLen--)
{
acc = acc ^ (*Data++ << 8);
for(i = 0; i++ < 8; )
if(acc & 0x8000)
acc = (acc << 1) ^ 0x1021;
else
acc <<= 1;
} // Swap High and Low byte
i = ( (WORD) ( ((UCHAR)acc) << 8) ) | ((WORD)(acc >> 8)); return i;
}__declspec( dllexport )long UnixTime()
{
time_t t; t=time(NULL);
return (long)t;
}__declspec( dllexport )void UnixTimeStr(long t,char *buf)
{
struct tm* h;
time_t m; m=(time_t)t;
h=localtime(&m);
strftime(buf,80,"%Y%m%d",h);
}include <windows.h>
#ifndef DLL#if defined(__cplusplus)
extern "C"{
#endif__declspec( dllexport ) WORD CalCRC(void *pData, int nDataLen);
__declspec( dllexport ) void dedes(char *block);
__declspec( dllexport ) int desdone();
__declspec( dllexport ) int desinit(int mode);
__declspec( dllexport ) int dessetkey(char *key);
__declspec( dllexport ) void endes(char * block);
__declspec( dllexport )void UnixTimeStr(long t,char *buf);
__declspec( dllexport )long UnixTime();#if defined(__cplusplus)
}
#endif
#define DLL
#endif
我那里有几百个这样的C声名
如果靠手工做转化只怕要几个月.