Click here to Skip to main content
Click here to Skip to main content

Streaming Server using Direct Show and Windows Media Format

By , 13 May 2010
 
Server.JPG

Introduction

This article discusses how to stream video over network using DirectShow and Windows Media Format SDK. I am using WMAsfWriter to write the media sample to the port. Here I tried to explain streaming live video source like Webcam over network.

Background

In my recent article, I have explained how to capture an image from a streaming URL using DShow. After that, I tried to create my own streaming server like Windows Media encoder. Also I saw some queries about the same on the internet too. At last, I implemented this using some references from MSDN and the web. I hope my sample code will support someone in solving their problem.

Setting Up Your Visual Studio Project

You need to add header files from the Windows Platform SDK and the DShow base classes to your include path. The project has to be linked with Strmbase.lib and WMVCORE.lib.

#include "atlbase.h" 	// for using atl support 
#include "dshow.h"   	// DirectShow header 
#include "wmsdk.h" 	// Windows media format SDK 
#include "Dshowasf.h" 	// For asf support 

Using the Code

The following DShow interfaces will be used in this article:

IGraphBuilder  *m_pGraph ; 		//Graph builder 
IBaseFilter *m_pVidDeviceFilter; 	//video device filter 
IBaseFilter *m_pAudDeviceFilter; 	//Audio device filter 
IMediaControl *m_pMediaControl; 	//Media control for running the graph 
IMediaEvent *m_pEvent ; 		//Media Event interface for capture the media events
IBaseFilter *m_pWMASFWritter ; 	//The WMASFWriter filter is a wrapper for the 
				//WMWriter object(from WMF) which can multiplux 
				//the streams into an ASF file and write the ASF 
				//stream to any IWMWriterSink object.
				//It is from wmf SDK. 
IFileSinkFilter* m_pFileSinkFilter;	//A file sink filter in a video capture filter graph,
				//for instance, writes the output of the video 
				//compression filter to a file. 
				//If a filter needs the name of an output file, 
				//it should expose this interface to allow 
				//an application to set the file name. 
IWMWriterAdvanced2 *m_pWriter2 ; 	//provides the ability to set and retrieve 
				//named settings for an input. It is from WMF SDK. 
IWMWriterNetworkSink *m_pNetSink;	//is used to deliver streams to the network. 
IServiceProvider *m_pProvider ;	//Defines a mechanism for retrieving a service object;
				//that is, an object that provides custom support to 
				//other objects. Here we used to get the 
				//IWMWriterAdvanced2 interface instance. 

We can start with the CoInitialize because here we are going to work with COM. Then we need a filter graph to creating the capture graph.

HRESULT hr = CoInitialize(NULL); 
if(FAILED(hr)) 
	return FALSE;

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
	IID_IGraphBuilder, (void **)&m_pGraph); 

if(FAILED(hr)) 
	return FALSE;

Here we need the input devices for getting the streams for streaming. The following function will retrieve the audio and video devices:

GetDevices(CString strDevName,IBaseFilter **pFilter,BOOL bVideo)
{
	try
	{
		CoInitialize(NULL);
		ULONG cRetrieved;
		IMoniker *pM;
		
		// enumerate all video capture devices
		CComPtr<icreatedevenum> pCreateDevEnum;
		HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, 
				NULL, CLSCTX_INPROC_SERVER,
				IID_ICreateDevEnum, (void**)&pCreateDevEnum);
		if (FAILED(hr)) 
		{
			return FALSE;
		}

		CComPtr<ienummoniker> pEm;

		if(bVideo)
		{
			hr = pCreateDevEnum->CreateClassEnumerator
				(CLSID_VideoInputDeviceCategory,
				&pEm, 0);
		}
		else
		{
	 		hr = pCreateDevEnum->CreateClassEnumerator
				(CLSID_AudioInputDeviceCategory,s
					&pEm, 0);
		}

		if (FAILED(hr)) 
		{

			return FALSE;
		}

		pEm->Reset();
		
		while(hr = pEm->Next(1, &pM, &cRetrieved), hr==S_OK)
		{
			IPropertyBag *pBag;
			hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
			if(SUCCEEDED(hr)) 
			{
				VARIANT var;
				var.vt = VT_BSTR;
				hr = pBag->Read(L"FriendlyName", &var, NULL);
				if (hr == NOERROR) 
				{
					TCHAR strdev[2048];		
					WideCharToMultiByte
					(CP_ACP,0,var.bstrVal, -1, strdev, 
					2048, NULL, NULL);
					if(strDevName==strdev)
					{
						pM->BindToObject(0, 0, 
						IID_IBaseFilter, (void**)pFilter);
						break;
					}

					SysFreeString(var.bstrVal);
				}
				pBag->Release();
			}
			pM->Release();
		}
		return TRUE;
	}
	catch(...)
	{
		return FALSE;
	}
}

