StackoverflowException при вызове управляемого кода из неуправляемого - PullRequest
2 голосов
/ 19 ноября 2011

Я пытаюсь создать 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 Ответ

2 голосов
/ 19 ноября 2011

Я не знаю, что именно вы делаете, но это

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

должна быть функцией обратного вызова Windows, верно? Почти все обратные вызовы используют stdcall, поэтому

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

может заставить это работать. Конечно, вам нужно добавить __stdcall к функции, которую вы тоже передаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...