标签: winhttp

C++ 307在visual studio 2010中尝试包含winhttp.h时出错

我有一个很大的问题.我正在尝试使用WinHttp下载带有C++的文件,我正在使用Visual Studio 2010来做这件事.

我的问题是该程序没有编译,因为生成307错误,所有引用winhttp.h.我提到我已经包含了该文件.可能是什么问题呢?谢谢!

有一些:

------ Build started: Project: a, Configuration: Debug Win32 ------

  b. Cpp

  a. Cpp

c: \program files (x86)\microsoft sdks\windows\v7.0a\include\winhttp. H(50): error C2146: 
Syntax error: missing ';' before identifier 'HINTERNET'

c: \program files (x86)\microsoft sdks\windows\v7.0a\include\winhttp. H(50): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

c: \program files (x86)\microsoft sdks\windows\v7.0a\include\winhttp. H(50): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

c: \program files (x86)\microsoft sdks\windows\v7.0a\include\winhttp. …
Run Code Online (Sandbox Code Playgroud)

c++ winhttp

6
推荐指数
1
解决办法
7099
查看次数

如何取消同步 WinHttp 请求?

WinHttpSendRequest我的服务有一个线程,当有人试图停止我的服务时,该线程可能正在执行。

WinHttpCloseHandle 文档说:

HINTERNET应用程序可以通过关闭请求句柄来终止正在进行的同步或异步请求WinHttpCloseHandle

但是,后来相同的文档似乎与此相矛盾。它说:

应用程序永远不应该WinHttpCloseHandle调用同步请求。这可能会产生竞争条件。

我发现这篇博客文章似乎同意我不能打电话WinHttpCloseHandle

我想知道如何取消此操作以便我的服务可以正常停止?我真的不能等待WinHttpSendRequest自然超时,因为它花费的时间太长,而且我的服务停止得不够快。我认为 Windows 将此报告为错误,然后在关闭时强制终止该服务。

一个想法将不胜感激。

winapi winhttp

6
推荐指数
1
解决办法
2719
查看次数

WinInet vs WinHttp(服务或类似服务的过程)

我无法理解这两个概念"服务或类似服务的过程"之间的区别.

在msdn WinHTTP与WinINet页面上说:

在两者之间进行选择时,您应该使用WinINet,除非您计划在需要模拟和会话隔离的服务或类似服务的过程中运行.

在msdn注意WinInet函数说:

注意WinINet不支持服务器实现.此外,它不应该从服务中使用.对于服务器实现或服务,请使用Microsoft Windows HTTP服务(WinHTTP).

"需要假冒和会话隔离的服务或类似服务的流程"是什么意思?
"WinINet不支持服务器实现"是指在Windows Server上运行?
如果我的应用程序运行IIS我是否使用WinHTTP而不是WinInet?

windows wininet winhttp visual-c++

6
推荐指数
1
解决办法
4901
查看次数

从WinHTTP中的CRYPT_BIT_BLOB获取RSA公钥?

我正在尝试在WinHTTP中获取RSA公钥信息。到目前为止,我已经在CERT_CONTEXT结构中获得了证书信息。我可以获得加密算法和其他算法,如下所示:

PCCERT_CONTEXT cert;
DWORD certLen = sizeof(PCCERT_CONTEXT);
WinHttpQueryOption(hRequest, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert, &certLen);
Run Code Online (Sandbox Code Playgroud)

加密算法由

LPSTR pubKeyAlgo = cert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId;
Run Code Online (Sandbox Code Playgroud)

我们可能会如下获得公钥:

CRYPT_BIT_BLOB pubKey = cert->pCertInfo->SubjectPublicKeyInfo.PublicKey;
BYTE *p = pKey.pbData;
Run Code Online (Sandbox Code Playgroud)

但是根据文档,这是一种编码形式:

公钥

包含已编码的公钥的BLOB。

那么如何获得实际的RSA公钥参数(例如模数和指数)呢?

c++ encryption rsa winhttp wincrypt

6
推荐指数
1
解决办法
834
查看次数

是否有在 Windows 上的 C 中使用 winhttp 的完整示例?

我可以在 C++ 中找到大量示例,但没有任何仅用 C 编写的示例。我正在尝试连接到 http 服务器,下载返回的数据,然后将其保存到文件中。在 Windows 上有更好的方法吗?我不应该使用 WinHttp 或 WinInet 吗?互联网上似乎非常缺乏 C 的 Windows 文档。感谢您的帮助。

c windows winhttp

5
推荐指数
1
解决办法
8740
查看次数

多线程WinHttp下载

我正在创建一个Delphi应用程序来从Internet下载文件,如果服务器支持范围请求它将是多线程的.进度也被转发回GUI.

当前的软件模型使用TThread组件.GUI调用a TDownloadThread然后生成TDownloadPartThreads- 这些是实际通过'WinHttp'进行下载的线程.

我的问题:CPU已用完,即使只下载4个线程的下载.

我的假设原因:

  1. 我每8192字节写一次目标文件,想知道在写入一个块之前是否应该缓冲它?
  2. 线程通信是通过Synchronize(MainForm.UpdateProgress(Downloaded, TotalSize))我听到的AWFUL来完成的,也许我应该在线程之间共享一个对象,这样我可以使用主窗体上的计时器来访问它,以更新进度?

