2011-11-18 116 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

相關問題