为什么坏的指针从C#传递到我的本机导出方法?

时间:2014-08-06 05:40:22

标签: c# c++ dll pinvoke code-injection

这是我的C#代码:

    [DllImport("Tomb.dll")]
    public static extern unsafe uint InjectManualMap(ulong pId, [MarshalAs(UnmanagedType.LPCStr)]string dllPath);

无论出于何种原因我尝试使用我的C ++代码:

extern "C" DllExport unsigned int StdCall InjectManualMap(unsigned long pid, const char* dllPath) {
     ManualMapInjector* mmp = new ManualMapInjector;
     std::string dll(dllPath);
     unsigned int kk = mmp->Inject(pid, dll);
     delete mmp;
     return kk;
}

const char * dllPath始终是一个错误的指针(0x000000000)。 我不确定这里发生了什么,因为所有其他解决方案都指向使用StringBuilder(测试它,做同样的事情),或者使用MarshalAs,这是我发布的当前代码所做的事情。

1 个答案:

答案 0 :(得分:1)

问题是C#long是64位宽,但Windows上的C ++ long是32位宽。 pinvoke应该是:

[DllImport("Tomb.dll")]
public static extern uint InjectManualMap(uint pId, string dllPath);

请注意,我还删除了不需要的unsafe指令和MarshalAs属性。