用BCB创建的服务程序为什么读取不了注册表。

hongtonglfx 2004-07-28 04:01:32
我调试BCB创建的服务程序,当用该程序进行install时,注册表健值可以读取到,但在服务列表中,启动该服务时,却无法读取,读取的是空值。。why?那位大侠知道!!!
...全文
331 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kezhu 2004-07-29
  • 打赏
  • 举报
回复
可是我的系统中只有一个用户,写的时候也是这个用户用另一个程序写的,用regedit在HKEY_CURRENT_USER下也可以看到,为什么会open失败?
songyan 2004-07-29
  • 打赏
  • 举报
回复
“本地系统账户”登录,可以读HKEY_LOCAL_MACHINE了,但读不了HKEY_CURRENT_USER,这我有实践的了。别忘了Registry->ReadString有个特点,当没有你指定的键值时,是返回空串的。
我建议你要避免以后维护上的麻烦,让写入的人也改成写HKEY_LOCAL_MACHINE了。否则你的服务程序在分发给客户使用时,安装调试会特麻烦的,因为牵涉到了客户电脑上windows用户的问题。
hongtonglfx 2004-07-29
  • 打赏
  • 举报
回复
结帖子了。。。。感谢大家的帮忙。。。感谢。。
hongtonglfx 2004-07-29
  • 打赏
  • 举报
回复
songyan(songyan) ( ) 信誉:100 高人中的高人。。。正是这个问题。。。服务程序读的是HKEY_LOCAL_MACHINE ,而不读取。。HKEY_CURRENT_USER
songyan 2004-07-29
  • 打赏
  • 举报
回复
“别人就是写在HKEY_CURRENT_USER下”,那你的服务程序必须用他写入注册表时的用户来登录,否则就是读不出来。
为了确定原因,试试服务程序用写入的那个用户名来登录运行一次看看。
kezhu 2004-07-29
  • 打赏
  • 举报
回复
to hongtonglfx(红桐):我没有解决,互相帮顶。

to songyan(songyan):服务中登录的部分就是选的“本地系统账户”,感觉上服务中读到的和用regedit看到的应该是一样的,而且我仅仅是读,别人就是写在HKEY_CURRENT_USER下,总不可能去读别的地方吧。
特招 2004-07-29
  • 打赏
  • 举报
回复
感觉你的参数少了一点
AnsiString __fastcall TVDSUpdate::GetRegistryValue(AnsiString KeyName,AnsiString Str)
{
AnsiString S = "";
TRegistry *Registry = new TRegistry;
try
{
Registry->RootKey = HKEY_CURRENT_USER;
// false because we do not want to create it if it doesn't exist
if (Registry->OpenKey(KeyName, false))
S = Registry->ReadString(Str);
}
__finally
{
delete Registry;
}
return S;
}
第一个参数是注册表的路径,第二个参数是路径下要读取的字符串值的名称
(前提:要读取注册表项的必须为字符串值)
songyan 2004-07-29
  • 打赏
  • 举报
回复
因为你是读HKEY_CURRENT_USER,如果你的服务登录的用户名,和你写入注册表时的用户名不同,就会读不出了,因为user不同了。我当时研究了一天多,才发现是这个原因。后来为了避免这个问题,我都是读写HKEY_LOCAL_MACHINE了。
hongtonglfx 2004-07-29
  • 打赏
  • 举报
回复
我看到你这个帖子了。。最后你怎么解决的。。。告知一下如何???
kezhu 2004-07-29
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3204/3204448.xml?temp=.9045526
hongtonglfx 2004-07-29
  • 打赏
  • 举报
回复
修改interactive 属性 为true 即可显示showmessage了。
myy 2004-07-28
  • 打赏
  • 举报
回复
我用 BCB6 ,Win2000 pro,OnStart中写 ShowMessage(...); 根本不会显示,
并且服务启动不能完成,还停不掉!杀进程也杀不死,看来BCB6 和 5 还是有很大差异.
hongtonglfx 2004-07-28
  • 打赏
  • 举报
回复
获取的值为空,不是出错。。。。。。
铖邑 2004-07-28
  • 打赏
  • 举报
回复
能不能用GETLASTERROR函数看看错在哪里?
铖邑 2004-07-28
  • 打赏
  • 举报
回复
能不能用GETLASTERROR函数看看错在哪里?
hongtonglfx 2004-07-28
  • 打赏
  • 举报
回复
此程序在 BCB5上设置 运行参数 /install 时,能够安装成功,也能读取注册表成功。但利用windows2000的服务管理器,进行启动时,却showmessage出空值。。。
hongtonglfx 2004-07-28
  • 打赏
  • 举报
回复
showmessage 可以显示,但值是空的。
myy 2004-07-28
  • 打赏
  • 举报
回复
是无法读取,还是“ShowMessage”不能显示?
hongtonglfx 2004-07-28
  • 打赏
  • 举报
回复
就是这个ServiceStart 里面在 install的时候 可以获取 数值。而到了 在服务列表启动该服务却无法获取。。。
hongtonglfx 2004-07-28
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
#include "Unit_ServiceUpdateMain.h"
#include <Registry.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TVDSUpdate *VDSUpdate;
//---------------------------------------------------------------------------
__fastcall TVDSUpdate::TVDSUpdate(TComponent* Owner)
: TService(Owner)
{
AppNamePath = GetRegistryValue(DATA_VER_KEY);
ShowMessage(AppNamePath);
}
//---------------------------------------------------------------------------
TServiceController __fastcall TVDSUpdate::GetServiceController(void)
{
return (TServiceController) ServiceController;
}
//---------------------------------------------------------------------------
void __stdcall ServiceController(unsigned CtrlCode)
{
VDSUpdate->Controller(CtrlCode);
}
//---------------------------------------------------------------------------
void __fastcall TVDSUpdate::ServiceExecute(TService *Sender)
{
/*
AnsiString Path = "D:\\Program Files\\Borland\\CBuilder5\\Projects\\ServiceExe\\";
ShellExecute(0, "open",AnsiString(Path + "test.exe").c_str(),NULL,
Path.c_str() ,SW_SHOWDEFAULT);
*/
// AnsiString CurrenDir = ExtractFileName(Svcmgr::Application->GetNamePath());
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( AppNamePath.c_str(), // No module name (use command line).
NULL, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
// ErrorExit( "CreateProcess failed." );
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
//---------------------------------------------------------------------------

AnsiString __fastcall TVDSUpdate::GetRegistryValue(AnsiString KeyName)
{
AnsiString S = "";
TRegistry *Registry = new TRegistry;
try
{
Registry->RootKey = HKEY_CURRENT_USER;
// false because we do not want to create it if it doesn't exist
if (Registry->OpenKey(KeyName, false))
S = Registry->ReadString("AppName");
}
__finally
{
delete Registry;
}
return S;
}
//---------------------------------------------------------------------------

void __fastcall TVDSUpdate::ServiceStart(TService *Sender, bool &Started)
{
AppNamePath = GetRegistryValue(DATA_VER_KEY);
ShowMessage(AppNamePath);
}
//---------------------------------------------------------------------------
加载更多回复(1)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