2011-11-18 16 views
2

私は、デルファイとC++のマネージコードを呼び出すためにエクスポートされたいくつかの関数を持つ混合モードdllを作成しようとしています。マネージコードをアンマネージから呼び出すとき

私はそれを動作させましたが、今は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

もちろん...私は今、愚かなビットの愚かさを感じる。私はInitと呼んでいた場所でstdcallを使いました。これは問題を解決しました。 – Thomas

関連する問題