快絕望了。。。一個關于.net開發Windows服務的問題

zoti 2008-01-15 10:18:44
用.net開發的Windows服務程序,如果不使用net start啟動,而使用雙擊或者在命令行執行,會彈出一個框,提示說服務程序要使用net start啟動。

我現在想要的效果是,如果是雙擊執行的,執行我寫的一段代碼,然后返回﹔如果是net start啟動的,則執行正常的服務程序。

查看.net的代碼,它是這麼判斷的:


IntPtr entry = Marshal.AllocHGlobal((IntPtr) ((services.Length + 1) * Marshal.SizeOf(typeof(NativeMethods.SERVICE_TABLE_ENTRY))));
NativeMethods.SERVICE_TABLE_ENTRY[] service_table_entryArray = new NativeMethods.SERVICE_TABLE_ENTRY[services.Length];
bool multipleServices = services.Length > 1;
IntPtr zero = IntPtr.Zero;
for (int i = 0; i < services.Length; i++)
{
services[i].Initialize(multipleServices);
service_table_entryArray[i] = services[i].GetEntry();
zero = (IntPtr) (((long) entry) + (Marshal.SizeOf(typeof(NativeMethods.SERVICE_TABLE_ENTRY)) * i));
Marshal.StructureToPtr(service_table_entryArray[i], zero, true);
}
NativeMethods.SERVICE_TABLE_ENTRY structure = new NativeMethods.SERVICE_TABLE_ENTRY();
structure.callback = null;
structure.name = IntPtr.Zero;
zero = (IntPtr) (((long) entry) + (Marshal.SizeOf(typeof(NativeMethods.SERVICE_TABLE_ENTRY)) * services.Length));
Marshal.StructureToPtr(structure, zero, true);
bool flag2 = NativeMethods.StartServiceCtrlDispatcher(entry);


最後一句:flag2 如果為true,則執行服務程序,如果為false,則彈出提示框。

提取這段代碼,寫了一個IsCommandLineMode()的方法,
在雙擊執行的時候,flag2 能正常返回為false,但在服務執行的時候,總是報莫名其妙的錯誤。

有何辦法來准確判斷當前程序的執行方法是由net start啟動還是用雙擊圖標啟動的?

這個問題找了好久,一直搞不定。
請高手來幫幫忙。
搞定了再加100分。
謝謝大家了。
...全文
277 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoti 2008-02-29
  • 打赏
  • 举报
回复
感謝思歸!
第一種使用API的方法好像調試不成功,理論上應該是可以的,也許是我哪里沒有弄好。
最後使用檢測帳號的方法做的,雖然有局限性,但大部分場合可以用。
再次感謝回復的各位。
saucer 2008-01-22
  • 打赏
  • 举报
回复
参考这里的答复(使用了Win32 API)
http://www.thescripts.com/forum/thread104039.html

判断父进程好象是个办法,但比较麻烦吧,参考这篇贴子
http://csharpfeeds.com/post.aspx?id=1743

或者你的服务的运行情况你是知道的话,可以检测Environment.UserInteractive是否为真(但如果把服务设为Allow Service to interact with Desktop,那么这个变量就没有意义了),也可以试着检测Environment.UserName,一般是以SYSTEM为运行帐号的,但如果特定设置为别的帐号的话,那好像又有点问题)

gyc 2008-01-22
  • 打赏
  • 举报
回复
判断父进程呢?或者 进程是否是服务进程

所有的服务,都会在Service 服务下启动, 用工具查看一下就知道了

没记错的话process 应该有个isService 属性, 可以看看
wdzr_826 2008-01-21
  • 打赏
  • 举报
回复
mark
zoti 2008-01-21
  • 打赏
  • 举报
回复
為何沉底這麼快呢?呵呵~~
daichenghua 2008-01-17
  • 打赏
  • 举报
回复
无能为力,顶一下
zoti 2008-01-17
  • 打赏
  • 举报
回复
高手呢???幫幫忙啊。
lwl0376 2008-01-16
  • 打赏
  • 举报
回复
关注
zoti 2008-01-16
  • 打赏
  • 举报
回复
沉底了,沒人幫我啊?
zoti 2008-01-15
  • 打赏
  • 举报
回复
呵呵,謝謝兩位幫忙頂。
changjiangzhibin 2008-01-15
  • 打赏
  • 举报
回复
顶一下
蝶恋花雨 2008-01-15
  • 打赏
  • 举报
回复
没人来帮你顶顶
zoti 2008-01-15
  • 打赏
  • 举报
回复
我現在不是想跟桌面交互,只是想知道當前的運行方式。是由net start啟動還是雙擊的。
既然.net可以做到,我想我們應該也行,只是現在還找不到方法而已。
nicochang 2008-01-15
  • 打赏
  • 举报
回复
打開和桌面交換的選項了嗎?
吐司vivi 2008-01-15
  • 打赏
  • 举报
回复
没试过!帮你看看

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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