2010-08-26 87 views
1

我得到的第二个是由第一个使用以下API创建了两个控制台进程:如何让另一个进程创建的进程使用创建进程的一部分内存?

BOOL WINAPI CreateProcess(
    __in_opt  LPCTSTR lpApplicationName, 
    __inout_opt LPTSTR lpCommandLine, 
    __in_opt  LPSECURITY_ATTRIBUTES lpProcessAttributes, 
    __in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes, 
    __in   BOOL bInheritHandles, 
    __in   DWORD dwCreationFlags, 
    __in_opt  LPVOID lpEnvironment, 
    __in_opt  LPCTSTR lpCurrentDirectory, 
    __in   LPSTARTUPINFO lpStartupInfo, 
    __out  LPPROCESS_INFORMATION lpProcessInformation 
); 

现在我不知道,如果我将指针传递到所述第一进程的存储器的一部分,经由IpCommandLine到由第一个进程调用的第二个进程,将通过第二个进程读取该指针所指向的内存肯定会导致访问冲突错误或受到该API某些参数的值? 如果我不能单独使用这个API来达到我的目的,您提出什么方法来访问?

回答

2

您可以使用ReadProcessMemory/WriteProcessMemory API访问此内存。另一个进程需要知道进程的内存地址和句柄以访问其内存。

-1

我相信使用volatile将允许其他进程访问内存。当然,这需要一个指向它

+0

不,volatile不允许跳过地址空间。 – janm 2010-08-26 08:38:17

+0

嗯......不。 volatile - 当天返回 - 表示编译器不应该通过在寄存器中“私下”保留一个变化的变量来进行优化,而是将更改写回到其他线程/中断处理程序等期望当前值的实际内存位置现在 - 在所有多级内存缓存和内核中,volatile不足以确保刷新到某个通常可见的级别。通常使用互斥锁,尽管在存储级别上可以使用各种存储屏障指令。 – 2010-08-26 08:39:58

+0

啊。我有点期待volatile会仍然神奇地允许在proccesses中使用内存。 – Raynos 2010-08-26 08:48:49

0

这里是我的无知的意见(没有做太多的这个东西在Windows上):

单独的进程(按定义几乎)通常没有访问到对方的内存空间直接。因此,您应该使用进程间通信(提示:这是您的谷歌的东西)的方法之一。

在这方面,我对windows并不了解,但是插座,管道,内存映射文件和各种形式的RPC之类的东西让人想起。它当然取决于你的实际使用情况。

0

Alex Farber的回答是正确的;您可以使用Win32 API调用来读取另一个进程的内存。但是,这可能是一个坏主意。如果有数据要移动,可以将它作为参数传递给命令行,也可以将句柄传递给另一个进程,并使用管道连接这两个进程。

0

我以前用#pragma的做过。目前我没有实际的代码,但我认为类似这样的东西可能适用于Visual Studio 2008 C++:

//put this code in a dll that both processes link to 
#pragma section("shared",read,write,shared) 

__declspec(allocate("shared")) 
int i = 0; // in theory, both processes should be able to access and modify i 
+0

DLL共享内存段是从传统的16位dos日中保留下来的,并且有许多缺点(主要是安全漏洞) - 所以通常最好避免它们。为了实现这种功能,最好使用共享内存或内存映射文件的操作系统API。 – 2010-08-27 16:28:07