C++Builder 程序员博客
29 Oct
比如说我启两个IE,但不想让这两上IE用一个缓存目录,想各用各的,怎么设置,谢谢
用另一个用户开启新的IE
这样不太现实吧,我要是打开10个8个我怎么用10个8个用户呢?
没办法.只能多建用户.
我看到网上有这样的程序,所以也应该有解决的办法,可能是我们没有想到吧
有人来提示一下吗?-
哪位给提示一下呀
UP
同一用户下,IE的缓存目录是唯一的
在注册表中的位置是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Cache\Paths\Director
你可以修改注册表来修改缓存目录。但是跑的了和尚,跑不了庙。目录,始终唯一。
谢谢楼上的回复,可是有些网页多开工具,他就是能改变他打开风页的缓存,这样,多开的就不互相冲突,这个是怎么实现的呢
有人支持一下不
UP
UP
怎么才能调用IE,每个IE使用独立的缓存目录呢
怎么才能调用IE,每个IE使用独立的缓存目录呢
学习
EE
顶
顶
UP
等高人出现了,呵呵
就是网页多开程序怎么设置启动IE自己单独使用的缓存目录呢,解决后必重新开贴给分
14 Oct
我用的程序如下所示:
DWORD versioninfosize=GetFileVersionInfoSize("g:/test.exe",0); if(versioninfosize>0) { PWideChar versioninfodata=(PWideChar)new BYTE[versioninfosize]; ZeroMemory(versioninfodata,versioninfosize); if(GetFileVersionInfo("g:/test.exe",0,versioninfosize,versioninfodata)); { UINT uTemp = 0 ; VS_VERSIONINFO * pVerInfo; LPBYTE pOffsetBytes; LPLanguage lpTranslate = NULL; VerQueryValue(versioninfodata, PChar("\\VarFileInfo\\Translation"),(LPVOID*)&lpTranslate,&uTemp); AnsiString lengcode=IntToHex(lpTranslate->wLanguage,4)+IntToHex(lpTranslate->wCodePage,4); LPTSTR pValueBuffer; if(VerQueryValue(versioninfodata,("\\StringFileInfo\\"+lengcode+"\\CompanyName").c_str(),(LPVOID*)&pValueBuffer,&uTemp)) { Application->MessageBoxA(pValueBuffer,"",MB_OK); *pValueBuffer=‘a‘; } if(VerQueryValue(versioninfodata,("\\StringFileInfo\\"+lengcode+"\\CompanyName").c_str(),(LPVOID*)&pValueBuffer,&uTemp)) { Application->MessageBoxA(pValueBuffer,"",MB_OK); } HANDLE hResource=BeginUpdateResource("g:/test.exe",false); if(NULL!=hResource){ if(UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate -> wLanguage, versioninfodata, versioninfosize)) { EndUpdateResource(hResource,false); } } } delete []versioninfodata; }
这里按照正常的情况,第一次messagebox出来的东西是没有更改的版本信息,而第二次messagebox出来的东西应该是更改过的,但是实际上程序运行表明,两次的内容根本就没有变化,好像是pvaluebuffer所指向的值的改变没有影响到versioninfodata里面的值,但是VerQueryValue函数的参数pvaluebuffer最后的值应该是指向versioninfodata里面的对应偏移量处的指针才对。这就和内容不变化发生了矛盾,不知问题在哪
但是上面那个路径的确实实在在的取得了已有的文件的相关信息,相关的函数调用也显示正确返回
PS:换料你所说的那个路径,还是不行,同样无法更改。感觉就是那个pvaluebuffer指针指向的内容虽然变了,但不知为什么versioninfodata的内容没变
修改这些版本信息不是那么简单的,首先需要提取原来的版本信息内容,然后重新构造VS_VERSIONINFO数据段,然后回写.至于你的代码当中的那个其实只是修改了一个临时内存区域的内容,而不是真正的VersionInfo Block Data.
路径我两个都试过了,都能正确 的获得信息,但都无法正确 更改
根据msdn的说明,
lplpBuffer
[out] When this method returns, contains the address of a pointer to the requested version information in the buffer pointed to by pBlock. The memory pointed to by lplpBuffer is freed when the associated pBlock memory is freed.
诗歌指向刚刚获得的那个版本信息中相应的字段的指针才对阿
然后我看别人也是这样修改成功了。我这个就没成功,很是奇怪
http://topic.csdn.net/t/20051118/14/4402640.html
DWORD versioninfosize=GetFileVersionInfoSize("g:/test.exe",0); if(versioninfosize>0) { PWideChar versioninfodata=(PWideChar)new BYTE[versioninfosize]; ZeroMemory(versioninfodata,versioninfosize); if(GetFileVersionInfo("g:/test.exe",0,versioninfosize,versioninfodata)); { UINT uTemp = 0 ; VS_VERSIONINFO * pVerInfo; LPBYTE pOffsetBytes; struct LANGANDCODEPAGE { WORD wLanguage; WORD wCodePage; } * lpTranslate = NULL; VerQueryValue(versioninfodata, PChar("\\VarFileInfo\\Translation"),(LPVOID*)&lpTranslate,&uTemp); AnsiString lengcode=IntToHex(lpTranslate->wLanguage,4)+IntToHex(lpTranslate->wCodePage,4); LPTSTR pValueBuffer; if(!VerQueryValue(versioninfodata,("\\StringFileInfo\\"+lengcode+"\\CompanyName").c_str(),(LPVOID*)&pValueBuffer,&uTemp)) { return; } { AnsiString str; int iLen; str.SetLength(versioninfosize); memcpy(str.c_str(),(void *)versioninfodata,versioninfosize); pVerInfo = (VS_VERSIONINFO *)str.c_str(); char * p; VS_FIXEDFILEINFO *fixInfo; p = ((char * )(pVerInfo->szKey) ) + (wcslen(pVerInfo->szKey)+1 ) * sizeof(wchar_t); iLen = pVerInfo->wLength - (p - (char *)pVerInfo); int iii = (wcslen(pVerInfo->szKey))*2%4==0?0:(wcslen(pVerInfo->szKey))*2%4; fixInfo =(VS_FIXEDFILEINFO *) (p + iii); if (pVerInfo->wValueLength == 0 ) { p = (char *)fixInfo; }else{ p = (char *)fixInfo + sizeof(VS_FIXEDFILEINFO); iLen -= sizeof(VS_FIXEDFILEINFO); if(fixInfo->dwSignature!=0xfeef04bd)return; } StringFileInfo * strFileInfo; strFileInfo = (StringFileInfo *)( p);// + iii); StringTable *strtab; p = (char *)strFileInfo->szKey + (wcslen(strFileInfo->szKey) + 1) * sizeof(wchar_t); iii = (wcslen(strFileInfo->szKey))*2%4==0?0:(wcslen(strFileInfo->szKey))*2%4; strtab = (StringTable *)(p + iii); int strtab_total_len = strtab->wLength; p = (char *)strtab->szKey + (wcslen(strtab->szKey)+1) * sizeof(wchar_t); strtab_total_len -=( (p - (char *)strtab)); iii = (wcslen(strtab->szKey))*2%4==0?0:(wcslen(strtab->szKey))*2%4; p += iii; while (strtab_total_len){ KString *ks; ks = (KString *)p; int iilen = wcslen(ks->szKey)+1; p = (char *)ks->szKey + (iilen ) * sizeof(wchar_t) ; strtab_total_len -= (ks->wLength) ; iii = (iilen - 1)*2%4==0?0:(iilen - 1)*2%4; p += iii; ShowMessage((wchar_t *)p); if (!_wcsicmp(ks->szKey,L"CompanyName")){ memcpy(p,L"测试公司名\0",((ks->wValueLength-1)> (wcslen(L"测试公司名\0")+1)?(wcslen(L"测试公司名\0")+1):(ks->wValueLength-1))*sizeof(wchar_t)); HANDLE hResource=BeginUpdateResource("g:/test.exe",false); if(NULL!=hResource){ if(UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate -> wLanguage, (wchar_t *)str.c_str(), versioninfosize)) { EndUpdateResource(hResource,false); } } break; } p += ((ks->wValueLength) * 2 )+ ((ks->wValueLength) * 2 % 4 ==0?0:2) ; } } } delete []versioninfodata; }
unsigned代码是通过先将versioninfo struct取出来,然后在里面插找到companyname结果对应位置,对后面的信息 进行覆盖。
这种做法是没问题的
但是为什么别人的那个代码有用,而我的不行呢?
上面我贴出来的那个网址
ps:unsigned代码中用到的结构题bcb不自带,需要自己定义
另外文一句
KString是?
struct VS_VERSIONINFO { WORD wLength; WORD wValueLength; WORD wType; WCHAR szKey[]; WORD Padding1[]; VS_FIXEDFILEINFO Value; WORD Padding2[]; WORD Children[]; }; //String,为避开重名,此处更名 struct KString { WORD wLength; WORD wValueLength; WORD wType; WCHAR szKey[]; WORD Padding[]; WORD Value[]; }; struct StringTable { WORD wLength; WORD wValueLength; WORD wType; WCHAR szKey[]; WORD Padding[]; KString Children[]; }; struct StringFileInfo { WORD wLength; WORD wValueLength; WORD wType; WCHAR szKey[]; WORD Padding[]; StringTable Children[]; };
typedef struct String {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
WORD Value[];
}KString;
应该是这个。
unsigned写的代码是搞懂了。但是我的代码和网上查到的代码的结果的差别还是不知为啥
11 Oct
RT
怎样实现这种修改?
想实现一打包软件,但打包软件生成的exe的这些信息是必须可以由用户自定义的
都有相关的api.我记不太清了,自己搜吧.
图标是资源,查找资源相关的api就可以.
修改版权信息相对来说比修改图标资源复杂.
图标直接读取资源应该可以,不过不是说delphi的图标方面有问题么?会导致颜色不对
那其他信息呢?例如版权信息
就是资源修改,有标准api的
用外部按键直接控制dbgrid的新增、修改,保存等,我希望在新增、修改时,只能通过点击保存、取消键来保存取消。所以此时必须禁止鼠标移到另外的记录上,如果有移,怎么样控制此时不保存当前的记录.
难道没有人愿意帮忙吗?
在dbgrid下加一个DBNavigator控件应该可以实现你的要求
在Data Control的dbgrid后面那个
顶,俺也在找这个东东
听说是调用ADOQuery的属性
该回复于2008-07-19 16:13:13被版主删除
4 Sep
做一个下拉框
当改变选择值时弹出对话框,如果选择否(即不改变)时如何让TCombox的值恢复到原来的值
举个例子
原来是8,这时候打开下拉框选择5,这时候弹出确认修改对话框,选择"否",这时候如何让TCombox的显示值变回8呢???
ls的意思是不是就是把ComVRowCount->ItemIndex的值置成原来的数值?
类似于ComVRowCount->ItemIndex=8;这样?
是的,记住最后一个有效的ItemIndex,确认修改就记住ItemIndex,不确认就修改ItemIndex为旧有效值
搞定了
感谢
3 Sep
如题。
我需要修改BCB中VCL的源码(如forms.pas),请问如何让修改在BCB中生效??
谢谢!!!
将修改后的VCL单元(.pas)添加到工程中,编译时记的取消Project–>Options–>Packages–>Build with runtime packages的对钩。
如果是组件,还是去找BCB 版本的包.
CB可以直接编译PAS的,我用socketconnection的时候就是把scktsrvr.exe的DELPHI源代码直接加到我的工程里
重新编译,build …
to akirya:
能否详细一点呢?谢谢!!!
to ccrun:
这个方法似乎可行,只是我需要修改的内核单元比较多,稍稍有点麻烦。
————————————–
By the way,我修改内核的目的是让BCB全面支持UNICODE;
这个工作在Delphi6上已经完成(同样是修改VCL的代码);
只是为满足业务需要,我们得将代码移植到BCB中,所以有了在BCB下编译VCL代码的需求。
另外,由于刚刚接触BCB,IDE环境有些不熟悉,请问怎么Trace Into 到VCL代码?
-_-!!
Linker->Use Debug libraries
25 Aug
已经修改了pas,并把编译后的pas和dcu文件复制回原来的目录,但是没用啊
修改了VCL源码后,将相应的PAS文件加入到工程中,并且在编译时要必须Options中Build with runtime pacakges前的对钩。
复制一个副本到工程目录,还是直接添加BCB下面的那个文件?
好像可以了,直接添加BCB目录下面的原文件,
我再试试看
副本也可以
1 Aug
DBGrid里显示有部门一列,该列是有限制的,如只能是"研发,技术,项目,人事,财务….",性别一列只能是"男,女(勉强空也行)"
我在添加数据的时候,部门列是用Combox固定的几个选项,不可更改,最好是在DBgrid里也能弄能Combox那样的,有达人能做到吗?
实在不行,还有就是"男,女"那个,怎么在我点"修改"按钮的时候,得到要修改的字符串,我做一下判断,如果不是"男,女"就提示,修改不成功.
用PickList属性可以做到某一列显示的是下拉菜单。可以做到显示你的性别!
用PickList属性可以做到某一列显示的是下拉菜单。可以做到显示你的性别!
或者你做一個畫面 用wwDBComboDlg1控件的onCustomDlg事件打開那個畫面,並賦值
在DBGrid不用加wwDBComboDlg1控件
設置DBGridEh.Columns[x]的ButtonStyle的屬性為cbsEllipsis也可以達到你的要求
找到PickList了,也加了Strings,可运行的时候显示不出来下拉列表,好多人和我有同样的问题,问了也问不出什么.
http://topic.csdn.net/t/20020417/20/655438.html#
很多人说是把ButtonStyle设为cbsAuto,我试了不行,4楼说设为cbsEllipsis,我也试,也不行
我看了一下帮助说明,应该是auto
cbsAuto If the column is associated with a lookup field or has a value assigned to its PickList property, the grid displays a combo box in the column. The user can choose a value from the drop-down list.
1 Aug
比如我有一列是电话号码
如果像edit中那样用
OnKeyPress事件判断,那DBGrid上所有的列都只能输入数字了,所以这个判断加在哪儿?
这种一般可以针对DBGrid数据集的字段直接限定其允许字符,例子:
TFieldChars AllowChars;
AllowChars.Clear();
AllowChars < <'0' < <'1' < <'2' < <'3' < <'4' < <'5' < <'6' < <'7' < <'8' < <'9';
DataSet1->FieldByName("F1")->ValidChars=AllowChars;
这样DataSet1的F1字段只允许输入0~9这样的数字,在相应的DBGrid、DBText等数据控件中都能生效。
大哥,算法我可以动脑子,可这是技术~~~~~
就像楼上这位仁兄虽然给了我明确的代码,但放在哪儿,确实是我该自己动脑子的地方
最近两天看楼主这么活跃,真是服了
原来程序员是这样炼成的
胡一刀大哥,你救了我的命了,感激不尽
其实早以前也很活跃,在上一家公司做一个时间控件,当时ccrun都说我最近比较活跃,一直没怎么接触数据库,重新学起
我也是感慨颇多,这个星期一上班,要我在一周之内做一个网络版的数据库程序,要有打印功能,给了一些条件,让自己设计表,这可愁坏我了,第一天一筹莫展,根据以前经验,每次遇到不可能完成的任务mission impossible,可能只过一天,就变成了简单的问题impossible is nothing.可这次不一样,换了新的环境,没人可以问,只有我一个用CB的,没有书可以查,搬家没带过来,甚至第一天没有网可以上,现在可以了.到现在,只差一个打印功能了,感觉欣慰呀,我问了一下报表怎么做,头儿说,报表很简单,我相信你能看懂,可我看,报表都是那么复杂.
29 Jul
我用软件采集了很多文件,后来发现采集的文件里面有一个标记是错误的,需要修改,但是又不能改动文件产生的原始时间。
虽然说可以通过调整计算机系统时间,然后打开文件,替换文件里内容,然后存盘,这样文件内容既替换了,也不改动文件的产生时间。但是如果我的文件有几千个几万个,那人工是没办法一一解决,想通过编写软件实现,又不知道如何实现修改文件时间,请大家指教,谢谢!
Sets the date and time that the specified file or directory was created, last accessed, or last modified.
BOOL WINAPI SetFileTime(
__in HANDLE hFile,
__in const FILETIME* lpCreationTime,
__in const FILETIME* lpLastAccessTime,
__in const FILETIME* lpLastWriteTime
);
Parameters
hFile
A handle to the file or directory. The handle must have been created using the CreateFile function with the FILE_WRITE_ATTRIBUTES access right. For more information, see File Security and Access Rights.
lpCreationTime
A pointer to a FILETIME structure that contains the new creation date and time for the file or directory. This parameter can be NULL if the application does not need to change this information.
lpLastAccessTime
A pointer to a FILETIME structure that contains the new last access date and time for the file or directory. The last access time includes the last time the file or directory was written to, read from, or (in the case of executable files) run. This parameter can be NULL if the application does not need to change this information.
To preserve the existing last access time for a file even after accessing a file, call SetFileTime with this parameter set to -1 before closing the file handle.
lpLastWriteTime
A pointer to a FILETIME structure that contains the new last modified date and time for the file or directory. This parameter can be NULL if the application does not need to change this information.
Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
多谢楼上!
请问如何把字符串“2008-7-21 08:04:42"这样的时间赋值给文件时间?试了很多日期函数都不行啊。
多谢楼上!
请问如何把字符串“2008-7-21 08:04:42"这样的时间赋值给文件时间?试了很多日期函数都不行啊。
//—————————————————————————
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE f1;
FILETIME FT;
SYSTEMTIME t;
AnsiString sj;
sj=StrToDateTime("2008-07-15 01:10:02");
DateTimeToSystemTime(sj,t);
SystemTimeToFileTime(&t,&FT);
f1=CreateFile("d:\\h0.org",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
SetFileTime(f1,&FT,&FT,&FT);
CloseHandle(f1);
}
//—————————————————————————
通过以上代码可以实现功能,但是我发现文件时间差了8个小时,变成2008-7-15 9:10:02了,怎么回事?
也可以用EncodeDateTime(DateUtils.hpp)
SYSTEMTIME t;
DateTimeToSystemTime(StrToDateTime("2008-7-21 08:04:42"),t);
剩下的和前面的例子一样
//————————————————————————— // 设置文件的修改时间 bool __fastcall CrnSetFileModifiedTime(String strFileName, TDateTime dt) { int nFileHandle; TFileTime ft; TFileTime ftLocal; TSystemTime stLocal; bool bResult(false); DecodeDate(dt, stLocal.wYear, stLocal.wMonth, stLocal.wDay); DecodeTime(dt, stLocal.wHour, stLocal.wMinute, stLocal.wSecond, stLocal.wMilliseconds); if(SystemTimeToFileTime(&stLocal, &ftLocal)) { if(LocalFileTimeToFileTime(&ftLocal, &ft)) { try { nFileHandle = FileOpen(strFileName, fmOpenReadWrite | fmShareExclusive); bResult = SetFileTime((HANDLE)nFileHandle, NULL, NULL, &ft); } __finally { FileClose(nFileHandle); } } } return bResult; } //————————————————————————— // 测试代码 void __fastcall TForm1::Button1Click(TObject *Sender) { CrnSetFileModifiedTime("C:\\ccrun\\234.txt", StrToDateTime("2008-7-21 08:04:42")); }
你还要再调用一次:LocalFileTimeToFileTime
奇怪,一回复发现多了四条,更郁闷的是偶是最后一条:-(
你们都好快哦,SYSTEMTIME是格林威治时间,有8个小时的时差
多谢各位!