gpt4 book ai didi

c++ - 在异步模式下使用 FtpFindFirstFile unicode 版本的访问冲突

转载 作者:行者123 更新时间:2023-11-28 07:38:03 29 4
gpt4 key购买 nike

假设我有一个使用异步 WinInet 的非常简单的小代码示例:

#include "stdafx.h"
#include "WinInet.h"
#pragma comment(lib, "wininet.lib")

DWORD LatestResult = 0;
HANDLE MayContinue = 0;

VOID CALLBACK
CallBack(
__in HINTERNET hInternet,
__in DWORD_PTR dwContext,
__in DWORD dwInternetStatus,
__in_bcount(dwStatusInformationLength) LPVOID lpvStatusInformation,
__in DWORD dwStatusInformationLength
)
{
if (dwInternetStatus == INTERNET_STATUS_REQUEST_COMPLETE)
{
LatestResult = ((LPINTERNET_ASYNC_RESULT)lpvStatusInformation)->dwResult;
SetEvent (MayContinue);
}
}

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
MayContinue = ::CreateEvent (NULL, FALSE, FALSE, NULL);
HINTERNET Session = InternetOpen (NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
INTERNET_STATUS_CALLBACK CallbackPointer = InternetSetStatusCallback (Session, (INTERNET_STATUS_CALLBACK) CallBack);

MayContinue = ::CreateEvent (NULL, FALSE, FALSE, NULL);
InternetConnect (Session, _T ("ftp.secureftp-test.com"), INTERNET_INVALID_PORT_NUMBER, _T ("test"), _T ("test"), INTERNET_SERVICE_FTP, 0, 1);

WaitForSingleObject (MayContinue, INFINITE);
HINTERNET Internet = (HINTERNET) LatestResult;

WIN32_FIND_DATA *FindData = new WIN32_FIND_DATA;
FtpFindFirstFileW (Internet, _T ("*.*"), FindData, 0, 1);
WaitForSingleObject (MayContinue, INFINITE);
delete FindData;
return 0;
}

执行后得到的结果:

Unhandled exception at 0xBAADF00D in WinInetTest.exe: 
0xC0000005: Access violation executing location 0xBAADF00D.

它发生在最终 WaitForSingleObject 附近的某个地方,调用堆栈相当困惑。

但是如果我改变

WIN32_FIND_DATA *FindData = new WIN32_FIND_DATA;
FtpFindFirstFileW (Internet, _T ("*.*"), FindData, 0, 1);

WIN32_FIND_DATAA *FindData = new WIN32_FIND_DATAA;
FtpFindFirstFileA (Internet, "*.*", FindData, 0, 1);

它按预期执行和工作。所以我的问题是 - 我真的没有做正确的事情还是只是在 WinInet 方面失败了?

顺便说一句,我正在 Windows 7 上使用 Visual Studio 2012 对其进行测试。

最佳答案

我在使用 FtpFindFirstFileW 时也遇到了困难。当我将我的项目从 MBCS 转换为 Unicode 时,FtpFindFirstFileW 导致访问冲突,这似乎是调用后某处对 0xbaadf00d 的指针取消引用,可能是在准备异步结果时。我通过在 MBCS 和 Unicode 构建中使用 FtpFindFirstFileA、InternetFindNextFileA 和 WIN32_FIND_DATAA 结构来解决这个问题。然后,我将输出的 cFileName 字段转换为 TCHAR 字符串。

关于c++ - 在异步模式下使用 FtpFindFirstFile unicode 版本的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358536/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com