2011-11-18 114 views
2

我正在尝试创建一个混合模式dll,其中包含一些用于调用托管代码的函数,如说,Delphi和C++。从非托管调用托管代码时发生StackoverflowException

我得到它的工作,但现在我只是在调试器中得到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"); 
}; 
}; 

堆栈跟踪(这推移和进行,直到Visual Studio中不会显示任何行)

[email protected]() + 0x2f244 bytes 
[email protected]() + 0x12 bytes 
[email protected]() + 0x19 bytes 
[email protected]() + 0xf bytes 
[email protected]() + 0x2f244 bytes 
[email protected]() + 0x12 bytes 
[email protected]() + 0x19 bytes 
[email protected]() + 0xf bytes 

有人能帮助我吗?

+0

它看起来像是在某处抛出一些异常。您是否尝试过调试并找出它是什么? – svick

+0

您的真实代码是否不使用'responseCallback'和'requestInformationCallback',或者您是否过分简化了您的问题? – ildjarn

+0

它在调试器中,我得到了你在这里看到的stackoverflowexception和stacktrace。 – Thomas

回答

2

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

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

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

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

可能会使它工作。当然,您需要将__stdcall添加到您传递的函数中。

+0

当然......我现在觉得自己有点愚蠢。我使用了stdcall,我从那里调用Init。这解决了这个问题。 – Thomas

相关问题