CreateProcessAsUser,调用dll函数

时间:2012-06-25 12:31:33

标签: c# winapi createprocessasuser

使用CreateProcessAsUser,我可以在硬盘上的某处调用.exe文件:

CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine,
                      ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes,
                      bool bInheritHandle, Int32 dwCreationFlags, IntPtr lpEnvrionment,
                      string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo,
                      ref PROCESS_INFORMATION lpProcessInformation);

我在网上找到的每个例子都使用lpCommandLine参数来调用程序。 我想在dll中调用一个函数。 有谁知道这是否可能?如果有一个例子会很高兴......

谢谢!

2 个答案:

答案 0 :(得分:2)

您无法直接将DLL作为其他用户调用,因为用户/执行级别是每个进程,而不是DLL或线程。您必须启动一个新进程,然后调用DLL。这是使用的技术 COM提升等。如果DLL具有正确的签名,您可以尝试使用rundll32.exe调用它。

答案 1 :(得分:0)

我觉得这个功能不可能。在dll中调用方法的标准方法是使用LoadLibraryGetProcAddress方法,如下例所示:

(取自MSDN

// A simple program that uses LoadLibrary and 
// GetProcAddress to access myPuts from Myputs.dll. 

#include <windows.h> 
#include <stdio.h> 

typedef int (__cdecl *MYPROC)(LPWSTR); 

int main( void ) 
{ 
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(TEXT("MyPuts.dll")); 

    // If the handle is valid, try to get the function address.

    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 

        // If the function address is valid, call the function.

        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) (L"Message sent to the DLL function\n"); 
        }
        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib); 
    } 

    // If unable to call the DLL function, use an alternative.
    if (! fRunTimeLinkSuccess) 
        printf("Message printed from executable\n"); 

    return 0;

}