2013-04-09 72 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