|
Well....what defines the RecordSet structure? Is it the DLL written in VB6? Does it return ADO record-sets? That's the first thing you need to find out, anyway, so you can pull in some artefact that defines the recordset structure within your C++ program.
Once you've done that, it's relatively simple. Have a look at this post[^] I recently made showing how to use ADO connections and recordsets - they're COM objects. If you use #import to pull in the COM library's type library, it's pretty simple.
|
|
|
|
|
Hi Stuart,
Thank you for responding.
Some answers to you questions:
The DLL is written in VB6.
Yes, the record set is defined in the DLL.
I don't know what kind of record-sets it returns, ADO or otherwise.
Yes, I do use #import and a .tli and a .tlh are generated.
I have included the .tlh if that helps.
Does that help us reach the next stage?
Thanks
Phil
#pragma once
#pragma pack(push, 8)
#include <comdef.h>
struct __declspec(uuid("e897466c-75b0-459f-9512-21d42e1f5703"))
__TTExt;
struct __declspec(uuid("dc8718c4-d07f-4542-a799-f2015a0614cf"))
_WebRes;
struct WebRes;
_COM_SMARTPTR_TYPEDEF(_WebRes, __uuidof(_WebRes));
struct __declspec(uuid("dc8718c4-d07f-4542-a799-f2015a0614cf"))
_WebRes : IDispatch
{
__declspec(property(get=GetLastError))
_bstr_t LastError;
__declspec(property(get=GetDatabase,put=PutDatabase))
_bstr_t Database;
__declspec(property(get=GetServer,put=PutServer))
_bstr_t Server;
__declspec(property(put=PutResNotes))
_bstr_t ResNotes;
__declspec(property(get=GetReservationID))
_bstr_t ReservationID;
__declspec(property(get=GetConfirmationNumber))
_bstr_t ConfirmationNumber;
__declspec(property(put=PutVoucherNo))
long VoucherNo;
__declspec(property(put=PutNumberOfPlayers))
long NumberOfPlayers;
__declspec(property(put=PutSelectedSlot))
_bstr_t SelectedSlot;
__declspec(property(put=PutPlayDate))
DATE PlayDate;
__declspec(property(put=PutEndTime))
DATE EndTime;
__declspec(property(put=PutStartTime))
DATE StartTime;
__declspec(property(put=PutTee))
_bstr_t Tee;
__declspec(property(put=PutFacility))
_bstr_t Facility;
__declspec(property(get=GetCustomerID,put=PutCustomerID))
_bstr_t CustomerID;
__declspec(property(put=PutCreditCardExpDate))
_bstr_t CreditCardExpDate;
__declspec(property(put=PutCreditCard))
_bstr_t CreditCard;
__declspec(property(put=PutEmail))
_bstr_t Email;
__declspec(property(put=PutFaxNo))
_bstr_t FaxNo;
__declspec(property(put=PutPhoneExt))
_bstr_t PhoneExt;
__declspec(property(put=PutPhoneNo))
_bstr_t PhoneNo;
__declspec(property(put=PutCountry))
_bstr_t Country;
__declspec(property(put=PutState))
_bstr_t State;
__declspec(property(put=PutCompany))
_bstr_t Company;
__declspec(property(put=PutCity))
_bstr_t City;
__declspec(property(put=PutZip))
_bstr_t Zip;
__declspec(property(put=PutDisplay))
_bstr_t Display;
__declspec(property(put=PutAddress2))
_bstr_t Address2;
__declspec(property(put=PutAddress1))
_bstr_t Address1;
__declspec(property(put=PutMidInitial))
_bstr_t MidInitial;
__declspec(property(put=PutFirstName))
_bstr_t FirstName;
__declspec(property(get=GetLastName,put=PutLastName))
_bstr_t LastName;
_variant_t GetCustomerList ( );
VARIANT_BOOL CreateCustomer (
BSTR * ReturnMessage );
_variant_t GetFacilityList ( );
_variant_t GetSlotsAvailable ( );
VARIANT_BOOL CreateReservation (
BSTR * ReturnMessage );
_variant_t GetReservationsForConfirmationNo (
_bstr_t ConfirmationNo );
VARIANT_BOOL CancelReservation (
_bstr_t ReservationID,
BSTR * ReturnMessage );
_variant_t GetServers ( );
VARIANT_BOOL Connect (
_bstr_t vendor_name,
_bstr_t ini_path );
VARIANT_BOOL Connect1 (
_bstr_t Server,
_bstr_t Database );
_bstr_t GetLastName ( );
void PutLastName (
_bstr_t _arg1 );
void PutFirstName (
_bstr_t _arg1 );
void PutMidInitial (
_bstr_t _arg1 );
void PutAddress1 (
_bstr_t _arg1 );
void PutAddress2 (
_bstr_t _arg1 );
void PutDisplay (
_bstr_t _arg1 );
void PutZip (
_bstr_t _arg1 );
void PutCity (
_bstr_t _arg1 );
void PutCompany (
_bstr_t _arg1 );
void PutState (
_bstr_t _arg1 );
void PutCountry (
_bstr_t _arg1 );
void PutPhoneNo (
_bstr_t _arg1 );
void PutPhoneExt (
_bstr_t _arg1 );
void PutFaxNo (
_bstr_t _arg1 );
void PutEmail (
_bstr_t _arg1 );
void PutCreditCard (
_bstr_t _arg1 );
void PutCreditCardExpDate (
_bstr_t _arg1 );
_bstr_t GetCustomerID ( );
void PutCustomerID (
_bstr_t _arg1 );
void PutFacility (
_bstr_t _arg1 );
void PutTee (
_bstr_t _arg1 );
void PutStartTime (
DATE _arg1 );
void PutEndTime (
DATE _arg1 );
void PutPlayDate (
DATE _arg1 );
void PutSelectedSlot (
_bstr_t _arg1 );
void PutNumberOfPlayers (
long _arg1 );
void PutVoucherNo (
long _arg1 );
_bstr_t GetConfirmationNumber ( );
_bstr_t GetReservationID ( );
void PutResNotes (
_bstr_t _arg1 );
void PutServer (
_bstr_t _arg1 );
void PutDatabase (
_bstr_t _arg1 );
VARIANT_BOOL SetResellerCode (
_bstr_t InterfaceResellerCode );
VARIANT_BOOL SetUser (
_bstr_t Name );
_bstr_t GetLastError ( );
_bstr_t GetServer ( );
_bstr_t GetDatabase ( );
virtual HRESULT __stdcall raw_GetCustomerList (
VARIANT * _arg1 ) = 0;
virtual HRESULT __stdcall raw_CreateCustomer (
BSTR * ReturnMessage,
VARIANT_BOOL * _arg2 ) = 0;
virtual HRESULT __stdcall raw_GetFacilityList (
VARIANT * _arg1 ) = 0;
virtual HRESULT __stdcall raw_GetSlotsAvailable (
VARIANT * _arg1 ) = 0;
virtual HRESULT __stdcall raw_CreateReservation (
BSTR * ReturnMessage,
VARIANT_BOOL * _arg2 ) = 0;
virtual HRESULT __stdcall raw_GetReservationsForConfirmationNo (
BSTR ConfirmationNo,
VARIANT * _arg2 ) = 0;
virtual HRESULT __stdcall raw_CancelReservation (
BSTR ReservationID,
BSTR * ReturnMessage,
VARIANT_BOOL * _arg3 ) = 0;
virtual HRESULT __stdcall raw_GetServers (
VARIANT * _arg1 ) = 0;
virtual HRESULT __stdcall raw_Connect (
BSTR vendor_name,
BSTR ini_path,
VARIANT_BOOL * _arg3 ) = 0;
virtual HRESULT __stdcall raw_Connect1 (
BSTR Server,
BSTR Database,
VARIANT_BOOL * _arg3 ) = 0;
virtual HRESULT __stdcall get_LastName (
BSTR * _arg1 ) = 0;
virtual HRESULT __stdcall put_LastName (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_FirstName (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_MidInitial (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Address1 (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Address2 (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Display (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Zip (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_City (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Company (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_State (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Country (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_PhoneNo (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_PhoneExt (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_FaxNo (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Email (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_CreditCard (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_CreditCardExpDate (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall get_CustomerID (
BSTR * _arg1 ) = 0;
virtual HRESULT __stdcall put_CustomerID (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Facility (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Tee (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_StartTime (
DATE _arg1 ) = 0;
virtual HRESULT __stdcall put_EndTime (
DATE _arg1 ) = 0;
virtual HRESULT __stdcall put_PlayDate (
DATE _arg1 ) = 0;
virtual HRESULT __stdcall put_SelectedSlot (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_NumberOfPlayers (
long _arg1 ) = 0;
virtual HRESULT __stdcall put_VoucherNo (
long _arg1 ) = 0;
virtual HRESULT __stdcall get_ConfirmationNumber (
BSTR * _arg1 ) = 0;
virtual HRESULT __stdcall get_ReservationID (
BSTR * _arg1 ) = 0;
virtual HRESULT __stdcall put_ResNotes (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Server (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall put_Database (
BSTR _arg1 ) = 0;
virtual HRESULT __stdcall raw_SetResellerCode (
BSTR InterfaceResellerCode,
VARIANT_BOOL * _arg2 ) = 0;
virtual HRESULT __stdcall raw_SetUser (
BSTR Name,
VARIANT_BOOL * _arg2 ) = 0;
virtual HRESULT __stdcall get_LastError (
BSTR * _arg1 ) = 0;
virtual HRESULT __stdcall get_Server (
BSTR * _arg1 ) = 0;
virtual HRESULT __stdcall get_Database (
BSTR * _arg1 ) = 0;
};
struct __declspec(uuid("d00de9f1-98eb-4cd9-8685-0ea4f283971f"))
WebRes;
#include "c:\documents and settings\phild\my documents\visual studio code\vbdll\vcclient\debug\ttext.tli"
#pragma pack(pop)
modified on Tuesday, June 30, 2009 12:20 PM
|
|
|
|
|
Heh - it's in a variant. That makes things a little more tricky
I still reckon it could well be an ADO recordset - ADO plays nicely with VB and SQL Server. So, #import the ADO libraries (as shown in the post I linked to earlier - look for the 'Debug Assertion' thread) and try assigning the result of GetCustomerList to a variable of type ADODB::_RecordsetPtr - the _com_ptr_t class has a constructor that takes a variant and attempts to extract an IUnknown pointer and QueryInterface for the interface you first thought of.
[edit]If your recordset pointer isn't an ADO recordset pointer, an exception'll get thrown, so you'll soon know that it's failed![/edit]
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Stuart,
the link "this post", goes to this thread.
Thanks
Phil
|
|
|
|
|
You should find (when you click on that link), if you look further down the page, a thread titled 'Debug Assertion', with a message exapnded - I did, anyway. Look for that thread - my last post in it has the example I was talking about.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Hi Stuart,
ok, this is as far as I've gotten so far...
wr->LastName = _bstr_t ("Davis");
using namespace ADODB;
_RecordsetPtr ptrRS;
hresult = ptrRS.CreateInstance(__uuidof(Recordset));
if(FAILED(hresult)) {
MessageBox("ptrRS.CreateInstance Failed *****");
}
ptrRS = wr->;GetCustomerList();
ptrRS->MoveFirst();
_variant_t vtRows = ptrRS->GetRows(ADODB::adGetRowsRest);
No crashes to this point...
So how do I get the data out of the variant?
Thanks
phil
|
|
|
|
|
The variant should contain a SAFEARRAY[^]. There are useful classes wrapping SAFEARRAYs - see here[^] and here[^].
The other way would be to use the methods of record set (other than GetRows - that's not the best way, to be honest, but the easiest for the specific example I was showing).
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
how to create an xml file in vc++6.0 and writing data to it.please let me know
kir_MFC
|
|
|
|
|
|
As Naveen suggested. There are other XML parsers available as well. Also you could look at the XML DOM tutorial on www.w3schools.com. There are other sites with DOM info as well
[modified]
Why? What was wrong with the replies from previous post?
|
|
|
|
|
kir_MFC wrote: please let me know
See here.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
hi there,
I have one modal dialog box, created by DialogBox() api. This dialog box has some buttons and other control.
1. Here I want to capture Ctrl+PgUP and Ctrl+PgDn key strokes. and based on them i want to move to another button
2. Once i am on another button i want to forward this action to one of the case in WM_COMMAND.
could you be able to take some time and answer my questions please?
Thanks in advance
Warm Regards
Ajay
London
|
|
|
|
|
reply2am wrote: could you be able to take some time and answer my questions please?
Try this.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
in my application i have to read edit box controls data into xml file .please let me know how to do it
kir_MFC
|
|
|
|
|
|
thank u very much
kir_MFC
|
|
|
|
|
kir_MFC wrote: please let me know how to do it
Which part, reading from an edit control or writing to an XML file?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
read data in the edit controls and store that data in xml file
kir_MFC
|
|
|
|
|
kir_MFC wrote: read data in the edit controls...
Use GetWindowText() , CWnd::GetWindowText() , or send it a WM_GETTEXT message.
kir_MFC wrote: ...and store that data in xml file
Have you looked at TinyXML?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Hello,
I wrote template which return matrix in Window Form Application .My template is below:
template<class T>
class matrix1 {
protected:
public:
T *data;
const unsigned rows, cols, size;
matrix1(unsigned r, unsigned c) : rows(r), cols(c), size(r*c) {
data = new T[size];
}
~matrix1() { delete data; }
void setValue(unsigned row, unsigned col, T value) {
data[(row*cols)+col] = value;
}
T getValue(unsigned row, unsigned col) const {
return data[(row*cols)+col];
}
};
I wrote this code in Main Project File in Windows Form Application.I defined 341*680 matrix with using this template :
matrix1<double>A(341,680);
I used function that do operation on this template and I defined it like this:
void function(matrix1<double> &b,array< double>^ temp)
And call it:
function(A,temp);
(temp is one dimensinonal data array that I have to use for my programming algorithm)
For Example;When I want to print data that is located in the first row and first column.
Visual C++ recognise getvalue and setvalue function ,but couldn't print anything and gave a lot of error interested with array1 template
I tried this template and function on CLR Console Application and it worked.How could I do this On Windows Form Application.And Where should I locate template class on Windows Form Application.
Best Regards...
modified on Tuesday, June 30, 2009 8:48 AM
|
|
|
|
|
Take a look at Managed Templates[^]
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
emira67 wrote: Visual C++ recognise getvalue and setvalue function ,but couldn't print anything and gave a lot of error interested with array1 template
Do you mean compilation errors? If so, tell us what they were...Because after correcting the obvious syntax error (you missed off the trailing }; of the template class definition), that code compiled, linked and ran inside a C++ WinForms application built in VS2008
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
It was compiler error that VS2008 gave.These errors lik these:
error C3861: 'function': identifier not found
error C2065: 'A' : undeclared identifier
In fact I declared this items!!!
Could you help me please?
|
|
|
|
|
emira67 wrote: In fact I declared this items!!!
But obviously not somewhere that the code that used the items was able to see them.
emira67 wrote: Could you help me please?
If you posted some more detail (the filename that you put the template class & function declaration in, the code that uses the matrix and function), then possibly. However, your code is syntactically and semantically correct - you've just organised it so that the code that uses those things can't see them. Check through your code to understand why!
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
hi all,
i have written a small service.now when i install the service, the service gets installed what i feel but is not able to start. using an installer i am installing the service application in windows vista.
it gives out an error during installation, when the service is getting started.
it throws an error as follows:
Create process failed: error code 14001. the application has failed to start because the application configuration is incorrect. reinstalling the application may fix the problem.
i tried reinstalling, however the same problem persists...
i am pasting the code below,, for initial main, service installation and service start functions..please can i get some help on fixing the error....
*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void __cdecl _tmain(int argc, char **argv)
{
HKEY hKeyHandle;
DWORD dwDataToWrite = 1;
if( argc == 3 )
{
printf("ERROR:\tIncorrect number of arguments\n\n");
return;
}
char *arg1 = argv[1];
char *arg2 = argv[2];
if(_strnicmp(arg1, "install", 7) == 0)
{
if(!PathFileExists(arg2 ))
{
exit(1);
}
if (InstallService(arg2))
{
MessageBox(NULL,"Service installed successfully",Message,MB_OK);
}
else
{
MessageBox(NULL,"Error in service installation",Message,MB_OK);
exit(2);
}
}
else if (lstrcmpi( arg1, TEXT("uninstall")) == 0 )
{
if(!ServiceDelete())
{
MessageBox(NULL,"Error in Un-installing",Message,MB_OK);
exit(3);
}
}
else if (lstrcmpi( arg1, TEXT("enable")) == 0 )
{
if (!EnableService())
{
MessageBox(NULL,"Error in enabling",Message,MB_OK);
exit(4);
}
}
else
exit(0);
SERVICE_TABLE_ENTRY DispatchTable[] = {
{ SRVCNAME, (LPSERVICE_MAIN_FUNCTION) SvcMain },
{ NULL, NULL } };
StartServiceCtrlDispatcher(DispatchTable);
}
// Service main function for the service
VOID WINAPI SvcMain(DWORD dwArgs,LPTSTR *lpszArgv)
{
DWORD dwErr = 0;
debug_log("In Service Main-The Entry Point for Service");
// Register the handler function to service
svcStatusHandle = RegisterServiceCtrlHandlerEx(TEXT(SRVCNAME),(LPHANDLER_FUNCTION_EX)SvcCtrlHandler,NULL);
if(!svcStatusHandle)
{
debug_log("Failed to register service handler function error(%d) returned",GetLastError());
(VOID)ReportServiceStatus(SERVICE_STOPPED,dwErr,0);
return;
}
// service status members remain same as set here.
svcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
svcStatus.dwServiceSpecificExitCode = 0;
if(!ReportServiceStatus( SERVICE_START_PENDING, NO_ERROR, 3000 ));
CleanupHandles();
//Start the service...
ServiceStart(dwArgs,lpszArgv);
debug_log("Exiting Service Main");
}
//Function for installing the service in SCM database
BOOL InstallService(char *szPath)
{
SC_LOCK sclLock;
LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf;
SERVICE_DESCRIPTION sdBuf;
DWORD dwBytesNeeded;
BOOL bSuccess=TRUE;
SC_ACTION sca[3];
SERVICE_FAILURE_ACTIONS sfaBuf;
debug_log("Installing service now...");
//Get a handle to SCM database..
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ALL_ACCESS | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS);
if (schSCManager == NULL)
{
debug_log("Failed to open SCM database, error-(%d) returned\n",GetLastError());
return false;
}
else debug_log("Connection to SCM database success");
LPCTSTR lpszBinaryPathName= szPath;
// If database opened create the service
schService = CreateService(schSCManager,SRVCNAME,SRVCNAME,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,lpszBinaryPathName,NULL,NULL,NULL,NULL,"");
if(schService == NULL)
{
debug_log("Error in creating service,[%d] error code returned",GetLastError());
return false;
}
else debug_log("Service %s created and installed",SRVCNAME);
CloseHandle(schService);
// service config change to specify action on failure
debug_log("Acquiring lock on SCM database");
sclLock = LockServiceDatabase(schSCManager);
if (sclLock == NULL)
{
if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)
{
debug_log("Database Lock failed");
return FALSE;
}
// Allocate buffer to det details about the lock
lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS)LocalAlloc(LPTR,sizeof(QUERY_SERVICE_LOCK_STATUS)+ 256);
if (lpqslsBuf == NULL)
{
debug_log("Local alloc failed");
return FALSE;
}
// Get the lock status information
if(!QueryServiceLockStatus(schSCManager,lpqslsBuf,sizeof(QUERY_SERVICE_LOCK_STATUS)+256,&dwBytesNeeded))
{
debug_log("Query lock status failed");
return FALSE;
}
if (lpqslsBuf->fIsLocked)
{
debug_log("Already locked by %s",lpqslsBuf->fIsLocked);
}
else
LocalFree(lpqslsBuf);
}
//if database is locked make the changes
schService= OpenService(schSCManager,SRVCNAME,SERVICE_ALL_ACCESS | SERVICE_CHANGE_CONFIG);
if (schService == NULL)
{
debug_log("Open service failed");
return FALSE;
}
sca[0].Type = SC_ACTION_RESTART;
sca[0].Delay = 1;
sca[1].Type = SC_ACTION_RESTART;
sca[1].Delay = 1;
sca[2].Type = SC_ACTION_RESTART;
sca[2].Delay = 1;
sfaBuf.cActions = 3;
sfaBuf.lpsaActions = sca;
sfaBuf.dwResetPeriod = INFINITE;
sdBuf.lpDescription = "Test Service";
if (!ChangeServiceConfig2(schService,SERVICE_CONFIG_FAILURE_ACTIONS,&sfaBuf))
{
debug_log("Change service config failed");
bSuccess = FALSE;
}
UnlockServiceDatabase(sclLock);
CleanupHandles();
debug_log("Exiting install service...");
return bSuccess;
}
// Start the service
VOID ServiceStart(DWORD dwArgc, LPTSTR *lpszArgv)
{
debug_log("Inside Service Start,Service Started");
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwOldCheckPoint;
DWORD dwStartTickCount;
DWORD dwWaitTime;
DWORD dwBytesNeeded;
// Acquire handle to the SCM database.
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
{
debug_log("OpenSCManager failed (%d)\n", GetLastError());
return;
}
// Handle to the service.
schService = OpenService(schSCManager,SRVCNAME,SERVICE_ALL_ACCESS);
if (schService == NULL)
{
debug_log("OpenService failed (%d)\n", GetLastError());
CloseServiceHandle(schSCManager);
return;
}
// Start the service.
if (!StartService(schService,0,NULL) )
{
debug_log("StartService failed error-(%d) returned\n", GetLastError());
CleanupHandles();
return;
}
// Check if the service has started
if (!QueryServiceStatusEx(schService,SC_STATUS_PROCESS_INFO,(LPBYTE) &ssStatus,sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded ) )
{
debug_log("Service status 1 query failed,error[%d] returned",GetLastError());
return;
}
// Check the system start time....
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;
Sleep( dwWaitTime );
// Check the status again.
if (!QueryServiceStatusEx(schService,SC_STATUS_PROCESS_INFO,(LPBYTE) &ssStatus,sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded ) )
{
debug_log("Service status 2 query failed,error[%d] returned",GetLastError());
break;
}
if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
// Service is running with system start
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
{
//Service hasn't been started with system start
debug_log("Service has not started with system startup");
break;
}
}
}
// Determine whether the service is running
if (ssStatus.dwCurrentState == SERVICE_RUNNING)
{
debug_log("Service has been started successfully.\n");
}
else
{
debug_log("Service not started. \n");
debug_log(" Current State: %d\n", ssStatus.dwCurrentState);
debug_log(" Exit Code: %d\n", ssStatus.dwWin32ExitCode);
debug_log(" Check Point: %d\n", ssStatus.dwCheckPoint);
debug_log(" Wait Hint: %d\n", ssStatus.dwWaitHint);
}
// Start the action to be performed by the service..
debug_log("Starting the service init process now,work to be performed by service");
ServiceInit();
debug_log("Exiting Service Start now..");
CleanupHandles();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////******
all the variables used have been declared and there are no compilation error...
using visual studio 2008 for service application development for windows vista...
Thankuou...
|
|
|
|
|