首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

旷世难题!该如何解决

2012-01-08 
旷世难题!!!!!!!!!!!!!!!!!!可以不可以请教大家一个关于VC的问题,是我最近的一个工程遇到的麻烦,当程序中

旷世难题!!!!!!!!!!!!!!!!!!
可以不可以请教大家一个关于VC的问题,是我最近的一个工程遇到的麻烦,当   程序中加入了打印功能的话,实现打印后,打开数据库就会出错;如果没有打印的话,打开数据库是不会出错的,所以希望大虾们能指教一下,不胜感激!!!!本人邮箱yierhan111@163.com,如果要DEMO程式的请告诉我
部分代码如下:

BOOL   CALLBACK   DialogData(HWND   hdwnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)
{
        CoInitialize(NULL);
        _ConnectionPtr   pConn(__uuidof(Connection));
      _RecordsetPtr   pRst(__uuidof(Recordset));
 
switch(message)
{
case   WM_INITDIALOG:

  pConn-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=HistorRecord.mdb ", " ", " ",adModeUnknown);

          pRst-> Open( "select   *   from   HistoryData ",_variant_t((IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText);

//////////////////////////////////////////////////
显示数据
/////////////////////
pRst-> Close();
pConn-> Close();

pRst.Release();
pConn.Release();

CoUninitialize();
break;
case   WM_COMMAND:
switch(LOWORD   (wParam))
{
case   IDC_BTN_PRINT:

     
X   =   Y   =   0;
/*   initialize   PRINTDLG   struct   */
PrintInit(&printdlg,   hdwnd);
if(!PrintDlg(&printdlg))   break;
 
docinfo.cbSize   =   sizeof(DOCINFO);
docinfo.lpszDocName   =   "Printing   text ";
docinfo.lpszOutput   =   NULL;
docinfo.lpszDatatype   =   NULL;
docinfo.fwType   =   0;

strcpy(str,   "This   is   printed   on   the   printer. ");
StartDoc(printdlg.hDC,   &docinfo);

StartPage(printdlg.hDC);
for(   i=0;   i <500;   i++)  
{


TextOut(printdlg.hDC,   X,   Y,   str,   strlen(str));

Y   =   Y   +20;//   +   tm.tmExternalLeading;
}
EndPage(printdlg.hDC);

EndDoc(printdlg.hDC);
DeleteDC(printdlg.hDC);


break;
default:
break;
}
break;
        default:
        break;
}
return   0;
}


[解决办法]
有可能是打印的时候改变了当前路径

Source=HistorRecord.mdb 这个地方用绝对路径试试先

如果用绝对路径OK

那么在看一下你的程序有没有用类似于打开文件对话框之类的东西

MFC的CFileDialog会改变系统当前路径的

[解决办法]
pConn-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=HistorRecord.mdb ", " ", " ",adModeUnknown);Source=HistorRecord.mdb

这一句的位置引用使用了当前工作路径来定位数据库文件,但是应该正确理解当前工作路径的含义,它是可以变化,也是不确定的。你可以查看一个快捷方式的属性就知道了

最好的办法就是使用当前程序所在的实际目录为基准(GetModuleFileName)加上数据库文件所在的相对位置,这个路径是不会变化。也是稳定的

类语言说法就是GetModuleFileName+ ".\\xxx.mdb " //与程序文件同位置的mdb
GetModuleFileName+ ".\\db\\xxx.mdb " //与程序文件同位置中的db目录下的mdb
GetModuleFileName+ ".\\..\\db\\xxx.mdb " //程序文件位置的上一层目录中的db目录下的mdb


热点排行