2010-12-12 76 views
0

我在.mm從目標C++

void MyMIDINotifyProc(const MIDINotification *message, void *refCon);

,與此線

MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);

然後MyMIDINotifyProc被從稱爲變爲有這樣的代碼轉換爲目標C CoreMIDI。

在不改變文件擴展名的.m,我翻譯成一個OBJ-C簽名:

@interface MidiInput (Private) 
    -(void) MyMIDINotifyProc:(const MIDINotification *)message reference:(void *)refCon; 
@end 

其編譯,但我不知道該怎麼做的MIDIClientCreate線。因爲它產生了"MyMIDINotifyProc" was not declared in this scope。它應該是void *類型...並且文檔100%清楚,它是A refCon passed back to notifyRefConlink)。

這個問題在Obj-C中可以解決嗎?我想我必須將C++的東西翻譯成C語言,在這種情況下,我會放棄它。

回答

3

MIDIClientCreate期望一個普通的C函數作爲它的回調。因爲調用約定是不同的(用C語言說,Objective-C方法的前兩個參數是self_cmd-選擇器 - 對於普通的C函數,它不在那裏) )。

通常的解決方法是創建一個充當墊片的C函數,並明確地將self作爲參數傳遞。然後shim函數立即發送objective-C消息。我對這個庫不熟悉,但它看起來像refCon是爲這種事情設計的參數。所以在你的.m文件中你需要一個這樣的功能。

static void MyMIDINotifyProc(const MIDINotification *message, void *refCon) 
{ 
    [(id) refCon MIDINotify: message]; 
} 

你還需要一個方法做實際的東西:

-(void) MIDINotify: (const MIDINotification*) message 
{ 
    // do stuff 
} 

你打電話MIDIClientCreate完全按照你最初做的事情。

+0

謝謝,+1,我會在接受這個答案後,我消化它(或一次XCode不會;))。 – 2010-12-12 20:01:17