Hi,
I am having problems with my c# wrapper for sipxtapi that is based on
the VB one on the SIPfoundary site. My code is producing the following
exception "Attempted to read or write protected memory. This is often an
indication that other memory is corrupt." This happens when I call the
sipxAudioGetOutputDevice via the following DLLImport statement and it is
the last argument that is causing the problem.
[DllImport(SipxConfig.SIPXTAPI_DLL, SetLastError = true,
CallingConvention = CallingConvention.Cdecl, EntryPoint =
"sipxAudioGetOutputDevice")]
protected static extern SipxResult SipxAudioGetOutputDevice(IntPtr
instanceHandle, int deviceNumber, ref String deviceName);
If I remove the ref modifier and it doesn't crash but I get rubish back.
I have tried String and string types as well as StringBuilder and also
the out modifier instead of the ref but nothing has worked.
It was working fine and the problem seems to have started with my
installation of Vista SP1. I originally googled and found people
haveing problems with DEP (Data Execution Prevention) but turned this
off without effect.
I am using Visual studio 2005 and a recent (2 days ago) checkout of
sipxtapi. Sipxtapi itself compiles and I can run the example
placecall.exe sucessfully which makes me think it is the way I am using
PInvoke. I am calling SipxAudioGetNumInputDevices a few lines earlier
and that works OK so it isn't something fundamental with calling
sipxtapi but specific to this bit of code.
Apparently some of the .net CLR stuff has tightened up of pointer
handling in the latest service pack (not that I know what that means) so
this may have been wrong before and is only now showing up.
Has anyone any ideas what else I can try?
Code below
Cheers
Joe
public System.Collections.Generic.List<string>
GetDevices(SipxMediaDeviceType type)
{
System.Collections.Generic.List<string> rv = new
System.Collections.Generic.List<string>();
// Display the list of input devices
int NumberOfDevices = 0;
String DeviceName = "";
SipxResult MySipxResult;
if (type == SipxMediaDeviceType.Input)
{
MySipxResult =
SipxAudioGetNumInputDevices(m_Instance.InstanceHandle, ref
NumberOfDevices);
}
else
{
MySipxResult =
SipxAudioGetNumOutputDevices(m_Instance.InstanceHandle, ref
NumberOfDevices);
}
if (MySipxResult != SipxResult.Success)
{
throw new SipxException(MySipxResult);
}
else
{
for (int i = 0; i <= NumberOfDevices - 1; i++)
{
if (type == SipxMediaDeviceType.Input)
{
MySipxResult =
SipxAudioGetInputDevice(m_Instance.InstanceHandle, i, ref DeviceName);
}
else
{
MySipxResult =
SipxAudioGetOutputDevice(m_Instance.InstanceHandle, i,ref DeviceName);
//This line fails!
}
if (MySipxResult != SipxResult.Success)
{
throw new SipxException(MySipxResult);
}
else
{
rv.Add(DeviceName.ToString());
}
}
}
return rv;
}
_______________________________________________
sipxtapi-dev mailing list
[email protected]
List Archive: http://list.sipfoundry.org/archive/sipxtapi-dev/