////////////////////////////////////////////////////////////////////////////////////// // W2K TIF files import support // #include "stdafx.h" #include #include #include // LinkWindow control #define __FILE_ID__ 75 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #ifdef UNICODE #define WM_IMPORT_PROGRESS_INC WM_APP + 3 // Increment Import progress bar #define WM_IMPORT_SET_FILE_COUNT WM_APP + 4 // Set the file number to import extern CClientConsoleApp theApp; // // Structure passed to the ImportArchiveFolder thread // struct ImportFolderParam { LPCWSTR cszImportFolder; // Import folder name BOOL bSentItems; // TRUE if the folder contains outbound faxes HWND hImportDlg; // Handle to the Import progress dialog BOOL bCancel; // TRUE if the Cancel button has been pressed }; DWORD ImportArchiveFile( LPCWSTR pszFile, LPWSTR pszArchiveFolder, BOOL bSentItems, WCHAR* pszUserSid, DWORDLONG* pdwlUniqueId ) /*++ Routine name : ImportArchiveFile Routine description: Imports pszFile file to the pszArchiveFolder folder. The pszFile should be generated by W2K MS Fax Arguments: pszFile - [in] Imported file name pszArchiveFolder - [in] MS Fax archive folder name bSentItems - [in] TRUE if the file from the sent archive, FALSE if it from receive one pszUserSid - [in] The user string SID, can be NULL if(bSentItems == FALSE) pdwlUniqueId - [out] Unique id for the file Return Value: Standard Win32 error code --*/ { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("ImportArchive"), dwRes); WCHAR* pszFileExt = FAX_TIF_FILE_EXT; WCHAR szArchFile[MAX_PATH] = {0}; MS_TAG_INFO msTags = {0}; // // Generate unique file name in the archive folder // *pdwlUniqueId = GenerateUniqueFileName(pszArchiveFolder, pszFileExt, szArchFile, ARR_SIZE(szArchFile)); if(*pdwlUniqueId == 0) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("GenerateUniqueFileName"), dwRes); goto exit; } if(bSentItems) { // // Add user user SID to the file name for the outbound archive // // Delete generated file without the user SID in the name // if(!DeleteFile(szArchFile)) { CALL_FAIL (GENERAL_ERR, TEXT ("DeleteFile"), GetLastError()); } // // Add the user SID to the file name // if (_sntprintf(szArchFile, ARR_SIZE(szArchFile) -1, TEXT("%s\\%s$%I64X%s"), pszArchiveFolder, pszUserSid, *pdwlUniqueId, FAX_TIF_FILE_DOT_EXT) < 0) { dwRes = ERROR_BUFFER_OVERFLOW; CALL_FAIL (GENERAL_ERR, TEXT ("Insufficient szArchFile buffer"), dwRes); goto exit; } } if(!CopyFile(pszFile, szArchFile, FALSE)) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("CopyFile"), dwRes); goto exit; } // // Read W2K MS TIF tags from the file // dwRes = GetW2kMsTiffTags(szArchFile, &msTags, bSentItems); if(ERROR_SUCCESS == dwRes) { // // Add new (XP) MS TIF tags to the file // if(!TiffAddMsTags(szArchFile, &msTags, bSentItems)) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("TiffAddMsTags"), dwRes); if(!DeleteFile(szArchFile)) { CALL_FAIL (GENERAL_ERR, TEXT ("DeleteFile"), GetLastError()); } goto exit; } } else if(ERROR_XP_TIF_FILE_FORMAT == dwRes) { // // The TIF file already has new (XP) TIF tags // dwRes = ERROR_SUCCESS; } else { // // The tiff file was not created by MS fax // if(!DeleteFile(szArchFile)) { CALL_FAIL (GENERAL_ERR, TEXT ("DeleteFile"), GetLastError()); } } exit: FreeMsTagInfo(&msTags); return dwRes; } // ImportArchiveFile DWORD WINAPI ImportArchiveFolder( LPVOID lpParameter // thread data ) /*++ Routine name : ImportArchiveFolder Routine description: Imports fax (tif) files from the cstrImportFolder folder to the MS Fax archive. Returns ERROR_FILE_NOT_FOUND if the folder does not contain TIF files Arguments: lpParameter - [in] pointer to ImportFolderParam structure Return Value: Standard Win32 error code --*/ { ImportFolderParam* pParam = (ImportFolderParam*)lpParameter; DWORD dwRes = ERROR_SUCCESS; DWORD dwError; int nRes; WCHAR szFindMask[MAX_PATH] = {0}; WCHAR szImportFile[MAX_PATH] = {0}; WIN32_FIND_DATA findData = {0}; HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hFax = NULL; PFAX_ARCHIVE_CONFIG pArchiveCfg = NULL; PSID pUserSid = NULL; WCHAR* pszUserSid = NULL; DWORDLONG dwlUniqueId; DWORD dwFileCount = 0; DWORD dwNotifyMsgID = 0; // Windows message id used for notification HMODULE hAdvapi32 = NULL; BOOL (*pfConvertSidToStringSid)(PSID, LPTSTR*) = NULL; // pointer to ConvertSidToStringSid() DBG_ENTER(TEXT("ImportFolderThread"), dwRes); if(!IsWinXPOS()) { // // The Import functionality supported on XP OS only // ASSERTION_FAILURE; return ERROR_CALL_NOT_IMPLEMENTED; } // // ConvertSidToStringSid() Requires Windows 2000 or later, so we connect to it dynamically // hAdvapi32 = LoadLibrary(TEXT("advapi32.dll")); if(!hAdvapi32) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("LoadLibrary(advapi32.dll)"), dwRes); goto exit; } (FARPROC&)pfConvertSidToStringSid = GetProcAddress(hAdvapi32, "ConvertSidToStringSidW"); if(!pfConvertSidToStringSid) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("GetProcAddress(ConvertSidToStringSid)"), dwRes); goto exit; } // // Compose find mask: path\*.tif // _snwprintf(szFindMask, MAX_PATH-1, TEXT("%s\\%s"), pParam->cszImportFolder, FAX_TIF_FILE_MASK); // // Count TIF files in the pParam->cszImportFolder folder // // Find the first tif file in the cstrImportFolder // hFile = FindFirstFile(szFindMask, &findData); if(INVALID_HANDLE_VALUE == hFile) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("FindFirstFile"), dwRes); goto exit; } dwFileCount = 1; for(;;) { // // Find Next File // if(!FindNextFile(hFile, &findData)) { dwError = GetLastError(); if(ERROR_NO_MORE_FILES != dwError) { dwRes = dwError; CALL_FAIL (GENERAL_ERR, TEXT ("FindNextFile"), dwRes); } break; } dwFileCount += 1; } if(INVALID_HANDLE_VALUE != hFile) { FindClose(hFile); } if(pParam->hImportDlg) { // // Set progress bar range // SendMessage(pParam->hImportDlg, WM_IMPORT_SET_FILE_COUNT, dwFileCount, 0); } // // Find the first tif file in the cstrImportFolder // hFile = FindFirstFile(szFindMask, &findData); if(INVALID_HANDLE_VALUE == hFile) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("FindFirstFile"), dwRes); goto exit; } // // Get fax server archive configuration // if(!FaxConnectFaxServer(NULL, &hFax)) { dwRes = GetLastError(); CALL_FAIL (RPC_ERR, TEXT ("FaxConnectFaxServer"), dwRes); goto exit; } // // Get pointer to the Client Console archive folder // if(theApp.m_pMainWnd) { CClientConsoleDoc* pDoc = NULL; pDoc = (CClientConsoleDoc*)((CFrameWnd*)theApp.m_pMainWnd)->GetActiveDocument(); if(pDoc) { // // find local fax server // CServerNode* pServer = NULL; pServer = pDoc->FindServerByName(NULL); if(pServer) { // // Get archive folder // CFolder* pFolder = NULL; pFolder = pServer->GetFolder(pParam->bSentItems ? FOLDER_TYPE_SENT_ITEMS : FOLDER_TYPE_INBOX); if(pFolder && pFolder->IsValid()) { dwNotifyMsgID = pServer->GetNotifyMsgID(); } } } } // // Access check // DWORD dwAccessRights; if (!FaxAccessCheckEx(hFax, pParam->bSentItems ? FAX_ACCESS_MANAGE_OUT_ARCHIVE : FAX_ACCESS_MANAGE_IN_ARCHIVE, &dwAccessRights)) { dwRes = GetLastError(); CALL_FAIL (RPC_ERR, TEXT ("FaxAccessCheckEx"), dwRes); AlignedAfxMessageBox(IDS_IMPORT_NO_ACCESS, MB_OK | MB_ICONSTOP | MB_APPLMODAL); goto exit; } if(!FaxGetArchiveConfiguration(hFax, pParam->bSentItems ? FAX_MESSAGE_FOLDER_SENTITEMS : FAX_MESSAGE_FOLDER_INBOX, &pArchiveCfg)) { dwRes = GetLastError(); CALL_FAIL (RPC_ERR, TEXT ("FaxGetArchiveConfiguration"), dwRes); goto exit; } BOOL bSameDir = FALSE; if ((dwRes = CheckToSeeIfSameDir((LPTSTR)pArchiveCfg->lpcstrFolder,(LPTSTR)pParam->cszImportFolder,&bSameDir)) != ERROR_SUCCESS) { CALL_FAIL (RPC_ERR, TEXT ("CheckToSeeIfSameDir"), dwRes); goto exit; } if (bSameDir) { AlignedAfxMessageBox(pParam->bSentItems ? IDS_IMPORT_SAME_DIR_SENT : IDS_IMPORT_SAME_DIR_INBOX , MB_OK | MB_ICONSTOP | MB_APPLMODAL); goto exit; } if(pParam->bSentItems) { // // Get the user string SID for the outbound archive // pUserSid = GetCurrentThreadSID(); if (!pUserSid) { dwRes = GetLastError (); CALL_FAIL (GENERAL_ERR, TEXT ("GetCurrentThreadSID"), dwRes); goto exit; } if (!pfConvertSidToStringSid(pUserSid, &pszUserSid)) { dwRes = GetLastError (); CALL_FAIL (GENERAL_ERR, TEXT ("ConvertSidToStringSid"), dwRes); goto exit; } } while(!pParam->bCancel) { // // Compose full path // _snwprintf(szImportFile, MAX_PATH-1, TEXT("%s\\%s\0"), pParam->cszImportFolder, findData.cFileName); nRes = IDOK; do { // // Import the file // dwError = ImportArchiveFile(szImportFile, pArchiveCfg->lpcstrFolder, pParam->bSentItems, pszUserSid, &dwlUniqueId); if(ERROR_SUCCESS != dwError) { CALL_FAIL (GENERAL_ERR, TEXT ("ImportArchiveFile"), dwRes); // // Popup "Cancel, Try Again, Continue" dialog // DWORD dwResId = IDS_IMPORT_ERROR; WCHAR szFormat[MAX_PATH] = {0}; WCHAR szMsg[MAX_PATH] = {0}; if(ERROR_BAD_FORMAT == dwError) { dwResId = IDS_IMPORT_BAD_FORMAT; } else if(ERROR_XP_TIF_WITH_WRONG_ARCHIVE_TYPE == dwError) { dwResId = pParam->bSentItems ? IDS_IMPORT_FILE_NOT_SEND_TYPE : IDS_IMPORT_FILE_NOT_RECEIVE_TYPE; } if(LoadString(GetResourceHandle(), dwResId, szFormat, ARR_SIZE(szFormat))) { _snwprintf(szMsg, MAX_PATH-1, szFormat, findData.cFileName); nRes = AlignedAfxMessageBox(szMsg, MB_CANCELTRYCONTINUE | MB_ICONSTOP | MB_APPLMODAL); if(IDCANCEL == nRes) { pParam->bCancel = TRUE; } } else { CALL_FAIL (GENERAL_ERR, TEXT ("LoadString(IDS_IMPORT_ERROR)"), GetLastError()); } } } while(nRes == IDTRYAGAIN); if(dwNotifyMsgID) { // // Add the message to the archive folder // We simulate the server notification handled by the application main thread // The notification handler should free the event data // FAX_EVENT_EX* pEvent = (FAX_EVENT_EX*)MemAlloc(sizeof(FAX_EVENT_EX)); if(!pEvent) { dwRes = ERROR_NOT_ENOUGH_MEMORY; CALL_FAIL (GENERAL_ERR, TEXT ("MemAlloc"), dwRes); goto exit; } ZeroMemory(pEvent, sizeof(FAX_EVENT_EX)); pEvent->dwSizeOfStruct = sizeof(FAX_EVENT_EX); pEvent->EventType = pParam->bSentItems ? FAX_EVENT_TYPE_OUT_ARCHIVE : FAX_EVENT_TYPE_IN_ARCHIVE; pEvent->EventInfo.JobInfo.Type = FAX_JOB_EVENT_TYPE_ADDED; pEvent->EventInfo.JobInfo.dwlMessageId = dwlUniqueId; theApp.m_pMainWnd->SendMessage(dwNotifyMsgID, 0, (LPARAM)pEvent); } if(pParam->hImportDlg) { // // Increment progress bar // SendMessage(pParam->hImportDlg, WM_IMPORT_PROGRESS_INC, 0, 0); } // // Find Next File // if(!FindNextFile(hFile, &findData)) { dwError = GetLastError(); if(ERROR_NO_MORE_FILES != dwError) { dwRes = dwError; CALL_FAIL (GENERAL_ERR, TEXT ("FindNextFile"), dwRes); } break; } } // while // // Notify the fax service // if(!FaxRefreshArchive(hFax, pParam->bSentItems ? FAX_MESSAGE_FOLDER_SENTITEMS : FAX_MESSAGE_FOLDER_INBOX)) { dwRes = GetLastError(); CALL_FAIL (GENERAL_ERR, TEXT ("FaxArchiveMessageAdded"), dwRes); } exit: if(pParam->hImportDlg) { // // Close the Progress dialog // SendMessage(pParam->hImportDlg, WM_CLOSE, 0, 0); } if(0 == dwFileCount) { // // The folder does not contain faxes // AlignedAfxMessageBox(IDS_IMPORT_EMPTY_FOLDER, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); } if(INVALID_HANDLE_VALUE != hFile) { FindClose(hFile); } if(pArchiveCfg) { FaxFreeBuffer(pArchiveCfg); } if(hFax) { FaxClose(hFax); } if(pUserSid) { MemFree(pUserSid); } if(pszUserSid) { LocalFree(pszUserSid); } if(hAdvapi32) { FreeLibrary(hAdvapi32); } return dwRes; } // ImportArchiveFolder INT_PTR CALLBACK ImportDlgProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) /*++ Routine description: Import fax dialog procedure Arguments: HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter Return Value: return TRUE if it processed the message --*/ { static ImportFolderParam* pIpmParam = NULL; static DWORD dwFileCount; // The number of the files to import static DWORD dwCurrentFile; // The number of the currently imported file switch ( uMsg ) { case WM_INITDIALOG: { HANDLE hImportThread = NULL; pIpmParam = (ImportFolderParam*)lParam; TCHAR szFolder[MAX_PATH] = {0}; DBG_ENTER(TEXT("ImportDlgProc(WM_INITDIALOG)")); dwFileCount = 0; dwCurrentFile = 0; // // Set import folder name // if(LoadString(GetResourceHandle(), pIpmParam->bSentItems ? IDS_IMPORT_TO_SENT_ITEMS : IDS_IMPORT_TO_INBOX, szFolder, ARR_SIZE(szFolder))) { SetDlgItemText(hwndDlg, IDC_PROGRESS_TITLE, szFolder); } else { CALL_FAIL (GENERAL_ERR, TEXT ("LoadString() for IDC_PROGRESS_TITLE"), GetLastError()); } pIpmParam->hImportDlg = hwndDlg; hImportThread = CreateThread(NULL, // SD 0, // initial stack size ImportArchiveFolder, // thread function (LPVOID)pIpmParam, // thread argument 0, // creation option NULL); // thread identifier if(!hImportThread) { CALL_FAIL (GENERAL_ERR, TEXT ("CreateThread"), GetLastError()); } else { CloseHandle(hImportThread); } return TRUE; } case WM_IMPORT_PROGRESS_INC: { // // Increment progress bar // SendDlgItemMessage(hwndDlg, IDC_PROGRESS_BAR, PBM_STEPIT, 0, 0); // // Compose and set currently imported fax number // ++dwCurrentFile; TCHAR szFormat[MAX_PATH] = {0}; TCHAR szText[MAX_PATH] = {0}; DWORD dwParam[2]; DBG_ENTER(TEXT("ImportDlgProc(WM_IMPORT_PROGRESS_INC)")); dwParam[0] = dwCurrentFile; dwParam[1] = dwFileCount; if(!LoadString(GetResourceHandle(), IDS_PROGRESS_NUMBER, szFormat, ARR_SIZE(szFormat))) { CALL_FAIL (GENERAL_ERR, TEXT ("LoadString(IDS_PROGRESS_NUMBER)"), GetLastError()); return TRUE; } if(FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, (LPCVOID)szFormat, 0, 0, szText, ARR_SIZE(szText), (va_list*)dwParam)) { SetDlgItemText(hwndDlg, IDC_PROGRESS_NUMBER, szText); } return TRUE; } case WM_IMPORT_SET_FILE_COUNT: // // Set the pange and step of the proggress bar // dwFileCount = wParam; dwCurrentFile = 1; SendDlgItemMessage(hwndDlg, IDC_PROGRESS_BAR, PBM_SETRANGE32, 0, dwFileCount); SendDlgItemMessage(hwndDlg, IDC_PROGRESS_BAR, PBM_SETSTEP, 1, 0); return TRUE; case WM_CLOSE: EndDialog(hwndDlg, IDCANCEL); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDCANCEL: // // Mark cancel, don't close the dialog // pIpmParam->bCancel = TRUE; EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE); return TRUE; } break; } // switch ( uMsg ) return FALSE; } // ImportDlgProc DWORD ImportArchiveFolderUI( LPCWSTR cstrImportFolder, BOOL bSentItems, HWND hWnd ) /*++ Routine name : ImportArchiveFolderUI Routine description: Opens the Import Progress dialog Arguments: cstrImportFolder - [in] Import folder name bSentItems - [in] TRUE if the folder is the sent archive, FALSE if it is receive one hWnd - [in] Parent window Return Value: Standard Win32 error code --*/ { DWORD dwRes = ERROR_SUCCESS; ImportFolderParam impParam = {0}; impParam.cszImportFolder = cstrImportFolder; impParam.bSentItems = bSentItems; DBG_ENTER(TEXT("ImportArchiveFolderUI"), dwRes); DialogBoxParam(GetResourceHandle(), // handle to module MAKEINTRESOURCE(IDD_FAX_PROGRESS), // dialog box template hWnd, // handle to owner window ImportDlgProc, // dialog box procedure (LPARAM)&impParam); // initialization value return dwRes; } // ImportArchiveFolderUI BOOL IsFaxArchive( WCHAR* szFolder ) /*++ Routine name : IsFaxArchive Routine description: Determine if the folder contains at least one TIF file Arguments: szFolder - [in] folder name Return Value: TRUE if if the folder contains at least one TIF file FALSE otherwise --*/ { WCHAR szFindMask[MAX_PATH] = {0}; WIN32_FIND_DATA findData = {0}; HANDLE hFile = INVALID_HANDLE_VALUE; DBG_ENTER(TEXT("IsFaxArchive")); // // Compose find mask: path\*.tif // _snwprintf(szFindMask, MAX_PATH-1, TEXT("%s\\%s"), szFolder, FAX_TIF_FILE_MASK); // // Find the first tif file in the cstrImportFolder // hFile = FindFirstFile(szFindMask, &findData); if(INVALID_HANDLE_VALUE == hFile) { CALL_FAIL (GENERAL_ERR, TEXT ("FindFirstFile"), GetLastError()); return FALSE; } FindClose(hFile); return TRUE; } INT_PTR CALLBACK ImportInfoDlgProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) /*++ Routine description: Import information fax dialog procedure Arguments: HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter Return Value: return TRUE if it processed the message --*/ { switch (uMsg) { case WM_INITDIALOG: // // Set focus on the OK button // SetFocus(GetDlgItem(hwndDlg, IDOK)); return FALSE; case WM_NOTIFY : { LPNMHDR lpnm = (LPNMHDR) lParam; if(((NM_CLICK == lpnm->code) || (NM_RETURN == lpnm->code)) && lpnm->idFrom == IDC_IMPORT_HELP_LINK) { // // Display import help // HtmlHelpTopic(hwndDlg, FAX_HELP_IMPORT); return TRUE; } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: EndDialog(hwndDlg, IDOK); return TRUE; } break; } return FALSE; } // ImportInfoDlgProc DWORD DetectImportFiles() /*++ Routine name : DetectImportFiles Routine description: Determine if the system has W2K fax archives. If yes warning dialog will be displayed for the first time. Return Value: Standard Win32 error code --*/ { DWORD dwRes = ERROR_SUCCESS; HKEY hRegKey; DWORD dwImportWrn = 0; // 1 if the import warning has been displayed WCHAR* pszInbox = NULL; WCHAR* pszSentItems = NULL; DWORD dwSize = 0; BOOL bHaveFax = FALSE; // TRUE if the archives contain at least one TIF file DBG_ENTER(TEXT("DetectImportFiles"), dwRes); if(!IsWinXPOS()) { return dwRes; } // // Check if the Import warning has been displayed // if ((hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, TRUE, KEY_ALL_ACCESS))) { dwImportWrn = GetRegistryDword(hRegKey, REGVAL_IMPORT_INFO); if(!dwImportWrn) { SetRegistryDword(hRegKey, REGVAL_IMPORT_INFO, TRUE); } RegCloseKey(hRegKey); } else { CALL_FAIL (GENERAL_ERR, TEXT ("OpenRegistryKey"), GetLastError()); } if(dwImportWrn) { // // Import warning has been displayed // return dwRes; } // // Read W2K archives location // if (!(hRegKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, REGKEY_FAX_SETUP, TRUE, KEY_QUERY_VALUE))) { CALL_FAIL (GENERAL_ERR, TEXT ("OpenRegistryKey"), GetLastError()); return dwRes; } pszInbox = GetRegistryStringMultiSz(hRegKey, REGVAL_W2K_INBOX, NULL, &dwSize); pszSentItems = GetRegistryString(hRegKey, REGVAL_W2K_SENT_ITEMS, NULL); RegCloseKey(hRegKey); // // Determine if the archives have at least one TIF file // bHaveFax = IsFaxArchive(pszSentItems); WCHAR* pszFolder = pszInbox; while(!bHaveFax && pszFolder && *pszFolder) { // // Walk though the multiline pszInbox string // bHaveFax = IsFaxArchive(pszFolder); pszFolder = _wcsninc(pszFolder, wcslen(pszFolder)+1); } MemFree(pszInbox); MemFree(pszSentItems); if(bHaveFax) { if(!LinkWindow_RegisterClass()) { dwRes = ERROR_CAN_NOT_COMPLETE; CALL_FAIL (GENERAL_ERR, TEXT ("LinkWindow_RegisterClass"), dwRes); return dwRes; } DialogBoxParam(GetResourceHandle(), // handle to module MAKEINTRESOURCE(IDD_IMPORT_INFO), // dialog box template theApp.m_pMainWnd->m_hWnd, // handle to owner window ImportInfoDlgProc, // dialog box procedure NULL); // initialization value LinkWindow_UnregisterClass(theApp.m_hInstance); } return dwRes; } #endif //UNICODE