通C++構造のポインタPerlから任意dll関数呼び出し
-
13-09-2019 - |
質問
を使用していWin32::API呼び出す機能を任意に輸出され、DLLを受け入れるC++構造のポインタです。
struct PluginInfo {
int nStructSize;
int nType;
int nVersion;
int nIDCode;
char szName[ 64 ];
char szVendor[ 64 ];
int nCertificate;
int nMinAmiVersion;
};
している必要があります"パック"機能を構築する構造を渡す必要がある引数
my $name = " " x 64;
my $vendor = " " x 64;
my $pluginInfo = pack('IIIIC64C64II',0,0,0,0,$name,$vendor,0,0);
そのな構築の構造。
この長さの引数に適用Cを鵜呑みの方に多くの論争することができます。
でもお勧めの最良の方法を構築しこの構造形式はPerlとpassonにはdllます。
おかげさまで、事前に
ナガKiran
解決
タグのように、テンプレートに
Z
(NUL詰めの文字列)を使用します
my $pluginInfo = pack('IIIIZ64Z64II',0,0,0,0,$name,$vendor,0,0);
また、 Win32::API::Struct
のを見て、これのWin32 :: APIモジュールの一部です。
他のヒント
も複雑で、チェックアウト 変換::バイナリー::C.この困難な時はまさしくその通りなのだが、実力で目先制に成功します。
更新:私のタイアップムービー情報です。必見 特定のモジュールのmanpage の理由にお使い頂けます。私が引用で利便性:
を利用する理由に変換::バイナリー::C?
したいと言うパックまたはアンパックデータ は、下記のC 構造
struct foo {
char ary[3];
unsigned short baz;
int bar;
};
きもちろん使用Perlパック と解凍機能
@ary = (1, 2, 3);
$baz = 40000;
$bar = -4711;
$binary = pack 'c3 Si', @ary, $baz, $bar;
このことを意味する構造体 会員バイトが揃います。れた場合 長揃えのデフォルト ほとんどのコンパイラ)いを書く
$binary = pack 'c3 x S x2 i', @ary, $baz, $bar;
なん増加 読む
これに必要なパックの データは全く異なる 建築の異なるバイト ます。うにパック manpageを再びもたち この:
$binary = pack 'c3 x n x2 N', @ary, $baz, $bar;
しかし、ごみ箱$foo 再度、ご署名の値が への符号なします。
すべてのことで適法かつ公正な手段で行 Perlです。があ構造の取得 複雑?想像しに必要なもの 支援がいろいろなプラットフォーム?想像 必要なものを変化させることができる 構造きない 変更は、C言語のソースでも数十人の パック内の文字列おPerlのコードです。この なに楽しいです。やPerlきます。
現ができるのではないれば良 直読では、C言語のソースまで 既に記述する全ての種類 定義が包及び 開封?その 変換::バイナリー::Cます。