Click here to Skip to main content
15,884,176 members
Home / Discussions / C#
   

C#

 
GeneralRe: Destructor peculiarity Pin
Luc Pattyn27-Oct-09 7:09
sitebuilderLuc Pattyn27-Oct-09 7:09 
GeneralRe: Destructor peculiarity Pin
DaveyM6927-Oct-09 10:45
professionalDaveyM6927-Oct-09 10:45 
GeneralRe: Destructor peculiarity Pin
Luc Pattyn27-Oct-09 11:17
sitebuilderLuc Pattyn27-Oct-09 11:17 
GeneralRe: Destructor progress report 1 Pin
Luc Pattyn27-Oct-09 17:20
sitebuilderLuc Pattyn27-Oct-09 17:20 
GeneralRe: Destructor progress report 1 Pin
DaveyM6928-Oct-09 8:58
professionalDaveyM6928-Oct-09 8:58 
GeneralRe: Destructor progress report 1 Pin
Luc Pattyn28-Oct-09 9:54
sitebuilderLuc Pattyn28-Oct-09 9:54 
GeneralRe: Destructor progress report 1 Pin
DaveyM6928-Oct-09 10:52
professionalDaveyM6928-Oct-09 10:52 
GeneralRe: Destructor progress report 1 Pin
DaveyM6928-Oct-09 22:19
professionalDaveyM6928-Oct-09 22:19 
After sleeping on it, I'm pretty sure that the callback is the source of the issues that prevent me from using the finalizer (either with or without Dispose) to close the port. It's clearer to see in code! Is there any reliable way to prolong the life of a delegate instance?
C#
using System;
using System.Runtime.InteropServices;

public class Output
{
    private const int CALLBACK_FUNCTION = 0x00030000;
    private const int MOM_CLOSE = 0x3C8;
    private const int MOM_OPEN = 0x3C7;

    private delegate void MidiProc(
        IntPtr hMidi,
        int wMsg,
        int dwInstance,
        int dwParam1,
        int dwParam2);

    [DllImport("winmm.dll")]
    private static extern int midiOutClose(
        IntPtr hmo
        );

    [DllImport("winmm.dll")]
    private static extern int midiOutOpen(
        out IntPtr lphmo,
        int uDeviceID,
        MidiProc dwCallback,
        int dwCallbackInstance,
        int dwFlags
        );

    private MidiProc callback;
    private IntPtr handle;
    private int id;

    public Output(int id)
    {
        callback = OnCallback;
        handle = IntPtr.Zero;
        this.id = id;
    }
    ~Output() // Unreliable as no way to determine when this will be called
    {
        Close();
    } /* MIDI sub sytem will now use callback to send MIM_CLOSE if
       * Output was open but callback may have been collected */

    public void Close()
    {
        if (handle != IntPtr.Zero)
        {
            midiOutClose(handle);
            handle = IntPtr.Zero;
        }
    }
    private void OnCallback(
        IntPtr hMidi, int wMsg, int dwInstance, int dwParam1, int dwParam2)
    {
        // ...
    }
    public void Open()
    {
        if (handle == IntPtr.Zero)
            midiOutOpen(
                out handle, id, callback, id, CALLBACK_FUNCTION);
    }
}


Dave

"My code works, but I don't understand why!" - DaveyM69 (Me)
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)
Why are you using VB6? Do you hate yourself? (Christian Graus)

GeneralRe: Destructor progress report 1 Pin
DaveyM6928-Oct-09 9:35
professionalDaveyM6928-Oct-09 9:35 
QuestionTheading problem Pin
Rick van Woudenberg23-Oct-09 0:52
Rick van Woudenberg23-Oct-09 0:52 
AnswerRe: Theading problem Pin
Not Active23-Oct-09 2:49
mentorNot Active23-Oct-09 2:49 
Questionneed some quick help thx : how can i access and open form2 from form1 menu item Pin
KIM K23-Oct-09 0:48
KIM K23-Oct-09 0:48 
AnswerRe: need some quick help thx : how can i access and open form2 from form1 menu item Pin
nagendrathecoder23-Oct-09 0:55
nagendrathecoder23-Oct-09 0:55 
AnswerRe: need some quick help thx : how can i access and open form2 from form1 menu item Pin
Rick van Woudenberg23-Oct-09 0:57
Rick van Woudenberg23-Oct-09 0:57 
Questionhow to update progressbar in Child Form from Parent Form Pin
sandy_55723-Oct-09 0:39
sandy_55723-Oct-09 0:39 
AnswerRe: how to update progressbar in Child Form from Parent Form Pin
Rick van Woudenberg23-Oct-09 1:03
Rick van Woudenberg23-Oct-09 1:03 
GeneralRe: how to update progressbar in Child Form from Parent Form Pin
benjymous23-Oct-09 1:08
benjymous23-Oct-09 1:08 
GeneralRe: how to update progressbar in Child Form from Parent Form Pin
sandy_55723-Oct-09 2:16
sandy_55723-Oct-09 2:16 
AnswerRe: how to update progressbar in Child Form from Parent Form Pin
benjymous23-Oct-09 1:07
benjymous23-Oct-09 1:07 
QuestionDisplaying Chinese characters Crystal reports Pin
dasha_pl23-Oct-09 0:31
dasha_pl23-Oct-09 0:31 
QuestionWhy cant i do this? Pin
ONeil Tomlinson22-Oct-09 23:48
ONeil Tomlinson22-Oct-09 23:48 
AnswerRe: Why cant i do this? Pin
Calla22-Oct-09 23:50
Calla22-Oct-09 23:50 
AnswerRe: Why cant i do this? Pin
Christian Graus23-Oct-09 0:08
protectorChristian Graus23-Oct-09 0:08 
AnswerRe: Why cant i do this? Pin
dxlee23-Oct-09 5:00
dxlee23-Oct-09 5:00 
QuestionLast grandchild of a node in a tree Pin
devboycpp22-Oct-09 23:17
devboycpp22-Oct-09 23:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.