这是我的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,这是我当前发布的代码。

最佳答案

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

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

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

08-28 06:29