2008-10-24 6 views
2

다소 이상한 경험입니다. ActiveState의 최신 PDK (v7.3)을 사용하여 perlctrl을 사용하여 COM DLL을 작성했습니다. Perlctrl은 문제없이 달렸다. OLEView는 형식 라이브러리를 읽었습니다. RegSvr32에서 등록했습니다. 그러나 ... 레지스트리에 아무런 표시가 없으며 사용하려고 시도하는 모든 것이 실패합니다. 나는 RegEdit을 사용하여 다양한 UID를 찾고 사냥했다.아직 등록 된 RegSvr32 등록되지 않았습니다.

코드는 다음과 같습니다. 링구아 :: ZH :: WordSegmenter의 래핑이지만 인코딩은 gbk가 아닌 utf8로 변경되었습니다.

그것은 아마 분명 뭔가가 ...

package ZHWordSeg; 

use strict; 
use warnings; 
use utf8; 
use ws; 

use Encode; 

use constant STX => chr(2); #[ 
use constant ETX => chr(3); #] 
use constant FS => chr(28); #^ 
use constant RS => chr(30); #~ 

use constant TAB_SEPARATOR => 0; 
use constant CARET_SEPARATOR => 1; 
use constant FS_SEPARATOR => 2; 
use constant SPACE_SEPARATOR => 3; 
use constant AS_ARRAY => 4; 

use feature 'switch'; 

our $segmenter; 

sub ZHWordSeg_Setup { 
    my $dic = shift; 
    my $dic_encoding = shift; 
    my $separator = shift; 
    my $verbose = shift; 

    $dic_encoding = 'utf8' unless defined($dic_encoding); 
    $separator = " " unless defined($separator); 
    $verbose = 0 unless defined($verbose); 

    if (defined($dic)) { 
    $segmenter = ws->new(dic => $dic, dic_encoding => $dic_encoding, seperator => $separator, verbose => $verbose); 
    } else { 
    $segmenter = ws->new(dic_encoding => $dic_encoding, seperator => $separator, verbose => $verbose); 
    } 
} 

sub ZHWordSeg { 
    my $source = shift; 
    print STDERR $source; 
    my $sepcode = shift; 
    $source = encode("utf8",$source); 
    my $stringres = $segmenter->seg($source); 
    my @arrayres; 

    given ($sepcode) { 
    when (TAB_SEPARATOR) { 
     $stringres =~ tr/ /\t/; 
     return $stringres; 
    } 
    when (CARET_SEPARATOR) { 
     $stringres =~ tr/ /^/; 
     $stringres .= "^"; 
     return $stringres; 
    } 
    when (FS_SEPARATOR) { 
     $stringres =~ s/ /FS/eg; 
     $stringres .= FS; 
     return $stringres; 
    } 
    when (SPACE_SEPARATOR) { 
     return $stringres; 
    } 
    default { 
     @arrayres = split(/ /, $stringres); 
     return \@arrayres; 
    } 
    } 
} 

sub SetDictionary { 
    my ($source) = shift; 
    my $res = set_dic($source); 
    return $res; 
} 

1; 

=pod 

=begin PerlCtrl 