if(!GetDevices(strVidDevName, &m_pVidDeviceFilter,TRUE))
	return FALSE;

if(!GetDevices(strAudDevName, &m_pAudDeviceFilter,FALSE))
	return FALSE;

and add these filters to graph.

hr=m_pGraph->AddFilter(m_pVidDeviceFilter,L"Vid Capture Filter");
	if(FAILED(hr)) 
		return FALSE;

	hr=m_pGraph->AddFilter(m_pAudDeviceFilter,L"Aud Capture Filter");
	if(FAILED(hr)) 
		return FALSE;

Create an instance of WMAsfWriter for writing the streams to writer sink.

hr = CoCreateInstance(CLSID_WMAsfWriter,NULL,CLSCTX_INPROC_SERVER, 
                      IID_IBaseFilter, (void **) &m_pWMASFWritter); 

	if(FAILED(hr)) 
		return FALSE;

	hr=m_pGraph->AddFilter(m_pWMASFWritter,L"ASF Writter");
	if(FAILED(hr)) 
		return FALSE;

Then query the file sink filter from asf writer for setting up the file name where the streams temporarily write. Once you completed the streaming, you will get an empty file with size 0 bytes.

hr = m_pWMASFWritter->QueryInterface
	( IID_IFileSinkFilter, (void**)&m_pFileSinkFilter );
	if(FAILED(hr)) 
		return FALSE;

	hr = m_pFileSinkFilter->SetFileName(L"C:\\test.wmv", NULL);
	if(FAILED(hr)) 
		return FALSE;

Here we can use the IServiceProvider interface to get the IWMWriterAdvanced2 instance for creating the writer network sink.

if (FAILED(hr = m_pWMASFWritter->QueryInterface(IID_IServiceProvider, 
	(void**)&m_pProvider)))
	{
		AfxMessageBox("Getting service provider failed");
		return FALSE;
	}

	if (FAILED(hr = m_pProvider->QueryService(IID_IWMWriterAdvanced2, 
		IID_IWMWriterAdvanced2, (void**)&m_pWriter2)))
	{
		AfxMessageBox ("Query Service failed");
		return FALSE;
	}

Setting the live source as true.IWMWriterAdvanced::SetLiveSource tells the writer whether the source of the data is expected to be running in real time or not. Also remove the default sink in the writer.

if (FAILED(hr = m_pWriter2->SetLiveSource(TRUE)))
	{
		AfxMessageBox ("Setting live source failed");
		return FALSE;
	}

	if (FAILED(hr = m_pWriter2->RemoveSink(0)))	//For the time being,
						//we are removing the 
						//default sink...
	{
		AfxMessageBox (" Remove Sink failed");
		return FALSE;
	}

	m_pProvider->Release(); 			//Dispose the object after use

Create the network sink object by calling the WMCreateWriterNetworkSink function, which returns an IWMWriterNetworkSink pointer.

        if (FAILED(hr = WMCreateWriterNetworkSink(&m_pNetSink)))
	{
		AfxMessageBox ("WMCreateWriterNetworkSink failed");
		return FALSE;
	}

Call IWMWriterNetworkSink::Open on the network sink and specify the port number to open; for example, 8080. Optionally, call IWMWriterNetworkSink::GetHostURL to get the URL of the host. Clients will access the content from this URL. You can also call IWMWriterNetworkSink::SetMaximumClients to restrict the number of clients.

CString strPort="";
m_EditPort.GetWindowText(strPort);

DWORD dwPort = 8080;

if(strPort!="")
{
	dwPort=atoi(strPort);
}

