none
WritePwrScheme P/Invoke C# RRS feed

  • 問題

  • 請教如何在 C# 中  P/Invoke WritePwrScheme?

    目前我使用的定義入下:

            [DllImport("powrprof.dll", SetLastError = true, EntryPoint = "WritePwrScheme")]
            static extern bool WritePwrSchemeS(uint puiID, String sName, String sDesc, IntPtr PowerPolicy);

     

    範例程式如下:

                // GetActivePwrScheme
                uint currpowerScheme = 999;
                GetActivePwrScheme(ref currpowerScheme);

     

      // Read Active Power Scheme

                PowerProf.POWER_POLICY currPowerPolicy;
                bool ggg = ReadPwrScheme(currpowerScheme, out currPowerPolicy);

      // Copy

                PowerProf.POWER_POLICY internalPolicy = currPowerPolicy;

                //
                IntPtr pInternalPolicy = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(PowerProf.POWER_POLICY)));
                Marshal.StructureToPtr(internalPolicy, pInternalPolicy, false);
                bool bWriteok = WritePwrScheme(10, "Test", "This is test pwr scheme", pInternalPolicy);

    其中 所有 return value 都為 true;

     

    但都沒看到 power scheme 被寫入(Registry or 控制臺-->電源管理).

     

    請大家幫幫忙...

     

    p.s. GetActivePwrScheme, ReadPwrScheme 皆驗証過..運作正常!!

    2008年12月4日 上午 08:56

所有回覆

  • 請高手幫忙一下

    感恩!!

     

     

    2008年12月5日 上午 03:17
  • HI,

     

    請問您是在Vista上執行嗎?

     

    tihs

    2008年12月10日 上午 03:01
  • 我懷疑是你的Structure POWER_POLICY的C#定義沒有寫正確,可能是因為POWER_POLICY的定義不對,CLR在將ReadPwrScheme調用返回的POWER_POLICY從Native一端Marshal到Managecode一端的時候,沒有正確填寫POWER_POLICY各個Field的值。 Power Management我並不是特別了解,但是我看了一下POWER_POLICY的定義,的確很複雜,手工將C++的定義轉換成.NET的Structure比較容易出錯。


    因此我建議你採用P/Invoke Signature Generator這個工具來為你自動生成P/INVOKE的聲明,下載地址:
    http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2008_01.exe

    另外你可以查看這兩篇文章來了解這個工具的用法:

    http://blogs.microsoft.co.il/blogs/sasha/archive/2008/01/12/p-invoke-signature-generator.aspx

    http://msdn.microsoft.com/en-us/magazine/cc164193.aspx
    2008年12月10日 下午 02:35