2009-07-21 70 views
0

这些类型来自FastCGI Dll Library (with SIGTERM handler) for Windows Web Servers的演示并且用PowerBASIC编写。我试图将它们转换为VB6(也发现了如何call a CDECL DLL from VB6)。如何将PowerBASIC类型转换为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 PTRFCGX_STREAM PTRDWORD PTR项目的信息获取。

+0

您可以发布PowerBasic示例之一的链接吗?我找不到一个。 – 2009-07-21 16:13:05

+0

请注意,超级大师Matt Curland的书“高级Visual Basic 6”还包含一种从VB6调用CDECL DLL的方法。 – MarkJ 2009-07-31 11:43:49

回答

3

我很多年都没有和VB6一起工作过,所以把下面的信息拿出来用一种健康的怀疑态度。但如果我今天面临这个问题,那么这就是我要开始的地方。

既然你在VB6中工作,我会假设这是32位代码。

PTR类型似乎是指向由其他东西分配的内存块的指针。要访问该内存,您需要取消引用指针。

所有PTR值都是32位,因此当您为此创建VB6结构时,请将DWORD或LONG或VB6 32位值设置为任何值。

要取消引用指针,您需要调用Windows API函数RtlMoveMemory,如here所述。 RtlMoveMemory的所有三个参数都是32位值。

1
  • Jim's answer看起来不错。我也建议在编写从VB调用的C DLL时寻找Microsoft advice。最初与VB5一起发布,但仍与VB6相关。它解释了结构包装等。
  • 编辑。另外值得一看:VB6大师卡尔彼得森discusses如何处理包含VB6中指针的结构。