从非托管调用托管代码时出现StackoverflowException

时间:2011-11-18 20:41:24

标签: c++ c++-cli

我正在尝试使用一些函数创建一个混合模式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   

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我不知道你在做什么,但是这个

typedef void (*ByteCallback)(unsigned char * bytes, int len);

应该是一个Windows回调函数,对吗?几乎所有的回调都使用stdcall,所以

typedef void (__stdcall *ByteCallback)(unsigned char * bytes, int len);

可能会让它发挥作用。当然,您需要将__stdcall添加到您传递的功能中。