Windows Web Services API Client code walkthrough on Windows 7

I decided to Dive into the WWSAPI Beta and see how I could call a simple HelloWorld Applications.  Here are my adventures:

I installed Windows 7 in a HyperV VM and installed Visual Studio 2008 SP1.

I downloaded the Windows 7 SDK and attached the .ISO image as the CD drive and installed it.

I then ran the Windows SDK Configuration Tool and selected the Windows 7 SDK configuration.

Then I downloaded this wsdl: https://jsandersrocks.members.winisp.net/WebServiceTest/WebService.asmx?WSDL

I created a C++ console application with the defaults from the template and named it WWSAPITest.

I created a subdirectory called 'wsdl' in my new project and copied the WSDL into this directory and called it MyWebService.wsdl

Next I opened a CMD Shell Window from the Microsoft Windows SDK v7.0 menu.

I Navigated to the above directory were the WSDL file is and typed: wsutil *

This generated the .h and .c file that I then included in my project.

Just for fun I decided to build the Project to see if I had any errors.

I got these errors:

c:\users\jsanders\documents\visual studio 2008\projects\wwsapitest\wsdl\mywebservice.wsdl.c : fatal error C1853: 'Debug\WWSAPITest.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)

There are C files in the project now so I turned off precompiled header (under C++ Precompiled Headers) option and did a clean and rebuild of the project.  I then got these errors:

MyWebService.wsdl.obj : error LNK2019: unresolved external symbol _WsCall@32 referenced in function _WebServiceSoap_HelloWorld@28

MyWebService.wsdl.obj : error LNK2019: unresolved external symbol _WsCreateServiceProxyFromTemplate@40 referenced in function _WebServiceSoap_CreateServiceProxy

MyWebService.wsdl.obj : error LNK2019: unresolved external symbol _WsCreateServiceEndpointFromTemplate@60 referenced in function _WebServiceSoap_CreateServiceEndpoint

I Included WebServices.lib in the input libraries in the Linker options rebuilt and then the project built fine.

Now the complete code listing for your enjoyment (Copy Code):

// WWSAPITest.cpp : Defines the entry point for the console application.

//

#include

"stdafx.h"
#include <WebServices.h>
#include ".\wsdl\MyWebService.wsdl.h"

int

_tmain(int argc, _TCHAR* argv[])
{

HRESULT hr;
WS_ERROR* error;
WS_HEAP* heap;
WS_SERVICE_PROXY* serviceProxy;
hr = S_OK;
error = NULL;
heap = NULL;
serviceProxy = NULL;

// Creating error object
hr = WsCreateError(NULL, 0, &error);
if (FAILED(hr))
{
wprintf (L"Failed to create Error object\n");
    return -1;
}
// Creating heap handle
hr = WsCreateHeap(10000000, 0, NULL, 0, &heap, error);
if (FAILED(hr))
{
wprintf (L"Failed to create Heap object\n");
    if (heap != NULL)
{
        WsFreeHeap(heap);
heap = NULL;
}
    if (error != NULL)
{
WsFreeError(error);
error = NULL;
}
    return -1;
}

WS_HTTP_BINDING_TEMPLATE templateValue = {};
hr=WebServiceSoap12_CreateServiceProxy(
&templateValue,
NULL,
0,
&serviceProxy,
error);
if (FAILED(hr))
{
WsFreeHeap(heap);
WsFreeError(error);
    return -1;
}

WS_ENDPOINT_ADDRESS address = {};
WS_STRING Url = WS_STRING_VALUE(L"https://jsandersrocks.members.winisp.net/WebServiceTest/WebService.asmx");

address.url = Url;

hr = WsOpenServiceProxy(serviceProxy, &address, NULL, error);
if (FAILED(hr))
{
WsFreeServiceProxy(serviceProxy);
WsFreeHeap(heap);
WsFreeError(error);
    return -1;
}
WCHAR *aResult = NULL;
hr= WebServiceSoap12_HelloWorld(
serviceProxy,
&aResult,
heap,
NULL, 0,NULL, error);
if (SUCCEEDED(hr))
{
    wprintf(L"%s\n", aResult);
}
else
{
    wprintf(L"failed\n");
}

if (serviceProxy != NULL)
{
WsCloseServiceProxy(serviceProxy, NULL, error);
WsFreeServiceProxy(serviceProxy);
serviceProxy = NULL;
}
if (heap != NULL)
{
WsFreeHeap(heap);
heap = NULL;
}
if (error != NULL)
{
WsFreeError(error);
error = NULL;
}
return 0;

}

This console app ran and returned the expected 'Hello World'!

Let me know if you found this useful!