@H_403_4@
整理一下网上的资料
1. h2xs -A wldemo 生成模板
Writing Wldemo/ppport.h
Writing Wldemo/lib/Wldemo.pm
Writing Wldemo/Wldemo.xs
Writing Wldemo/Makefile.PL
Writing Wldemo/README
Writing Wldemo/t/Wldemo.t
Writing Wldemo/Changes
Writing Wldemo/MANIFEST
cd Wldemo
修改Wldemo.xs文件 参考文档perlxs,perlguts,ppport.h
#define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #define CRCPOLY 0xEDB88320UL #define CRCINIT 0xFFFFFFFF unsigned long c_dCrcTable32[UCHAR_MAX + 1]; MODULE = Wldemo PACKAGE = Wldemo void crc32_init(char *classname) CODE: unsigned int i,j; unsigned long r; for (i = 0; i <= UCHAR_MAX; i++) { r = i; for (j = 0; j < CHAR_BIT; j++) { if (r & 1) { r = (r >> 1) ^ CRCPOLY; } else { r >>= 1; } } c_dCrcTable32[i] = r; } unsigned long crc32(char *classname,int n,char* c) CODE: unsigned long r; unsigned char* p = (unsigned char*)c; r = CRCINIT; while (--n >= 0) { r = (r >> CHAR_BIT) ^ c_dCrcTable32[(unsigned char)r ^ (*p)]; p++; } r = ~r; RETVAL = r; OUTPUT: RETVAL
2. perl Makefile.PL 生成Makefile文件
3. dmake
4. dmake test
5. dmake install
t/Wldemo.t .. ok
All tests successful.
Files=1,Tests=1, 1 wallclock secs ( 0.22 usr + 0.08 sys = 0.30 cpu)
Result: PASS
package Wldemo; use 5.018002; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. # This allows declaration use Wldemo ':all'; # If you do not need this,moving things directly into @EXPORT or @EXPORT_OK # will save memory. our %EXPORT_TAGS = ( 'all' => [ qw( ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( crc32_init mycrc32 ); our $VERSION = '0.01'; require XSLoader; XSLoader::load('Wldemo',$VERSION); # Preloaded methods go here. sub mycrc32{ my ($class,$num,$char)=@_; print "$num good luck\n"; crc32($class,$char); } 1;
7. perl 进行调用测试
use Wldemo qw(crc32_init mycrc32); my @data1 = (0x00,0x00,0x00); my @data2 = (0xFF,0xFF,0xFF); my @data3 = (0x01,0x02,0x03,0x04); my @data4 = (0x04,0x01); my @data5 = (0x00,0x00); my @data6 = (0xFF,0xFF); my @data7 = (0x00,0x00); my $d8 = "\0\0\0\0"; Wldemo->crc32_init(); printf("%x\n",Wldemo->mycrc32(4,$d8)); printf("%x\n",pack("C4",@data1))); printf("%x\n",Wldemo->crc32(4,@data2))); printf("%x\n",@data3))); printf("%x\n",@data4))); printf("%x\n",Wldemo->crc32(3,pack("C3",@data5))); printf("%x\n",Wldemo->crc32(5,pack("C5",@data6))); <>;
4 good luck
2144df1c
4 good luck
2144df1c
ffffffff
b63cfbcd
e951a406
ff41d912
d2fd1072
进阶
生成的Wldemo.c的编译过程:
@echo off gcc -c -I. -s -O2 -DWIN32 -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -s -O2 -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" "-IC:\strawberry\perl\lib\CORE" Wldemo.c dlltool --def Wldemo.def --output-exp dll.exp g++ -o blib\arch\auto\Wldemo\Wldemo.dll -Wl,--base-file -Wl,dll.base -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" Wldemo.o C:\strawberry\perl\lib\CORE\libperl518.a -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 dll.exp dlltool --def Wldemo.def --base-file dll.base --output-exp dll.exp g++ -o blib\arch\auto\Wldemo\Wldemo.dll -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" Wldemo.o C:\strawberry\perl\lib\CORE\libperl518.a -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32 dll.exp pause@H_403_4@