代码之家  ›  专栏  ›  技术社区  ›  zeus

ServerSupportFunction询问DWORD以null结尾的字符串,如何在64位上执行?

  •  0
  • zeus  · 技术社区  · 3 年前

    我需要调用windows api:

    BOOL WINAPI * ServerSupportFunction(
      _In_  struct _HTTP_FILTER_CONTEXT *pfc,
      _In_  enum SF_REQ_TYPE sfReq,
      _In_  PVOID pData,
      _In_  DWORD ul1,
      DWORD ul2
    );
    

    https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ff827495(v=vs.85)

    这在delphi中是这样翻译的:

    function (
      var pfc{: THTTP_FILTER_CONTEXT};
      sfReq: DWORD; 
      pData: Pointer; 
      ul1, ul2: DWORD): BOOL; stdcall;
    

    winApi医生说 UL1(DWORD)必须指向一个可选的以空结尾的字符串 其中包含要添加的标头。所以我天真地尝试这样(delphi代码):

    Var LUrl: ansiString;
    LUrl := 'Location: https://myserver'+#13#10#13#10
    pfc.ServerSupportFunction(
      pfc, // var pfc{: THTTP_FILTER_CONTEXT};
      SF_REQ_SEND_RESPONSE_HEADER, // sfReq: DWORD
      PANSIchar('307 Temporary Redirect'), // pData: Pointer
      Dword(@LUrl[1]), // ul1: DWORD
      0);
    

    但这在访问违规方面惨遭失败。但当我使用64位时,我不明白如何 Dword(@LUrl[1]) 甚至可以作为@return 64位地址使用

    那我该怎么办?它们是否是一种强制指针保持在32位空间的方法,以便我可以将其转换为DWORD?还是我只是错过了什么?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Remy Lebeau    3 年前

    这个 doc you linked to 这是错误的 ul1 ul2 . The main ServerSupportFunction doc 它本身链接到显示它们实际上是 ULONG_PTR ,不 DWORD :

    BOOL WINAPI ServerSupportFunction(
      struct _HTTP_FILTER_CONTEXT pfc, // <- * see note below
      enum SF_REQ_TYPE sfReq,
      PVOID pData,
      ULONG_PTR ul1, // <-- not DWORD!
      ULONG_PTR ul2  // <-- not DWORD!
    );
    

    注:应该是 struct _HTTP_FILTER_CONTEXT *pfc 相反。