将字符串从c#传递到c dll时的错误行为

将字符串从c#传递到c dll时的错误行为,c#,c,winapi,dllimport,C#,C,Winapi,Dllimport,我对我的问题进行了大量研究,发现了许多与[如何将字符串从c#传递到cdll]相关的问题: 但是他们都帮不了我。我更愿意以任何方式问我的问题: 简要说明: 我的c函数在c#中正常工作,仅当我从以下位置交换GetProcessIntegrityLevel参数时(在cdll中以及在c#import dll中): BOOL-GetProcessIntegrityLevel(DWORD-dwPID,LPSTR-szIntegrityLevel) 对于这一点: BOOL-GetProcessIn

我对我的问题进行了大量研究,发现了许多与[如何将字符串从
c#
传递到
c
dll]相关的问题:

但是他们都帮不了我。我更愿意以任何方式问我的问题:


简要说明:
我的
c
函数在
c#
中正常工作,仅当我从以下位置交换
GetProcessIntegrityLevel
参数时(在
c
dll中以及在
c#
import dll中):

  • BOOL-GetProcessIntegrityLevel(DWORD-dwPID,LPSTR-szIntegrityLevel)
  • 对于这一点:

  • BOOL-GetProcessIntegrityLevel(LPSTR-szIntegrityLevel,DWORD-dwPID)
  • 在第一种状态下,我的程序工作正常,并更改了
    LPSTR szIntegrityLevel
    ,但在第二种状态下,它不工作,
    LPSTR szIntegrityLevel
    与任何pid一起始终为空


    我创建了一个
    c
    dll库,其中声明了以下
    c
    函数,该函数通过pid获取进程的
    完整性级别

    #define         MAX_INTEGRITY_LEVEL_LENGTH                  30
    extern "C"
    {
        __declspec(dllexport) BOOL GetProcessIntegrityLevel(DWORD dwPID, LPSTR szIntegrityLevel);
    }
    
    C函数实现:

    __declspec(dllexport) BOOL GetProcessIntegrityLevel(LPSTR szIntegrityLevel, DWORD dwPID);
    
    并按如下方式调用
    c#
    中的函数:

    // Integrity level
    StringBuilder integrityLevel = new StringBuilder(200);
    
    if(GetProcessIntegrityLevel(11684, integrityLevel) == true)
    {
          MessageBox.Show(integrityLevel.ToString());
    }
    
    在这种状态下,当我运行程序时,
    GetProcessIntegrityLevel()
    返回
    true
    ,但是对于任何
    pid
    ,消息框中的
    integrityLevel
    总是空的

    ‌令人惊讶的是,当我在
    c
    函数和
    c#
    函数中交换参数时,它确实起作用了:

    __declspec(dllexport) BOOL GetProcessIntegrityLevel(LPSTR szIntegrityLevel, DWORD dwPID);
    
    这对我来说很奇怪。我还尝试了
    marshallas(UnmanagedType.LPStr)]
    ,但得到了相同的结果。

    在C#
    中,ulong
    是一种64位类型。PID参数为
    DWORD
    ,为32位参数


    将C#参数声明从
    ulong
    更改为
    uint
    ,以解决此问题。

    我对其他函数有此问题,它们几乎都有
    DWORD
    类型,我应该测试它们。无论如何,谢谢你。
    __declspec(dllexport) BOOL GetProcessIntegrityLevel(LPSTR szIntegrityLevel, DWORD dwPID);