2013-04-09 63 views
-1

所以,我想在C#中使用CreateProcess API函數。我知道我必須導入kernel32.dll文件並覆蓋函數頭並將其標記爲extern。我也知道我必須實現函數使用的結構。我遇到的問題如下:我在哪裏可以看到我需要實現的結構的確切結構?在C#中使用Windows API函數

[DllImport("Kernel32.dll")] 
public static extern HANDLE CreateThread(PSECURITY_ATTRIBUTES psa, 
              DWORD cbStack, 
              PTHREAD_START_ROUTINE pfnStartAddr, 
              PVOID pvParam, 
              DWORD fwdCreate, 
              PDWORD pdwThreadID); 

我需要implemenent以下結構,以便爲這個工作:HANDLE,DWORD ......剩下的我該怎麼做呢?

+0

到目前爲止你做了什麼? – Brian 2013-04-09 19:00:19

+0

我知道如何在C++中使用這個函數,但我想學習如何在C#中使用它們,我需要一個可以看到HANDLE結構的地方,這樣我可以在C#中編寫HANDKE結構,我希望你能理解什麼我的意思是。 – patentul 2013-04-09 19:03:40

+0

其他人已經回答,所以我只是想在這裏[http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getfunctionpointerfordelegate.aspx]。雖然我的問題是,你爲什麼要這樣做,而不是嘗試C#多線程? – IdeaHat 2013-04-09 19:21:50

回答

4

您不需要重新實現這些類型。你只需把它們翻譯成其相應的.NET相當於:

Platform Invoke Data Types

您可能也有興趣知道.NET有自己的創造都線程和進程的方法:

Process Class (System.Diagnostics)

Thread Class (System.Threading)

+0

謝謝!我是Api功能的新手。這是我的問題 – patentul 2013-04-09 19:17:12

+0

FWIW的最佳答案,您需要做的不僅僅是映射類型。如果這就是所有p/invoke,這將不存在:http://stackoverflow.com/questions/tagged/pinvoke – 2013-04-09 19:23:26

+1

@DavidHeffernan - 還有更多的P/Invoke,是的。但是OP特別詢問了重新實現數據類型的問題。在這種情況下,找到適當的.NET類型是適當的。 – 2013-04-09 19:25:34

3

您可以使用pinvoke.net作爲Win32 API轉換的來源。例如,這裏有兩個你有興趣:

不要被警告,翻譯有質量參差不齊。例如,在上面的鏈接中有兩個版本CreateThread。其中只有一個是準確的。很明顯它是哪一個!

更一般地說,您應該仔細閱讀MSDN p/invoke tutorialMarshaling Data with Platform Invoke

+0

['CreateProcess']的kernel32版本(http://pinvoke.net/default.aspx/kernel32/CreateProcess.html) – CodesInChaos 2013-04-09 19:04:33

+0

感謝您的回答,這真的很有趣! – patentul 2013-04-09 19:04:56

+0

@CodesInChaos謝謝,我很sl,,我修好了鏈接 – 2013-04-09 19:08:04

1

我發現MSDN主題Windows Data Types是在確定Windows中的DLL中使用的各種類型別名有幫助的。

+0

謝謝,雖然上面的答案對我來說更有用。 – patentul 2013-04-09 19:16:44