2016-03-28 135 views
1

Service Managerにサービスをインストールして実行します。私のコードは次のとおりです: advapi32.dllを使用して64ビットシステムにWindowsサービスをインストールする

using System; 
using System.Runtime.InteropServices; 
class Ana 
{ 
    static void Main() 
    { 
     IntPtr sc_handle=OpenSCManager(null,null,2); 
     IntPtr sv_handle = CreateService(sc_handle, "deneme", "deneme", 16, 16, 2, 0, @"D:\ServisDeneme2.exe", null, null, null, null, null); 
     int i=StartService(sv_handle,0,null); 
     CloseServiceHandle(sc_handle); 
    } 

    [DllImport("advapi32.dll")] 
    public static extern IntPtr OpenSCManager(string machine, string db, int parameter); 

    [DllImport("advapi32.dll")] 
    public static extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName, string lpDisplayName, int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl, string lpPathName, string lpLoadOrderGroup, object lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword); 

    [DllImport("advapi32.dll")] 
    public static extern void CloseServiceHandle(IntPtr SCHANDLE); 

    [DllImport("advapi32.dll")] 
    public static extern int StartService(IntPtr SVHANDLE, int dwNumServiceArgs, string[] lpServiceArgVectors); 
} 

このコードは私の32ビットコンピュータでは完全に動作しますが、64ビットコンピュータでは動作しません。どのように私は64ビットのために同じ仕事をすることができますか?

+1

宣言はバグです。今はCreateServiceのlpdwTagId引数に確実に該当します。実際には 'out int'です。あなたはおそらくそれを全く使いたくない、オブジェクト*を宣言してnullを渡すことを望んでいるでしょう。 StartServiceも致命的ではなく、最後の引数はstring []です。 –

+0

私はコードを編集しました。今は私の32ビットコンピュータで動作します。しかし、64ビットで動作させるにはどうすればいいですか? – user1067742

答えて

0

64ビットマシンで正しく機能するには、x86でアプリをコンパイルする必要があると思います。

それともこの男がやったように、あなたが何かを行うことができます:

Using a 32bit or 64bit dll in C# DllImport

0

私はそれを行っています!この問題は管理者権限がありませんでした。 32ビット/ 64ビットの区別には関係しません。サービスを作成、開始、停止するには、サービス制御プログラムに管理者権限が必要です。管理者権限でコマンドラインを起動し、プログラムが機能しました。

関連する問題