2013-04-18 4 views
2

확장 기능에서 함수에 C- 콜백을 전달하는 마멀레이드 확장 프로그램 및 샘플 앱이 있는데 확장 프로그램이 함수 호출을 시도 할 때마다 신비한 메시지와 충돌합니다 :콜백 호출시 앱 -> 확장 프로그램 충돌

예외 유형 : EXC_BAD_ACCESS (SIGSEGV) 예외 코드 : KERN_INVALID_ADDRESS 0x00000008 추락 한 스레드에서 : 0

내가 함수를 호출하기 전에 나는 그것이 주소의 그것은 다르다 유효한 것 같다 인쇄, 비록. 그래서 마멀레이드의 제한이나 내가 뭔가 잘못하고 있는거야?

p.s : 알아 두어야 할 점 clang (gcc 아님)으로 내 마멀레이드 확장을 컴파일하면 모든 것이 잘 작동하지만 콜백 (callbacks ...)하기 전에 기본 마멀레이드 gcc를 사용했지만 완전히 동일한 문제가있었습니다.

샘플 응용 프로그램 :

class CDemoApp { 
public: 
    static CDemoApp* getInstance() { 
     static CDemoApp instance; 
     return &instance; 
    } 

    void setup() 
    { 
     app = CreateApp(); 
     window = CreateWindow(); 
     app->AddWindow(window); 
     view = CreateView("canvas"); 

     button = CreateButton(); 

     button->SetEventHandler("click", (void*)NULL, CDemoApp::onButton1Click); 

     view->AddChild(button); 
     window->SetChild(view); 

     app->ShowWindow(window); 
    } 

    void run() { 
     app->Run(); 
    } 

    static void onSDKInit(const char* err, void* context) { 
     printf("Done.\n"); 
    } 

    static bool onButton1Click(void* data, CButton* button) { 
     if(!s3eMyExtDidInitialize()) { 
      // crash happens here. 
      // extension doesn't perform any ops, just calls the callback with dummy arguments 
      s3eMyExtDoInitialize(APP_ID, APP_SECRET, CDemoApp::onSDKInit, NULL); 
     } 

     return true; 
    } 

private: 
    CDemoApp() {}; 

private: 
    CAppPtr app; 
    CWindowPtr window; 
    CViewPtr view; 
    CButtonPtr button; 
}; 

// Main entry point for the application 
int main() 
{ 
    if(!s3eMyExtAvailable()) 
    { 
     s3eDebugErrorShow(S3E_MESSAGE_CONTINUE, "My extension is not found"); 
     return 0; 
    } 

    CDemoApp::getInstance()->setup(); 
    CDemoApp::getInstance()->run(); 

    return 0; 
} 

확장 노출 기능 s3eMyExtDoInitialize은 다음과 같습니다

typedef void (*my_callback)(const char* error, void* context); 
void s3eMyExtDoInitialize_platform(const char* appId, const char* appSecret, my_callback callback, void* context) { 
    callback(NULL, NULL); 
} 

답변

1

음, 분명히 직접 확장에 응용 프로그램에서 함수 포인터를 전달하는 방법은 마멀레이드, 그래서이 없다 일을 시작하기 위해 활용되어야하는 자체 콜백 시스템을 제공합니다.