consuming a .net web service with C++ 6.0

Would prefer details on using SOAP , GET , and POST to retrieve. Not asking for code (but feel  free to submit any code you so desire) just good articles and starting points.
Thanks.
LVL 5
mccainz2Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
millsoftConnect With a Mentor Commented:
Hi mcCainz,

I can guarantee it's possible, since I do exactly that in my code, but my implementation uses a lot of code (including an XML generator for the SOAP request.)

However, basically, all you have to do is send XML via HTTP (or HTTPS), and retrieve the response XML and parse it.

For that, you can see the VC sample HEREX.EXE: http://download.microsoft.com/download/ie4095/hsrex/1/win98/en-us/Hsrex.exe  (C++ program posted below).

To apply this sample to your soap problem, create a file with the full XML of the SOAP request you want to send, and then modify the UseHTTPSendReqExec function to read your file and send it as the data.

Brad

#include <Windows.h>
#include <WinINet.h>
#include <stdio.h>

BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize);
#define BUFFSIZE 500

void main( int argc, char **argv )
{
    DWORD dwPostSize;

    if (argc < 4)
    {
        printf("Usage: Bigpost <Size> <Server> <Path>\n");
        printf("<Size> is the number of KB to POST\n");
        printf("<Server> is the server to POST to\n");
        printf("<Path> is the virtual path to POST to\n");
        exit(0);
    }

    if ( ((dwPostSize = strtoul(argv[1],NULL,10)) == 0) || (dwPostSize >= 2047999) )
    {
        printf("%s is invalid size.  Valid sizes are from 1 to 2047999\n", argv[1]);
        exit(0);
    }

    printf( "Test of POSTing %luKB with WinInet\n", dwPostSize);

    dwPostSize *= 1024;  // Convert KB to bytes

    HINTERNET hSession = InternetOpen( "HttpSendRequestEx", INTERNET_OPEN_TYPE_PRECONFIG,
        NULL, NULL, 0);
    if(!hSession)
    {
        printf("Failed to open session\n");
        exit(0);
    }


    HINTERNET hConnect = InternetConnect(hSession, argv[2], INTERNET_DEFAULT_HTTP_PORT,
        NULL, NULL, INTERNET_SERVICE_HTTP,NULL, NULL);
    if (!hConnect)
        printf( "Failed to connect\n" );
    else
    {
        HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", argv[3],
            NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
        if (!hRequest)
            printf( "Failed to open request handle\n" );
        else
        {
            if(UseHttpSendReqEx(hRequest, dwPostSize))
            {    
                char pcBuffer[BUFFSIZE];
                DWORD dwBytesRead;

                printf("\nThe following was returned by the server:\n");
                do
                {    dwBytesRead=0;
                    if(InternetReadFile(hRequest, pcBuffer, BUFFSIZE-1, &dwBytesRead))
                    {
                        pcBuffer[dwBytesRead]=0x00; // Null-terminate buffer
                        printf("%s", pcBuffer);
                    }
                    else
                        printf("\nInternetReadFile failed");
                }while(dwBytesRead>0);
                printf("\n");
            }
            if (!InternetCloseHandle(hRequest))
                printf( "Failed to close Request handle\n" );
        }
        if(!InternetCloseHandle(hConnect))
            printf("Failed to close Connect handle\n");
    }
    if( InternetCloseHandle( hSession ) == FALSE )
        printf( "Failed to close Session handle\n" );

    printf( "\nFinished.\n" );
}



BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize)
{
    INTERNET_BUFFERS BufferIn;
    DWORD dwBytesWritten;
    int n;
    BYTE pBuffer[1024];
    BOOL bRet;

    BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur
    BufferIn.Next = NULL;
    BufferIn.lpcszHeader = NULL;
    BufferIn.dwHeadersLength = 0;
    BufferIn.dwHeadersTotal = 0;
    BufferIn.lpvBuffer = NULL;                
    BufferIn.dwBufferLength = 0;
    BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize
    BufferIn.dwOffsetLow = 0;
    BufferIn.dwOffsetHigh = 0;

    if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0))
    {
        printf( "Error on HttpSendRequestEx %d\n",GetLastError() );
        return FALSE;
    }

    FillMemory(pBuffer, 1024, 'D'); // Fill buffer with data

    bRet=TRUE;
    for(n=1; n<=(int)dwPostSize/1024 && bRet; n++)
    {
        if(bRet=InternetWriteFile( hRequest, pBuffer, 1024, &dwBytesWritten))
            printf( "\r%d bytes sent.", n*1024);
    }
       
    if(!bRet)
    {
        printf( "\nError on InternetWriteFile %lu\n",GetLastError() );
        return FALSE;
    }

    if(!HttpEndRequest(hRequest, NULL, 0, 0))
    {
        printf( "Error on HttpEndRequest %lu \n", GetLastError());
        return FALSE;
    }

    return TRUE;
}

0
 
jkrCommented:
Maybe http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsoap/html/understandsoap.asp ("Understanding SOAP") or http://www.microsoft.com/mind/0100/soap/soap.asp ("SOAP: The Simple Object Access Protocol") is a good point to start.
0
 
mccainz2Author Commented:
Sorry , wasnt clear.
Issue is how to consume these .net services from a vc++ 6.0 (unmanaged code) client.
I am not a C++ but rather a .net developer and I am trying to facillitate (read convince) a contractor I work with to consume my .net web service rather than relying on our current architecture for data transfer.
0
 
ageraldnaveenCommented:
instead of writing your own webservices layer on the client side using SOAP,HTTP etc.,

my suggestion is...

u just develop a .Net component wrapper for your webservice.
create a CCW for your .Net component and use it in your client application..

by doing this, u are making reuse of the .Net webservices architecture. you need not write your own coding for webservices layer right?

you shall take this, if you are not very much concerned about the performance..(very much !!)
but this would be an easy solution for your problem.
0
 
mccainz2Author Commented:
My lack of c++ may be hindering me here but I simply need to know how a remote C++ 6.0 client can call a .net webservice which can respond to either SOAP,GET,or POST (BTW, this will be an https URL for the webservice). All I really need is a good article I can pass to our C++ developer that will  either (1) allow me to write a simple C++ app so as to shame him into using my webservice or (2) get him started on the correct path by showing him it is possible.

Thanks, and forgive my lack of Knowledge regarding the client side of calling webservices , especially from VC++6.0
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.