2011-02-23 7 views
0

안녕하세요, 내 dll에 대한 call() 함수의 반환에 char 포인터 또는 문자열 값을 가져 오려고합니다. dll 함수가 RandomDec (long, int *) 함수를 가지고 있고 문자열을 반환합니다. 그래서 Win32 :: API()를 사용하여 나의 호출이 될 것이다. 나는 이것을 시도하고 성공하지 못했습니다. plz 도움Perl Win32 :: API() function

use Win32::API; 
my @lpBuffer = " " x 20; 
my $pp= \@lpBuffer; 
my $xy=0; 
my $ff= \$xy; 
my $fun2 = new Win32::API('my.dll','RandomDec','NP','**P**')or die $^E; 
$pp = $fun2->Call(4,$ff); 

$ pp를 사용하는 방법?

답변

0

코드에 여러 오류가 있습니다.

  • my @lpBuffer = " " x 20; my $pp= \@lpBuffer;
    1. => my $pp = " " x 20;

      당신은 문자열 배열을 혼합하고, 당신이 C의 PTR에 대한 펄 심판이 필요하지 않습니다. int *와 유사합니다.

      1. N은 그리 길지 않습니다. L은 서명이 없을거야, 서명이 필요해. 그래서. Win32에서이 :: API는 숯불하는 좌변 할당을 할 수 있다면
       
          use Win32::API; 
          my $pp = " " x 20; # alloc a string 
          my $xy = 0;   # alloc an int 
          my $fun2 = new Win32::API('my.dll','RandomDec','lP','P') or die $^E; 
          $pp = $fun2->Call(4,$xy); 
      

      나는 * 확인하지 않았습니다. 일반적으로 그렇게하지 않으면 $ pp는 ​​호출 후 일부 문자열에 대한 외부 포인터가되고 prev. $ pp의 PV 슬롯이 손실되어 perl에서 액세스 할 수 없습니다. FFI와 WinAPI를 사용하면 일반적으로 문자열이 아닌 int를 반환합니다. 함수 인수로만 sideeffects를 통한 문자열.

    +0

    감사합니다. 하지만 어떻게 문자열을 반환 형식으로 dll 함수에서 얻을 수 있습니다. 도와주세요. 나는 해결책을 찾을 수 없다. –

    +0

    먼저 문자열을 만드는 방법을 알아야합니다. 펄이나 DLL에 있니? dll로부터 포인터를 돌려 받는다. 그리고 이것은 문자열이다. 내 고정 예제에서 $ pp는 ​​perl에 의해 할당 된 문자열이며 아마도 dll에 의해 변경됩니다. – rurban