Posted October 5, 200717 yr I would appreciate any assistance you can offer. To the quick here is my issue: I am getting a System.AccessViolationException when attempting to read the channel on the server side. I am using: //All C# 2005 //I believe i have to call VirtualChannelOpen() again eventhough I have a pointer //eitherway I get the same exception IntPtr intHandle = RDPManager.WTSVirtualChannelOpen(IntPtr.Zero, -1, "Impact") RDPManager.WTSVirtualChannelRead(intHandle, intTimeOut, bytes, bytes.Length, ref written) //The API Call looks like [DllImport("Wtsapi32.dll", SetLastError = true)] public static extern bool WTSVirtualChannelRead(IntPtr hChannelHandle, ulong timeout, byte[] Buffer, int Length, ref int pBytesWritten) Here is how I got there: Currently I am working with documentation found: http://www.microsoft.com/technet/archive/termsrv/maintain/featusability/tsrvapi.mspx?mfr=true http://msdn2.microsoft.com/en-us/library/aa383580.aspx http://msdn2.microsoft.com/en-us/library/aa383853.aspx http://www.codeproject.com/cs/system/TSAddinInCS.asp?df=100&forumid=358838&exp=0&select=1961960 That is all I can really find about the topic. I am still having problems with WTSVirtualChannelRead, at least I think I am. Nothing seems to be writtin. Here is a brief overview of What I have done: I created a messagelib that will contain messages I am sending back and forth. Class MessageHeader int MessageType MessageBase Message Abstract Class MessageBase Class StatusMessage: MessageBase String StatusText Now on my session component I do: 1. Call WTSVirtualChannelOpen to get a handle on the channel 2. Create a StatusMessage StatusText = "ACK" 3. Serialize the message 4. Send the message Now on my client component I do: 1. VirtualChannelEntry waits to be called (This is what loads the assembly), store the handle in mHandle point my VirtualChannelInit to the function VirtualChannelInitEventProc 2. Once the VirtualChannelInitEventProc determines that a complete message was send over, I deserialize and process the message 3. Determine the type of message that was send (type == 1 //StatusMessage) 4. Determine what the StatusText is "ACK" 5. Generate a reply StatusMessage "NACK" 6. Serialize the message 7. Send the message a. open the channel using the WTSVirtualChannelOpen(mHandle,-1, "Impact"), store the new pointer in intTemp b. write the data using WTSVirtualChannelWrite at this point, I believe my data is waiting for the server to pick it up. I get a true returned from WTSVirtualChannelWrite Back to the session component I have a background worker process that is monitoring for pending messages. 1. Open the channel with WTSVirtualChannelOpen 2. Read until there is nothing left to read, add the read bytes into list<byte> using WTSVirtualChannelRead 3. If anything was read a. Deserialize the MessageHeader b. Determine Message Type (type == 1//StatusMessage) c. Report StatusText "NACK" //At this point, nothing is read by the WTSVirtualChannelRead. I don't know where my message is. I am getting a System.AccessViolationException when attempting to read the channel. I am using: //I believe i have to call VirtualChannelOpen() again eventhough I have a pointer //eitherway I get the same exception IntPtr intHandle = RDPManager.VirtualChannelOpen(IntPtr.Zero, -1, "Impact") RDPManager.VirtualChannelRead(intHandle, intTimeOut, bytes, bytes.Length, ref written) //The API Call looks like [DllImport("Wtsapi32.dll", SetLastError = true)] public static extern bool WTSVirtualChannelRead(IntPtr hChannelHandle, ulong timeout, byte[] Buffer, int Length, ref int pBytesWritten) Does anyone have any ideas of where to start? BTW, I am using C# 2005. But the concept should be the same. Server: Win2K3 server with Terminal Services Installed Client: WinXP workstation with platform SDK installed Thanks in advance.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.