if (FAILED(hr = m_pNetSink->Open(&dwPort)))
{
	AfxMessageBox ("Port opening failed");
	return FALSE;
}

WCHAR url[256];
DWORD len = 256;

hr = m_pNetSink->GetHostURL(url, &len);

if(SUCCEEDED(hr))
{
	CString strUrl(url);
	m_StaticUrl.SetWindowText(strUrl);
}

if (FAILED(m_pWriter2->AddSink(m_pNetSink)))
{
	AfxMessageBox ("AddSink failed");
	return FALSE;
}

Now we will connect the Video device filter and audio device filter to WMASFWriter. The following functions will connect these filters together:

hr=ConnectFilters(m_pGraph, m_pVidDeviceFilter,m_pWMASFWritter,"Video Input 01");
if(FAILED(hr)) 
	return FALSE;

hr=ConnectFilters(m_pGraph, m_pAudDeviceFilter,m_pWMASFWritter);
if(FAILED(hr)) 
	return FALSE;
HRESULT ConnectFilters(IGraphBuilder *pGraph, 
        IBaseFilter *pFirst, IBaseFilter *pSecond)
{
	try
	{
		 IPin *pOut = NULL, *pIn = NULL;
		HRESULT hr = GetPin(pSecond, PINDIR_INPUT, &pIn);

		if (FAILED(hr)) return hr;
		// The previous filter may have multiple outputs, 
		// so try each one!
		IEnumPins  *pEnum;
		pFirst->EnumPins(&pEnum);
		while(pEnum->Next(1, &pOut, 0) == S_OK)
		{
				PIN_DIRECTION PinDirThis;
				pOut->QueryDirection(&PinDirThis);
				if (PINDIR_OUTPUT == PinDirThis)
				{
					hr = pGraph->Connect(pOut, pIn);
					switch(hr)
					{
					case S_OK:
							break;
					case VFW_S_PARTIAL_RENDER:
						AfxMessageBox
						("VFW_S_PARTIAL_RENDER");
						break;
					case E_ABORT:
						  AfxMessageBox("E_ABORT");
						break;
					case E_POINTER:
						AfxMessageBox("E_POINTER");
						break;
					case VFW_E_CANNOT_CONNECT:
						 AfxMessageBox
						("VFW_E_CANNOT_CONNECT");
						break;
					case VFW_E_NOT_IN_GRAPH:
						  AfxMessageBox
						("VFW_E_NOT_IN_GRAPH");
						break;
					}		
					
				   if(!FAILED(hr))
					{
						   break;
					}
				}
				pOut->Release();
		}
		pEnum->Release();
		pIn->Release();
		pOut->Release();
		return hr;
	}
	catch(...)
	{
		return -1;
	}
}

HRESULT ConnectFilters(IGraphBuilder *pGraph, 
        IBaseFilter *pFirst, IBaseFilter *pSecond,CString strAsfFilterPin)
{
	try
	{
		 IPin *pOut = NULL, *pIn = NULL;
		 HRESULT hr=0;
		 pIn=GetPinByName(pSecond,
			strAsfFilterPin.AllocSysString()); //Get pin by name...

		if (FAILED(hr)) return hr;
		// The previous filter may have multiple outputs, so try each one!
		IEnumPins  *pEnum;
		pFirst->EnumPins(&pEnum);
		while(pEnum->Next(1, &pOut, 0) == S_OK)
		{
				PIN_DIRECTION PinDirThis;
				pOut->QueryDirection(&PinDirThis);
				if (PINDIR_OUTPUT == PinDirThis)
				{
					hr = pGraph->Connect(pOut, pIn);
					switch(hr)
					{
					case S_OK:
						//AfxMessageBox
						//("Connection Success");
						break;
					case VFW_S_PARTIAL_RENDER:
						AfxMessageBox
						("VFW_S_PARTIAL_RENDER");
						break;
					case E_ABORT:
						AfxMessageBox("E_ABORT");
						break;
					case E_POINTER:
						AfxMessageBox("E_POINTER");
						break;
					case VFW_E_CANNOT_CONNECT:
						AfxMessageBox
						("VFW_E_CANNOT_CONNECT");
						break;
					case VFW_E_NOT_IN_GRAPH:
						AfxMessageBox
						("VFW_E_NOT_IN_GRAPH");
						break;
					}		
					
				   if(!FAILED(hr))
					{
						   break;
					}
				}
				pOut->Release();
		}
		pEnum->Release();
		pIn->Release();
		pOut->Release();
		return hr;
	}
	catch(...)
	{
		return -1;
	}
}

