質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

1523閲覧

rundll32とC#のInteropで呼び出すときの違い

FoolHotari

総合スコア79

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2021/10/28 05:33

編集2021/10/28 05:35

前提・実現したいこと

デバイスを休止状態にさせずにスリープ状態にさせるショートカットを作りたいです。

発生している問題・エラーメッセージ

下記の1と2では内部的に同じ関数を同じ引数で呼んでいると思っているのですが、動作が異なります。
1の方では休止状態になります。
2の方ではスリープ状態になります。

Application.cs
SetSuspendState
Interop.Libraries
PowerState.cs
Interop.BOOLEAN.cs

このソースを見ると同じに見えます。
何か違いがあるのでしょうか?

2の方法は実行に時間がかかるので避けたいです。
C#アプリとしてコンパイルすればいいと言われれば、元も子もありません。

該当のソースコード

1

1rundll32 powrprof.dll,SetSuspendState 0,0,0

2

1PowerShell -Command "Add-Type -Assembly System.Windows.Forms;[System.Windows.Forms.Application]::SetSuspendState('Suspend', $false, $false);"

試したこと

指定されたpowrprof.dllが違うのかと思い、以下の2つも試しましたが、結果は変わりませんでした。

rundll32 "C:\Windows\SysWOW64\powrprof.dll",SetSuspendState 0,0,0 rundll32 "C:\Windows\System32\powrprof.dll",SetSuspendState 0,0,0

また、以下のようにSetSystemPowerStateも使ってみようとしましたが、何も起きませんでした。

rundll32 Kernel32.dll,SetSystemPowerState 1,0

引数を変えてみても、当然ながら結果は変わりませんでした。

rundll32 powrprof.dll,SetSuspendState 1,0,0

補足情報(FW/ツールのバージョンなど)

Windows 11 Home 21H2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/28 05:41

違いが知りたいんじゃなくてスリープにする方法が知りたいだけですよね?
FoolHotari

2021/10/28 05:59

ついでに違いも知りたいです
FoolHotari

2021/10/28 06:11

確かにスリープをさせたいという目的の中でタイトルのような疑問を抱きました。 違いがわからなくても問題を解決することはできるかもしれませんが、知らないことを知らないままにしたくありません。 もしご存じでご教授いただければ幸いです。
退会済みユーザー

退会済みユーザー

2021/10/28 06:51 編集

そもそもrundllはどんなエクスポート関数でも呼び出せる訳ではなく、シグネチャが決まっていた筈です。
guest

回答1

0

ベストアンサー

既にMicrosoftからはドキュメントが無くなっているので転載サイトになりますが、
INFO: The Windows 95 Rundll and Rundll32 Interface

How to Write Your DLL

In your DLL, write the <entrypoint> function with the following prototype:

16-bit DLL:

void FAR PASCAL __loadds
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

32-bit DLL:

void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

rundllはDLLのどのようなエクスポート関数でも実行出来る訳ではなく、rundllで実行出来るように作られた形式の関数じゃないと正しく動作しません。元々Microsoftが内部使用する為に存在するものなので、安易に使うものではないです。

投稿2021/10/28 06:59

編集2021/10/28 07:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FoolHotari

2021/10/28 07:28

特定の仮引数を持つ関数のみ正しく呼び出せるということでしょうか? rundllを使わないとして、ほかに解決策はございますか?
退会済みユーザー

退会済みユーザー

2021/10/28 07:31 編集

真っ当にプログラミング言語からWinAPIを呼び出してください。(Powershellで出来ているからそれでいいのでは?) それか、コマンドラインでスリープ状態にできるツールを探してください。
FoolHotari

2021/10/28 07:33

あきらめてC#で書きました。 回答ありがとうございました。
Zuishin

2021/10/29 01:01

PowerShell からは次のように WinAPI を呼び出します。 https://maywork.net/computer/win-sleep-script/ 「違い」についてはこの API をラップして別仕様の API を作っているだけなので、知る意味は特にありません。「ここではそういうもの」と思うだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問