Как преобразовать PowerBASIC-типы в VB6-типы? - PullRequest
0 голосов
/ 21 июля 2009

Эти типы взяты из демонстраций для библиотеки FastCGI Dll (с обработчиком SIGTERM) для веб-серверов Windows и написаны на PowerBASIC. Я пытаюсь преобразовать их в VB6 (также обнаружив, как вызвать CDECL DLL из VB6 ).

    ' Structures
    TYPE FCGX_STREAM
      pData           AS DWORD            ' Pointer to the first byte of data   
      LenStored       AS DWORD            ' Bytes Total data stored - up to 4.2GB 
      Capacity        AS DWORD            ' Bytes Total available   - up to 4.2GB  
      CurPos          AS DWORD            ' Current Position within the buffer of the next byte to read, as an offset from pData

      Reserved        AS STRING*12        ' Opaque Variables
    END TYPE ' 28 bytes  


    TYPE FCGX_REQUEST 
      Version         AS LONG             ' Dll Version Number * 1000 = %FCGI_VERSION        
      ReqCount        AS LONG             ' Request Counter 

      Role            AS LONG             ' FastCGI Role
      ConnFlags       AS LONG             ' Connection flags - zero = application closes connection after responding

      ReqMethod       AS LONG             ' Request HTTP Method - Code 1 - 8
      ContLen         AS LONG             ' CONTENT_LENGTH - Length of POST data sent (in the pInStream Data String)   
      pzQuery         AS ASCIIZ PTR       ' Pointer to ASCIIZ (Null Terminated) QUERY_STRING (Values Only) - Always a valid pointer

      nParam          AS LONG             ' Number of Request Params in the array                                  
      envp            AS DWORD PTR        ' Pointer to Array of Request Parameters  

      pIn             AS FCGX_STREAM PTR  ' Pointer to a String Builder object
      pOut            AS FCGX_STREAM PTR  ' Pointer to a String Builder object
      pErr            AS FCGX_STREAM PTR  ' Pointer to a String Builder object                                          

      pzLastErr       AS ASCIIZ PTR       ' Pointer to ASCIIZ String containing Last Error description

      Reserved        AS STRING*108       ' Opaque Variables
    END TYPE ' 160 bytes

Моя проблема в том, чтобы понять, как получить информацию, хранящуюся в ASCIIZ PTR, FCGX_STREAM PTR и DWORD PTR элементах.

Ответы [ 2 ]

3 голосов
/ 21 июля 2009

Я много лет не работал с VB6, поэтому примите приведенную ниже информацию со здоровой дозой скептицизма. Но вот с чего бы я начал, если бы сегодня столкнулся с этой проблемой.

Поскольку вы работаете в VB6, я предполагаю, что это 32-битный код.

Типы PTR являются указателями на блоки памяти, которые были выделены чем-то другим. Чтобы получить доступ к этой памяти, вам нужно разыменовать указатель.

Все значения PTR являются 32-битными, поэтому, когда вы создаете для этого структуру VB6, поместите DWORD или LONG или любое другое 32-битное значение VB6.

Чтобы разыменовать указатели, вам нужно вызвать функцию Windows API RtlMoveMemory, как описано здесь . Все три параметра RtlMoveMemory являются 32-битными значениями.

1 голос
/ 21 июля 2009
  • Ответ Джима выглядит хорошо. Я бы также посоветовал взглянуть на совет Microsoft по написанию C-библиотек для вызова из VB. Первоначально выпущен с VB5, но все еще имеет отношение к VB6. Это объясняет структуру упаковки и т. Д.
  • EDIT. Также стоит посмотреть: гуру VB6 Карл Петерсон обсуждает как работать со структурами, содержащими указатели в VB6.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...