The following functions will retrieve the pin by direction and pin by name respectively.

HRESULT GetPin(IBaseFilter *pFilter, 
	PIN_DIRECTION PinDir, IPin **ppPin) //get pin by direction
{
	try
	{
		int i=0;
		IEnumPins  *pEnum;
		IPin       *pPin;
		pFilter->EnumPins(&pEnum);
		while(pEnum->Next(1, &pPin, 0) == S_OK)
		{
			 PIN_DIRECTION PinDirThis;
			 pPin->QueryDirection(&PinDirThis);
			 if (PinDir == PinDirThis)
			 {
				pEnum->Release();
				*ppPin = pPin;
				return S_OK;

			 }
			 pPin->Release();
		}
		pEnum->Release();
		return E_FAIL;  
	}
	catch(...)
	{
		return E_FAIL;
	}
}

IPin* ::GetPinByName(IBaseFilter *pFilter, LPCOLESTR pinname) //get pin by name
{
	try
	{
		IEnumPins* pEnum;
		IPin*      pPin;

		HRESULT hr = pFilter->EnumPins(&pEnum);
		if (FAILED(hr))
			return NULL;

		while(pEnum->Next(1, &pPin, 0) == S_OK)
		{
			PIN_INFO pinfo;
			pPin->QueryPinInfo(&pinfo);
			BOOL found = !_wcsicmp(pinname, pinfo.achName);

			if (pinfo.pFilter) 
				pinfo.pFilter->Release();

			if (found) 
			{
				return pPin;
			};
			pPin->Release();
		}
		return NULL;
	}
	catch(...)
	{
		return NULL;
	}
}

There we can run the graph.

hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
if(FAILED(hr)) 
	return FALSE;

hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pEvent); 
if(FAILED(hr)) 
	return FALSE;

hr = m_pMediaControl -> Run( ); 

if(FAILED(hr))
{
	AfxMessageBox ("Media Control Run failed");
	return FALSE;
}
long evCode=0;
hr=pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till its done. 
//please be careful when using INFINITE, 
//this may block the entire app indefinitely.
//It will cause the application hang up.

You can pause or stop the streaming using the following methods:

hr=m_pMediaControl->Pause();
hr=m_pMediaControl->Stop();	

There we go. All are done from the streaming side. You can use the Windows Media player as the client. Just open the media player and select the Openurl from file menu and put the URL displayed in the server GUI there and start.

If you need your own client, you can use IWMASFReader to open this network location. You can capture image from this URL by using my following article:

Have a nice coding.... :)

Reference

History

  • First version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Rajeev K R Pala
Technical Lead
India India
Member
I am an iOS\VC++\.net software developer from India. I am currently employed as Software Engineer in a Product company. The main technologies I used are Objective C,VC++,MFC,C#.NET,DirectShow,COM,Windows media Format etc...
 
- 2+ Years in iOS Development
- 3+ years in VC++\MFC programming
- 3+ years in .NET programming
- 2+ years in COM,DirectShow,Windows media Format
 
I'm looking to advance my Software Engineering career by learning new technologies and extending my programming experience.
 
EMail : rajeevkr.asr@gmail.com
Skype : rajeevkr_asr

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questionwonderfulmembergmarrero9 Mar '13 - 6:41 
Hi <b>Rajeev</b>
 
Your <a href="http://www.codeproject.com/Articles/80413/Streaming-Server-using-Direct-Show-and-Windows-Med">Streaming Server using Direct Show and Windows Media Format</a> project is the most exciting I've seen on the net and fits perfectly with what I want do.
My idea is to create a windows service and users through WMPlayer can watch TV that is captured by a card <i>ATI TV Wonder 200 A / V</i>.
I tried to do with the library DirectShowLib but can not find the way to send the audio too.
 
I'd appreciate it if you have the same code of your project but in <b>C#. NET</b> and it is possible that you send me, I'd appreciate it infinitely.
 
My most sincere greetings from the other side of the ocean
 
