关于32位程序移植到64位系统中产生的一个有关问题

关于32位程序移植到64位系统中产生的一个问题?
在windows32的程序中,一个虚拟打印的程序。就是一个DLL,文档开启打印的时候会调用该DLL,弹出一个另存为对话框。
另存为对话框是在 该DLL中实现的。
但是在安装在windows 7 64位系统中,该另存为对话框弹不出来,
http://support.microsoft.com/kb/2567869/zh-cn


打印机驱动程序实现为加载到正在打印进程的动态链接库 (DLL)。打印机驱动程序实现为 64 位版本的 Windows 上的 64 位 Dll。打印机驱动程序作为 32 位版本的 Windows 上的 32 位 Dll 中。

32 位进程无法加载 64 位 Dll。因此,64 位版本的 Windows 支持从 32 位进程通过 Splwow64.exe 过程的打印。Splwow64.exe 是一个可以加载 64 位打印机驱动程序和打印代表 32 位进程的句柄的 64 位进程。

当应用程序调用StartDoc函数,XPS 文档编写器打印机打印时,XPS 文档编写器的打印机驱动程序将显示另存为对话框,以便用户可以指定的名称和位置的 XPS 文件。对话框所有者窗口通常是将调用StartDoc函数,该线程的活动窗口,并在活动窗口的上方将出现对话框。

当一个 32 位应用程序在 64 位版本的 Windows 上调用StartDoc函数时,Splwow64.exe 过程调用中到代表 32-位应用程序的 XPS 文档写入程序打印机驱动程序。在此方案中,另存为对话框处于无主状态,因为 Splwow64.exe 进程中的线程并没有活动窗口。此外,后面因为 Splwow64.exe 进程并没有权限设置为前台窗口打印的应用程序可能会出现对话框。

StartDoc呼叫才会返回在关闭该对话框,以便应用程序似乎停止响应。

" 另存为如果它由 Splwow64.exe 进程创建,对话框有自己的按钮,在 Windows 资源管理器任务栏中。这是因为对话框的无主状态。时 Splwow64.exe 进程不能设置为前台窗口,还会闪烁的任务栏按钮。

贴一下代码。
C/C++ code

         BOOL bRet = FALSE;
    OPENFILENAME ofn;
    TCHAR szBuff[256];
    BOOL bEnSystem = FALSE;
    TCHAR szExt[MAX_PATH];
    int nLen = 0;
    memset(szExt, 0, MAX_PATH);

    if ( hWnd == NULL )
        hWnd = GetTopWindow( NULL );

    

    if (pszFilePath == NULL || cbPath <= 0 || pParam == NULL)
        return FALSE;
    
    if (lstrlen(pszFilePath) > cbPath)
        pszFilePath[0] = 0;
    memset(&ofn,0,sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hInstance = hInst;
    ofn.hwndOwner = hWnd;
    ofn.lpstrFilter = szExt;
    ofn.lpstrCustomFilter = NULL;
    ofn.lpstrFile = pszFilePath;
    ofn.nMaxFile = cbPath;
    ofn.lpstrDefExt = _T("SEP");
    if (bEnSystem)
    {
        ofn.lpstrTitle = _T("Input save filename");
    }
    else
    {
        ofn.lpstrTitle = _T("输入保存文件名");
    }
    ofn.Flags = OFN_EXPLORER|OFN_NOREADONLYRETURN|OFN_NONETWORKBUTTON|OFN_ENABLEHOOK| OFN_ENABLETEMPLATE|
        OFN_ENABLESIZING | OFN_HIDEREADONLY;
    ofn.lpTemplateName = MAKEINTRESOURCE(IDD_GETFILE);
    ofn.lpfnHook = OFNHookProc;

    if( CGlobalSet::GetInstance()->GetParam()->GetPrePath( szBuff ) )
    {
        CutFileName(szBuff);
        ofn.lpstrInitialDir = szBuff;
    }

    lstrcpy(pParam->defstr, _T("NULL"));

    g_pSaveFileParam = pParam;
    g_hThisInstance = hInst;

    bRet = GetSaveFileName(&ofn);           //这里返回值在window7的64位环境下为false
    if (pszFilePath[0] == '\0')
        bRet = FALSE;
/*    if (bRet)
    {
        TCHAR pszTempFilePath[MAX_PATH*2];
        TCHAR *pszTemp = NULL;
        long lattr = 0;
        memset(pszTempFilePath, 0, MAX_PATH*2);//919
        lstrcpy(pszTempFilePath, pszFilePath);
        pszTemp = wcsrchr(pszTempFilePath, '\\');
        pszTemp[0] = '\0';
        pszTemp[1] = '\0';
        MessageBox(NULL, pszTempFilePath, SEPWRITER, MB_OK);//919
        lattr = GetFileAttributes(pszTempFilePath);
        if (lattr&FILE_ATTRIBUTE_READONLY == FILE_ATTRIBUTE_READONLY)
        {
            MessageBox(NULL, _T("目标文件路径为只读属性,不能生成SEP文件"), SEPWRITER, MB_OK);//919
            bRet = FALSE;
        }
    }
*/    
    g_hThisInstance = NULL;
    g_pSaveFileParam = NULL;


windows 7的64位系统下,会产生一个Splwow64.exe 的进程。打印调试时,只能附加到该进程才能调试。
从微软的官方网站 看的资料 Splwow64.exe 过程调用中到代表 32-位应用程序的 XPS 文档写入程序打印机驱动程序。在此方案中,另存为对话框处于无主状态,因为 Splwow64.exe 进程中的线程并没有活动窗口。此外,后面因为 Splwow64.exe 进程并没有权限设置为前台窗口打印的应用程序可能会出现对话框。
而在32位系统中,调试只需要附加在那个文档的进程中。
大家有什么解决方案和思路?能解决这个另存为对话框不能弹出的问题。

------解决方案--------------------
改成64bit的应用程序是否可以.
------解决方案--------------------
设置为兼容模式试试
http://topic.csdn.net/u/20111011/21/7b4a7b00-8975-4900-b9a5-138cfc5574f2.html