2013-05-03 58 views
0

比方說,我有一個使用異步WinInet的非常簡單的小的代碼示例:訪問衝突在異步模式下使用FtpFindFirstFile Unicode版本

#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和callstack處於相當混亂的地方。

但是,如果我改變

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方面失敗?

我使用Visual Studio 2012 btw在Windows 7上測試它。

+0

您應該說您是使用Unicode(16位字符)模式還是ANSI(8位字符)模式編譯。同樣,如果我的'如果我改變'位從'FtpFindFirstFileW'改變爲首先引用到'FtpFindFirstFile'的函數,所以其中之一是一個錯誤。 – Bryan 2014-03-03 14:15:02

+0

@Bryan很明顯,我是在Unicode模式下構建的,所以它都是關於'FtpFindFirstFileW'的。 – Predelnik 2014-03-03 14:19:08

回答

0

我建議改變編譯器設置字符集從Unicode到多字節字符集。同樣的事情發生在我身上。

1

我也有FtpFindFirstFileW困難。當我將我的項目從MBCS轉換爲Unicode時,FtpFindFirstFileW導致訪問衝突,該衝突似乎是調用後某處0xbaadf00d的指針取消引用,可能是在準備異步結果時。我通過在MBCS和Unicode版本中使用FtpFindFirstFileA,InternetFindNextFileA和WIN32_FIND_DATAA結構來解決此問題。然後我將輸出cFileName字段轉換爲TCHAR字符串。

+0

是的,看起來這是來自Miscrosoft的錯誤)然後,我已經放棄使用異步WinInet這個東西完全是因爲缺乏良好的文檔,我只是無法弄清楚一些事情。 – Predelnik 2014-03-03 14:23:04

+0

我正在將多個項目從MBCS移動到Unicode,並且我不想重寫在MBCS版本中正常工作的異步FTP客戶端代碼。這種解決方法對我來說是一個不太具有破壞性的選擇。當我在7年前寫下這篇文章時,我已經完成了所有這些工作,而且我不想再這麼做了...... – 2014-03-03 15:06:30