PS: Sorry if my English is bad, the fault lies with the google translator.
Thumbs Up | :thumbsup:
 
Él ha dicho. Yo soy el Alfa y el Omega, el Principio y el Fin
Questionh264 codec or rtspmembermagic.on6 Jun '12 - 7:46 
It's it possible to encode the data in this codec or protocol?
 
Trying to stream for android but without vlc i can't seem to do it
AnswerRe: h264 codec or rtspmemberjfriedman11 Dec '12 - 11:47 
You can checkout my article Managed Media Aggregation using Rtsp and Rtp[^] If you need Rtsp compatibility. It is already compatible with VLC out of the box and it also works under Linux as a bonus!
QuestionHow to play online streaming audio file at client pcmemberMember 88978911 May '12 - 7:19 
plz sir i m troubling a lot.i have no exp in vc++.i want to play online streaming wav file on client pc.so iwant to know how to connect the server and request to send a particular audio file content and play on client pc. thanks in advance plz sir help m.
QuestionHow to write part of application widow to vga or usb out as video streammemberjayachanakya14 Mar '12 - 20:30 
How to write part of application widow to vga or usb out as video stream.
Really what i want is part of application (square selection of app winfrom window) view on LCD (not in my lap top other LCD ) screen.
GeneralMy vote of 5membercode_junkie29 Feb '12 - 16:33 
Excellent artical. Now I just need to figure out how to password protect the stream Wink | ;)
 
Thanks!
QuestionStrmbase.libmemberwave_hkman7 Feb '12 - 3:51 
Where can i Find "Strmbase.lib" ?
regards
AnswerRe: Strmbase.libmemberRajeev K R Pala8 Feb '12 - 4:38 
Checkout this.....
 
http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/1d38b047-cd75-4381-adde-071e3f2a5c51[^]
 
Hope this thread will help you....
GeneralRe: Strmbase.libmemberwave_hkman8 Feb '12 - 21:55 
I got the error msg when I build the project
 
Error 1 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int serverdlg.h 30 Server
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int serverdlg.h 36 Server
Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int serverdlg.h 30 Server
Error 7 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int serverdlg.h 36 Server
Error 9 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int serverdlg.cpp 209 Server
Error 10 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int serverdlg.cpp 276 Server  
How can I fix it?

Thanks and regards,
GeneralRe: Strmbase.libmemberRajeev K R Pala14 Feb '12 - 1:40 
Which IDE u r using for building the application? (VC++ 6.0 ? )
GeneralRe: Strmbase.lib [modified]memberwave_hkman20 Feb '12 - 1:38 
VS2009 with VC++ 6.0

modified 20 Feb '12 - 7:57.

Questionblocked after some secondsmembernever138881 Jan '12 - 2:33 
Thanks for this awesome article!
But I got a little problem with this code.
I use the Windows Media Player as the client to receive the stream,
at first, it could receive the stream correctly, but a few seconds passed, the video became block, not so fluently as before, finally the video just stopped.
Is the buffer full of space or something?
AnswerRe: blocked after some secondsmemberRajeev K R Pala8 Feb '12 - 4:44 
Strange issue !!!. It may be because of your server system configuration. Check the memory status in TASK MANAGER. Just try with VLC player also, then you can ensure it is not an issue with Media player(config).
Questionit´s possible to deactivate the buffering?memberpipols8318 Oct '11 - 23:37 
Hi,
thank you so much for this program.
Is there a possibility of eliminating the buffering in the program?
I would like to obtain real-time broadcasts and saw that the only way is that.
Thank you again.
AnswerRe: it´s possible to deactivate the buffering?memberRajeev K R Pala29 Nov '11 - 22:15 
I have already replied for the same question in this thread... Here is the answer... Hope this will help you...
 

It is a normal delay. Go through the following threads. It will give you an idea about broadcasting delay and how can reduce it.

http://www.microsoft.com/windows/windowsmedia/howto/articles/broadcastdelay.aspx[^]

http://social.msdn.microsoft.com/Forums/en/mediafoundationdevelopment/thread/1f46cb04-d5b8-4304-8398-9bae08db62af[^]
QuestionMedia Control Run failedmembermapartha11 Aug '11 - 20:33 
Dear Rajeev,
 
