Perl에서 임의의 dll 함수 호출로 C++ 구조 포인터 전달
-
13-09-2019 - |
문제
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 합니다.