关于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 进程不能设置为前台窗口,还会闪烁的任务栏按钮。
贴一下代码。
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
在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