我在做这是使用GameSpy的C代码(在GP部分)C#应用程序。 C代码是调用回调(这是C#代码)成功地,但我得到这个错误Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call
回调完成之后。 我做了一个DLL出的C代码,如下所示:
// GPCallback
/////////////
__declspec(dllexport) typedef void (* GPCallback)(
GPConnection * connection,
void * arg,
void * param
);
// gpConnect
////////////
__declspec(dllexport) GPResult gpConnect
(
GPConnection * connection,
const gsi_char nick[GP_NICK_LEN],
const gsi_char email[GP_EMAIL_LEN],
const gsi_char password[GP_PASSWORD_LEN],
GPEnum firewall,
GPEnum blocking,
GPCallback callback,
void * param
);
C#是调用它像这样:
unsafe public delegate void GPCallback(
GPConnection * connection,
//GPConnectResponseArg arg,
IntPtr arg,
IntPtr param
);
[DllImport("saketestd.dll")]
unsafe static extern GPResult gpConnect(
GPConnection * connection,
gsi_char nick,
gsi_char email,
gsi_char password,
GPEnum firewall,
GPEnum blocking,
GPCallback callback,
IntPtr param
);
unsafe public bool gpConnectE() {
bool ret = false;
try {
GPResult res;
debug.AddLine(this.getMethodName() + ": " + "connection before connect: " + connection.ToString("x"));
fixed (int* pconn = &connection) {
res = gpConnect(
pconn,
this.NICK,
this.EMAIL,
this.PASSWORD,
GPEnum.GP_NO_FIREWALL,
GPEnum.GP_BLOCKING,
new GPCallback(this.ConnectResponse),
IntPtr.Zero
);
}
debug.AddLine(this.getMethodName() + ": " + "connection after connect: " + connection.ToString("x"));
if (res != GPResult.GP_NO_ERROR) {
debug.AddLine(this.getMethodName() + ": " + "failed: " + res);
} else {
debug.AddLine(this.getMethodName() + ": " + "OK");
ret = true;
}
} catch (Exception ex) {
debug.Text += ex.ToString();
}
return ret;
}
unsafe public void ConnectResponse(
GPConnection * connection,
//GPConnectResponseArg arg,
IntPtr argPtr,
IntPtr param
) {
debug.AddLine(this.getMethodName() + " called with connection: " + (*connection).ToString("x"));
GPConnectResponseArg arg;
arg = (GPConnectResponseArg)Marshal.PtrToStructure(argPtr, typeof(GPConnectResponseArg));
if (arg.result == GPResult.GP_NO_ERROR) {
debug.AddLine(this.getMethodName() + ": Connected to GP");
this.profileid = arg.profile;
} else {
debug.AddLine(this.getMethodName() + ": failed");
debug.AddLine(this.getMethodName() + ": result: " + arg.result);
debug.AddLine(this.getMethodName() + ": profile: " + arg.profile);
debug.AddLine(this.getMethodName() + ": uniquenick: " + arg.uniquenick);
}
}
我相信,我需要清除栈在我的回调或更改DLL调用约定(这可能吗?)。 任何其他的想法?