Thanks for the excellent article.
I downloaded your code and was able to build it successfully in VS2005. I have disabled all audio filters in the code, as I am testing only video streaming on my laptop HP Webcam(VGA). After I select the Video Device and use an unused port (eg.18111) and click 'Start', I see an error message 'Media Control Run failed' followed by 'Start streaming failed'.
The code line: hr = m_pMediaControl->Run( ); returns E_FAIL
Please advise what could be the problem and how to solve it.
 
Thanks & Best Regards,
Parthasarathy.M.A.
email: ma_partha@yahoo.com
AnswerRe: Media Control Run failedmemberRajeev K R Pala11 Aug '11 - 20:46 
Did you check it with both audio and video filters? Also check your video device is already in use...
GeneralRe: Media Control Run failedmembermapartha11 Aug '11 - 22:29 
Thanks. Yes, it works after I re-enabled the audio filters. I used your VideoImageCap project to capture the .bmp image and test. But why should the server report error if I disable the audio filters?
GeneralRe: Media Control Run failedmemberRajeev K R Pala11 Aug '11 - 23:14 
Remove the following lines of code and try....Make sure that,no reference of audio filter is used in the code...
 

 
hr=m_pGraph->AddFilter(m_pAudDeviceFilter,L"Aud Capture Filter");
if(FAILED(hr))
return FALSE;
 

hr=ConnectFilters(m_pGraph, m_pAudDeviceFilter,m_pWMASFWritter);
if(FAILED(hr))
    return FALSE;
 
Also ensure that your video pins are not allocated.
For more info, go through the following link...
http://msdn.microsoft.com/en-us/library/dd390177%28v=vs.85%29.aspx[^]
GeneralRe: Media Control Run failedmembermapartha18 Aug '11 - 18:29 
I still have three issues:
1. Even after removing the codes for audio filter, Media Control does not run.
2. When I view the cideo on Windows Media Player or VLC player, there is a delay of about 12-13 secs. between the live video and the streamed video. But if I use Graphedit to build the graph and run, there is no delay between live video and displayed video.
3. If I use a 4-input video capture card, and run the graph, the display shows the video for one input only, but while using this streaming server, all the 4 input video are displayed in a single 320x240 display on the player.
 
Do you have any suggestions for the above issues?
GeneralRe: Media Control Run failedmemberRajeev K R Pala23 Aug '11 - 0:42 
Hi,

It is a normal delay. Go through the following threads. It will give you an idea about broadcasting delay and how can reduce it.

http://www.microsoft.com/windows/windowsmedia/howto/articles/broadcastdelay.aspx[^]

http://social.msdn.microsoft.com/Forums/en/mediafoundationdevelopment/thread/1f46cb04-d5b8-4304-8398-9bae08db62af[^]
 
Right now i am working in iOS development. So for other issues, I have no testing environment here.
GeneralRe: Media Control Run failedmemberRajeev K R Pala23 Aug '11 - 0:43 
Hi,

The following threads will give you an idea about broadcasting delay and how can reduce it.

http://www.microsoft.com/windows/windowsmedia/howto/articles/broadcastdelay.aspx[^]

http://social.msdn.microsoft.com/Forums/en/mediafoundationdevelopment/thread/1f46cb04-d5b8-4304-8398-9bae08db62af[^]
 
Right now i am working in iOS development. So for other issues, I have no testing environment here.
QuestionI can't build your project on VS2008memberHyoung-Joon Kim13 Apr '11 - 14:32 
Can I get some help from you?
I got this error message.
 
1>LINK : fatal error LNK1000: Internal error during IncrBuildImage
 
And I can't solve this problem on VS2008.
Do you have any information for this problem?
Hello World.

AnswerRe: I can't build your project on VS2008memberHyoung-Joon Kim13 Apr '11 - 16:29 
Oh! I solved this problem by Microsoft VS 9 Servicepack.
I have lost difinetely basic job, installing patches.
Sorry and thank you.
Your project is so good. excellent!
Hello World.

GeneralRe: I can't build your project on VS2008memberRajeev K R Pala18 Apr '11 - 3:32 
Keep Rocking ... Thumbs Up | :thumbsup: !!!

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

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 13 May 2010
Article Copyright 2010 by Rajeev K R Pala
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid