这是我的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
属性。