%TypeLib = (
    PackageName  => 'ZHWordSeg', 
    DocString  => 'Chinese word segmentation', 
    HelpContext  => 1, 
    TypeLibGUID  => '{F6C9BD66-7CA1-4610-B77F-E219A7122C18}', # do NOT edit this line 
    ControlGUID  => '{45D47C6A-2B9A-4D62-9CFD-F18C95DC00C5}', # do NOT edit this line either 
    DispInterfaceIID=> '{007E4E7A-3B75-4DC3-864C-7746860941B3}', # or this one 
    ControlName  => 'BOCWS', 
    ControlVer  => 2, # increment if new object with same ProgID 
    # create new GUIDs as well 
    ProgID   => 'ZHWordSeg.BOCWS', 
    LCID   => 0, 
    DefaultMethod => 'ChineseWordSegmenter', 
    Methods   => { 
     'ChineseWordSegmenter' => { 
     RetType    => VT_VARIANT, 
     TotalParams   => 2, 
     NumOptionalParams => 1, 
     ParamList   => 
      [ 'source' => VT_BSTR, 
      'sepcode' => VT_I4 
      ] 
     }, 
     'ChineseWordSegmenter_Setup' => { 
     RetType    => VT_VARIANT, 
     TotalParams   => 4, 
     NumOptionalParams => 4, 
     ParamList   => 
      [ 'dic' => VT_BSTR, 
      'dic_encoding' => VT_BSTR, 
      'separator' => VT_BSTR, 
      'verbose' => VT_BSTR 
      ] 
     } 
    }, # end of 'Methods' 
    Properties  => { 
    TAB_SEPARATOR => { 
     DocString => "Separate items with TAB (0x0)", 
     Type => VT_I4, 
     DispID => 3, 
     ReadOnly => 1, 
    }, 
    CARET_SEPARATOR => { 
     DocString => "Separate items with^(0x1)", 
     Type => VT_I4, 
     DispID => 4, 
     ReadOnly => 1, 
    }, 
    FS_SEPARATOR => { 
     DocString => "Separate items with ascii 28 (0x2)", 
     Type => VT_I4, 
     DispID => 5, 
     ReadOnly => 1, 
    }, 
    SPACE_SEPARATOR => { 
     DocString => "Separate items with space (0x3)", 
     Type => VT_I4, 
     DispID => 6, 
     ReadOnly => 1, 
    }, 
    AS_ARRAY => { 
     DocString => "Separate items as array (0x4)", 
     Type => VT_I4, 
     DispID => 7, 
     ReadOnly => 1, 
    } 
    }, # end of 'Properties' 
); # end of %TypeLib 

=end PerlCtrl 

=cut 

이것은 .perlctrl 파일, 경우에 중요한된다

#!C:\Program Files\ActiveState Perl Dev Kit 7.3 Deployment\bin\lib\pai.exe 
PAP-Version: 1.0 
Packer: C:\Program Files\ActiveState Perl Dev Kit 7.3 Deployment\bin\perlctrl.exe 
Script: ZHWordSeg.ctrl 
Cwd: P:\BOCWS 
Byref: 0 
Clean: 0 
Date: 2008-10-24 18:05:42 
Debug: 127.0.0.1:2000 
Dependent: 0 
Dyndll: 0 
Exe: BOCWS.dll 
Force: 1 
Gui: 0 
Hostname: xi 
No-Compress: 0 
No-Gui: 0 
No-Logo: 0 
Runlib: 
Shared: none 
Singleton: 0 
Tmpdir: 
Verbose: 0 
Version-Comments: 
Version-CompanyName: 
Version-FileDescription: Wrapper of Lingua::ZH::WordSegmenter.pm 
Version-FileVersion: 1.0 
Version-InternalName: ZHWordSeg 
Version-LegalCopyright: 
Version-LegalTrademarks: 
Version-OriginalFilename: ZHWordSeg.ctrl 
Version-ProductName: BOChineseWordSegmenter 
Version-ProductVersion: 1.0 
Warnings: 0 
Xclude: 1 

답변

1

내가 찾은 유일한 "solution는"이상 제안했다 on news : comp.os.ms-windows.programmer.win32

나는 PDK 사용자가 아니지만 경험에서 나는 당신을 말할 수있다. uld는 DllRegister가 코드를 내보내고 내부적으로 무엇을하는지 확인합니다. regsvr32가 호출하고이 코드가 com 서버/프록시 등에 대한 레지스트리 키를 생성하기 때문에 ...

변경 사항을 레지스트리에서 추적 할 수 있습니다 regmon이나 procmon과 같은 sysinternal 도구를 사용하면 확실합니다!

결국 나는 포기하고 다시 일을하고 쥐게 이전 버전으로 갔다.