这是我的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,这是我发布的当前代码所做的事情。
答案 0 :(得分:1)
问题是C#long
是64位宽,但Windows上的C ++ long
是32位宽。 pinvoke应该是:
[DllImport("Tomb.dll")]
public static extern uint InjectManualMap(uint pId, string dllPath);
请注意,我还删除了不需要的unsafe
指令和MarshalAs
属性。