我正在尝试使用一些函数创建一个混合模式dll,用于调用托管代码,例如Delphi和C ++。
我得到了它的工作,但现在我只在调试器中得到System.StackoverflowException,我想知道我做错了什么。
代码非常简单
unmanaged.h
#pragma once
#pragma unmanaged
#include <Windows.h>
typedef void (*ByteCallback)(unsigned char * bytes, int len);
namespace Something {
extern "C"{
__declspec(dllexport) void InteropInit(ByteCallback responseCallback, ByteCallback requestInformationCallback);
}
};
unmanaged.cpp
#include "Stdafx.h"
#include "Managed.h"
#include "Unmanaged.h"
#pragma unmanaged
namespace Something{
void InteropInit(ByteCallback responseCallback, ByteCallback requestInformationCallback) {
Something::ManagedInit();
}
};
managed.h
#include "Stdafx.h"
#pragma managed
namespace Something{
void ManagedInit();
};
managed.cpp
#include "Stdafx.h"
#include "Managed.h"
#include <string>
#pragma managed
namespace Something {
void ManagedInit() {
System::Console::WriteLine("Hallo");
};
};
Stacktrace(这种情况一直持续到视觉工作室不再显示任何行)
ntdll.dll!_RtlpCallVectoredHandlers@12() + 0x2f244 bytes
ntdll.dll!_RtlCallVectoredExceptionHandlers@8() + 0x12 bytes
ntdll.dll!_RtlDispatchException@8() + 0x19 bytes
ntdll.dll!_KiUserExceptionDispatcher@8() + 0xf bytes
ntdll.dll!_RtlpCallVectoredHandlers@12() + 0x2f244 bytes
ntdll.dll!_RtlCallVectoredExceptionHandlers@8() + 0x12 bytes
ntdll.dll!_RtlDispatchException@8() + 0x19 bytes
ntdll.dll!_KiUserExceptionDispatcher@8() + 0xf bytes
有人可以帮助我吗?
答案 0 :(得分:2)
我不知道你在做什么,但是这个
typedef void (*ByteCallback)(unsigned char * bytes, int len);
应该是一个Windows回调函数,对吗?几乎所有的回调都使用stdcall,所以
typedef void (__stdcall *ByteCallback)(unsigned char * bytes, int len);
可能会让它发挥作用。当然,您需要将__stdcall
添加到您传递的功能中。