我的解决方案

  1. 交错文件写入只写每个x字节.

  2. 更新TThread要使用的组件,OmniThreadLibrary并以某种方式将数据发送回主表单.TDownloadPart然后,每个线程将成为一个IOmniWorker并通过与主表单共享对象来发回其进度.然后,主窗体将使用计时器来更新其进度,如:ProgressBar1.Position := sharedDataObject.Progress;

希望有人可以指出我正确的方向!

delphi multithreading winhttp omnithreadlibrary

5
推荐指数
1
解决办法
1235
查看次数

如何使 WinHttpCrackUrl 在 64 位下工作

我有 Visual Basic for Applications 代码,它WinHttp可以在 32 位 Windows XP 上运行的 32 位 Office 2010 上完美地使用和运行。相同的代码无法在 64 位 Windows 8 上的 64 位 Office 2013 上正常运行,即使它编译正常。

问题是WinHttpCrackUrl()在 Windows 8 上返回错误 87“参数不正确”。

我已经双重检查和三重检查所有指针都在代码中适当地声明为 LongPtr 。我究竟做错了什么?

这是在 32 位 Excel/Windows 上运行良好,但无法在 64 位 Excel/Windows 上运行的代码:

Private Type URL_COMPONENTS
    dwStructSize      As Long
    lpszScheme        As LongPtr
    dwSchemeLength    As Long
    nScheme           As Long
    lpszHostName      As LongPtr
    dwHostNameLength  As Long
    nPort             As Long
    lpszUserName      As LongPtr
    dwUserNameLength  As Long
    lpszPassword      As LongPtr …
Run Code Online (Sandbox Code Playgroud)

windows excel 64-bit vba winhttp

5
推荐指数
1
解决办法
867
查看次数

上传文件时出现 WinHTTP 问题

在花了几天的时间把我的头撞到墙上后,我想我会在这里问。

下面代码的问题是我基本上是在迭代一个目录,将文件上传到那里。所有文件都很小,大约 1KB,所以这不是大小问题。第一次上传就像一个魅力,所有后续调用都被 winhttp 中断,只发送标题。

这是代码:

BOOL NetworkManager::UploadFileToServer(wchar_t *pszURL, wchar_t *pszFilePath, wchar_t *_pszProxyAddress, wchar_t *pszServerAddress)
{
HINTERNET  hSession = NULL, 
hConnect = NULL,
hRequest = NULL;
BOOL bResults;
DWORD dwSize = 0;
DWORD dwContentLength = 0;
LPCWSTR pszProxyAddress = 0;
wchar_t wszContentLength[256] = { 0 };

pszProxyAddress = _pszProxyAddress;

printf("Trying to send %S\r\n", pszFilePath);

if(pszProxyAddress != NULL && wcslen(pszProxyAddress) < 4)
{
    pszProxyAddress = NULL;
}

HANDLE hFile = CreateFile(pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

if(hFile == INVALID_HANDLE_VALUE)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ winhttp visual-c++

5
推荐指数
1
解决办法
4798
查看次数

WinHttp 异步超时问题

我正在尝试使用 WinHTTP C++/Windows API 来连接到多个 Http 服务器。在切换到 WinHTTP 之前,我尝试以异步方式使用 HttpClient C# 4.5,但是我没有获得高吞吐量并且 CPU 太高。

在 WinHTTP 上,单个请求不应超过 100 毫秒;但是我注意到,当使用 WinHTTPSSetTimeouts 时,即使将超时设置为 10 毫秒也没有任何影响,对同一台机器上的端口的单个请求仍然需要 15-30 毫秒,并且当连接到没有主体侦听的端口时,请求最多需要1000 毫秒,因此,我得出结论超时不起作用。

此外,我注意到在同一台机器上触发 GET 请求所需的时间需要 15-30 毫秒,与需要 2-7 毫秒的 .NET 相比,这太高了...

我还尝试将连接/接收/发送超时设置为 1 秒,但 4 秒后接收操作超时。

您是否知道如何解决超时以及为什么单个请求需要时间。

c++ winhttp

5
推荐指数
0
解决办法
693
查看次数

如何使用带有“传输编码:分块”的 winhttp api

我正在尝试将一些数据发送到需要“传输编码:分块”标头的 Web 服务。它适用于普通的 POST 请求。但是一旦我添加标题,我总是得到:

由于以下情况,无法传送内容:收到来自客户端的无效请求

这是发送请求的部分:

std::vector<std::wstring> m_headers;
m_headers.push_back(TEXT("Transfer-encoding: chunked"));
std::wstring m_verb(TEXT("POST"));
std::vector<unsigned __int8> m_payload;

HINTERNET m_connectionHandle = WinHttpConnect(m_http->getSessionHandle(), hostName.c_str(), m_urlParts.nPort, 0);
if (!m_connectionHandle) {
    std::cout << "InternetConnect failed: " << GetLastError() << std::endl;
    return;
}

__int32 requestFlags = WINHTTP_FLAG_SECURE | WINHTTP_FLAG_REFRESH;
HINTERNET m_requestHandle = WinHttpOpenRequest(m_connectionHandle, m_verb.c_str(), (path + extra).c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, requestFlags);
if(!m_requestHandle) {
    std::cout << "HttpOpenRequest failed: " << GetLastError() << std::endl;
    return;
}

for(auto header : m_headers) {
    if(!WinHttpAddRequestHeaders(m_requestHandle, (header + TEXT("\r\n")).c_str(), -1, WINHTTP_ADDREQ_FLAG_ADD)) { …
Run Code Online (Sandbox Code Playgroud)

c++ winhttp chunked transfer-encoding

5
推荐指数
1
解决办法
1035
查看次数