문제

Win32::API를 사용하여 C++ 구조 포인터를 허용하는 DLL로 내보낸 임의 함수를 호출하고 있습니다.

struct PluginInfo {
        int  nStructSize;   
        int  nType;     
        int  nVersion;    
        int  nIDCode;    
        char         szName[ 64 ];  
        char            szVendor[ 64 ];
        int  nCertificate;  
        int  nMinAmiVersion;
};

구조를 구성하려면 "pack" 함수를 사용해야 하고 인수를 전달해야 하기 때문입니다.

my $name = " " x 64;
my $vendor = " " x 64;
my $pluginInfo = pack('IIIIC64C64II',0,0,0,0,$name,$vendor,0,0);

구조를 제대로 구축하지 못한 것입니다.
C에 적용된 길이 인수는 그 많은 인수를 삼켜버릴 것 같습니다.
Perl에서 이 구조를 구성하고 DLL 호출로 전달하는 가장 좋은 방법을 제안해 주실 수 있는 분이 계십니까?

미리 감사드립니다.
나가 키란

도움이 되었습니까?

해결책

사용 Z (nul-padded string) 템플릿에서

my $pluginInfo = pack('IIIIZ64Z64II',0,0,0,0,$name,$vendor,0,0);

또한 살펴보십시오 Win32::API::Struct, Win32 :: API 모듈의 일부입니다.

다른 팁

복잡한 내용은 확인해 보세요. 변환::바이너리::C.처음에는 어려워 보일 수도 있지만 일단 그 힘을 깨닫고 나면 눈이 번쩍 뜨일 것입니다.

업데이트:약간의 정보를 추가하겠습니다.당신은 한 번 살펴 봐야합니다 모듈 맨페이지의 특정 섹션 그것을 사용하는 가장 큰 이유.편의상 인용하겠습니다.

Convert::Binary::C를 사용하는 이유는 무엇입니까?

데이터를 압축(또는 압축 해제)하고 싶다고 가정해 보겠습니다. 다음 C에 따르면 구조:

struct foo {
  char ary[3];
  unsigned short baz;
  int bar;
};

물론 Perl의 팩을 사용할 수 있습니다 그리고 unpack 함수 :

@ary = (1, 2, 3);
$baz = 40000;  
$bar = -4711;
$binary = pack 'c3 Si', @ary, $baz, $bar;

그러나 이것은 구조체가 멤버는 바이트로 정렬됩니다.만약 그랬다면 long aligned( 대부분의 컴파일러)를 작성해야 합니다.

 $binary = pack 'c3 x S x2 i', @ary, $baz, $bar;

실제로 증가하지 않습니다 가독성.

이제 짐을 싸야 한다고 상상해 보세요. 완전히 다른 데이터 다른 바이트를 가진 아키텍처 주문.당신은 팩을 들여다 볼 것입니다 다시 맨페이지를 만들고 아마도 생각해 낼 수 있습니다. 이:

$binary = pack 'c3 x n x2 N', @ary, $baz, $bar;

그러나 포장을 풀려고 하면 $foo 다시 말하지만, 서명 된 값이 바뀌 었습니다 서명되지 않은 것으로.

이 모든 것은 여전히 다음을 통해 관리할 수 있습니다. 펄.그러나 당신의 구조가 얻는다고 상상해보십시오. 더 복잡합니까?다음을 수행해야 한다고 상상해 보십시오. 다양한 플랫폼을 지원합니까?상상하다 를 변경해야 합니다. 구조?당신은 할 수만 있는 것이 아닙니다 C 소스뿐만 아니라 수십 개의 pack 문자열을 Perl 코드에 포함하십시오.이 재미가 없습니다.그리고 Perl은 재미있어야 합니다.

자, 당신이 할 수 있다면 좋지 않을까요 C 소스를 읽으십시오. 이미 작성되었으며 모든 유형을 사용합니다. 포장을 위해 거기에 정의되고 풀고?그게 뭐야 Convert::Binary::C 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top