PDA

View Full Version : [C++] Non capisco che cavolo fanno! HELP!


niko_lol
17-05-2007, 16:17
ciao raga..... non capisco che fanno queste istruzioni:

- #define RPC_STRING [unique, string] WCHAR *
- #define RPC_SIZE(X) [size_is(x)]

dopo qualche altra riga di codice le riscrive ma senza il codice nelle perentesi quadre!

Che vuol dire? HELP! :mc: :mc: :muro: :muro: :help: :help: :help: :cry: :cry:

Grazie! :)

cionci
17-05-2007, 16:26
Posta un po' come vengono usate quelle macro nel codice...

niko_lol
17-05-2007, 16:30
VI posto tutto il file! :) help! grazie!


/*
* ESEBCLI2.H
*
* Microsoft Exchange
* Copyright (C) 1986-1996, Microsoft Corporation
*
* Contains declarations of additional definitions and interfaces
* for the ESE Online Backup Client APIs.
*/
#ifndef _ESEBCLI2_
#define _ESEBCLI2_

#include <stdio.h>
#include <time.h>

#include "esebkmsg.h" // included for the definition of errors


// Common types
typedef long ERR;
typedef void *HCCX; // client context handle

#ifdef MIDL_PASS

#define RPC_STRING [unique, string] WCHAR *
#define RPC_SIZE(X) [size_is(X)]

#else // ! MIDL_PASS


#include <objbase.h>
#include <initguid.h>
#include <mapiguid.h>

typedef long HRESULT;
#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif

#define RPC_STRING WCHAR *
#define RPC_SIZE(X)

#define IN
#define OUT

#endif // MIDL_PASS


#define ESEBACK_API __stdcall

#ifdef __cplusplus
extern "C" {
#endif


typedef struct _ESE_ICON_DESCRIPTION
{
unsigned long ulSize;
RPC_SIZE(ulSize) char * pvData;
} ESE_ICON_DESCRIPTION;


#define DATABASE_MOUNTED 0x00000010

typedef struct _DATABASE_BACKUP_INFO
{
RPC_STRING wszDatabaseDisplayName;

unsigned long cwDatabaseStreams;
RPC_SIZE(cwDatabaseStreams) WCHAR * wszDatabaseStreams;

GUID guidDatabase;
unsigned long ulIconIndexDatabase;
unsigned long fDatabaseFlags;

} DATABASE_BACKUP_INFO;

typedef struct _INSTANCE_BACKUP_INFO
{
__int64 hInstanceId;
RPC_STRING wszInstanceName;
unsigned long ulIconIndexInstance;

unsigned long cDatabase;
RPC_SIZE(cDatabase) DATABASE_BACKUP_INFO * rgDatabase;

unsigned long cIconDescription;
RPC_SIZE(cIconDescription) ESE_ICON_DESCRIPTION * rgIconDescription;

} INSTANCE_BACKUP_INFO;

//
// Type of backup passed into HrESEBackupSetup()
//

#define BACKUP_TYPE_FULL 0x01
#define BACKUP_TYPE_LOGS_ONLY 0x02
#define BACKUP_TYPE_FULL_WITH_ALL_LOGS 0x03
#define BACKUP_TYPE_SNAPSHOT 0x04


typedef struct _ESE_REGISTERED_INFO
{
RPC_STRING wszDisplayName;
RPC_STRING wszEndpointAnnotation;
unsigned long fFlags;
ESE_ICON_DESCRIPTION iconDescription;
} ESE_REGISTERED_INFO;


#define ESE_REGISTER_BACKUP 0x00000001
#define ESE_REGISTER_ONLINE_RESTORE 0x00000002
#define ESE_REGISTER_OFFLINE_RESTORE 0x00000004

#define ESE_REGISTER_SNAPSHOT_BACKUP 0x00000010


HRESULT ESEBACK_API HrESEBackupRestoreGetRegistered(
IN WCHAR * wszServerName,
IN WCHAR * wszDisplayName,
IN unsigned long fFlags,
OUT unsigned long * pcRegisteredInfo,
OUT ESE_REGISTERED_INFO ** paRegisteredInfo
);

void ESEBACK_API ESEBackupRestoreFreeRegisteredInfo(
IN unsigned long cRegisteredInfo,
IN ESE_REGISTERED_INFO * aRegisteredInfo);

HRESULT ESEBACK_API HrESEBackupPrepare(
IN WCHAR * wszBackupServer,
IN WCHAR * wszBackupAnnotation,
OUT unsigned long * pcInstanceInfo,
OUT INSTANCE_BACKUP_INFO ** paInstanceInfo,
OUT HCCX * phccxBackupContext
);

HRESULT ESEBACK_API HrESEBackupSetup(
IN HCCX hccxBackupContext,
IN __int64 hInstanceId,
IN unsigned long btBackupType
);

HRESULT ESEBACK_API HrESEBackupTruncateLogs(
IN HCCX hccxBackupContext
);

HRESULT ESEBACK_API HrESEBackupGetDependencyInfo(
IN HCCX hccxBackupContext,
OUT WCHAR ** pwszInfo,
OUT unsigned long * pcwInfo,
OUT WCHAR ** pwszAnnotation
);

HRESULT ESEBACK_API HrESEBackupOpenFile (
IN HCCX hccxBackupContext,
IN WCHAR * wszFileName,
IN unsigned long cbReadHintSize,
IN unsigned long cSections,
OUT void ** rghFile,
OUT __int64 * rgliSectionSize
);

HRESULT ESEBACK_API HrESEBackupReadFile(
IN HCCX hccxBackupContext,
IN void * hFile,
IN void * pvBuffer,
IN unsigned long cbBuffer,
OUT unsigned long * pcbRead
);

HRESULT ESEBACK_API HrESEBackupCloseFile(
IN HCCX hccxBackupContext,
IN void * hFile
);

HRESULT ESEBACK_API HrESEBackupGetLogAndPatchFiles(
IN HCCX hccxBackupContext,
IN WCHAR ** pwszFiles
);

HRESULT ESEBACK_API HrESEBackupGetTruncateLogFiles(
IN HCCX hccxBackupContext,
IN WCHAR ** pwszFiles
);

void ESEBACK_API ESEBackupFreeInstanceInfo(
IN unsigned long cInstanceInfo,
IN INSTANCE_BACKUP_INFO * aInstanceInfo
);

void ESEBACK_API ESEBackupFree(
IN void * pvBuffer
);

#define ESE_BACKUP_INSTANCE_END_ERROR 0x00000000
#define ESE_BACKUP_INSTANCE_END_SUCCESS 0x00000001

HRESULT ESEBACK_API HrESEBackupInstanceEnd(
IN HCCX hccxBackupContext,
IN unsigned long fFlags
);

HRESULT ESEBACK_API HrESEBackupEnd(
IN HCCX hccxBackupContext
);

// Restore client APIs

typedef enum
{
recoverInvalid = 0,
recoverNotStarted = 1,
recoverStarted = 2,
recoverEnded = 3,
recoverStatusMax
}
RECOVER_STATUS;


typedef struct _RESTORE_ENVIRONMENT
{
WCHAR * m_wszRestoreLogPath;

WCHAR * m_wszSrcInstanceName;

unsigned long m_cDatabases;
WCHAR ** m_wszDatabaseDisplayName;
GUID * m_rguidDatabase;

WCHAR * m_wszRestoreInstanceSystemPath;
WCHAR * m_wszRestoreInstanceLogPath;
WCHAR * m_wszTargetInstanceName;

WCHAR ** m_wszDatabaseStreamsS;
WCHAR ** m_wszDatabaseStreamsD;

unsigned long m_ulGenLow;
unsigned long m_ulGenHigh;
WCHAR * m_wszLogBaseName;

time_t m_timeLastRestore;

RECOVER_STATUS m_statusLastRecover;
HRESULT m_hrLastRecover;
time_t m_timeLastRecover;

WCHAR * m_wszAnnotation;

} RESTORE_ENVIRONMENT;

HRESULT ESEBACK_API HrESERestoreLoadEnvironment(
IN WCHAR * wszServerName,
IN WCHAR * wszRestoreLogPath,
OUT RESTORE_ENVIRONMENT ** ppRestoreEnvironment);

void ESEBACK_API ESERestoreFreeEnvironment(
IN RESTORE_ENVIRONMENT * pRestoreEnvironment);


HRESULT ESEBACK_API HrESERestoreOpen(
IN WCHAR * wszServerName,
IN WCHAR * wszServiceAnnotation,
IN WCHAR * wszSrcInstanceName,
IN WCHAR * wszRestoreLogPath,
OUT HCCX * phccxRestoreContext);

HRESULT ESEBACK_API HrESERestoreReopen(
IN WCHAR * wszServerName,
IN WCHAR * wszServiceAnnotation,
IN WCHAR * wszRestoreLogPath,
OUT HCCX * phccxRestoreContext);


void ESEBACK_API ESERestoreFree( IN void *pvBuffer );


#define RESTORE_CLOSE_ABORT 0x1
#define RESTORE_CLOSE_NORMAL 0x0

HRESULT ESEBACK_API HrESERestoreClose(
IN HCCX hccxRestoreContext,
IN unsigned long fRestoreAbort);

HRESULT ESEBACK_API HrESERestoreAddDatabase(
IN HCCX hccxRestoreContext,
IN WCHAR * wszDatabaseDisplayName,
IN GUID guidDatabase,
IN WCHAR * wszDatabaseStreamsS,
OUT WCHAR ** pwszDatabaseStreamsD);

HRESULT ESEBACK_API HrESERestoreGetEnvironment(
IN HCCX hccxRestoreContext,
OUT RESTORE_ENVIRONMENT ** ppRestoreEnvironment);

HRESULT ESEBACK_API HrESERestoreSaveEnvironment(
IN HCCX hccxRestoreContext);


#define ESE_RESTORE_COMPLETE_ATTACH_DBS 0x00000001
#define ESE_RESTORE_COMPLETE_START_SERVICE ESE_RESTORE_COMPLETE_ATTACH_DBS

#define ESE_RESTORE_COMPLETE_NOWAIT 0x00010000
#define ESE_RESTORE_KEEP_LOG_FILES 0x00020000


HRESULT ESEBACK_API HrESERestoreComplete(
IN HCCX hccxRestoreContext,
IN WCHAR * wszRestoreInstanceSystemPath,
IN WCHAR * wszRestoreInstanceLogPath,
IN WCHAR * wszTargetInstanceName,
IN unsigned long fFlags);

HRESULT ESEBACK_API HrESERestoreAddDatabaseNS(
IN HCCX hccxRestoreContext,
IN WCHAR * wszDatabaseDisplayName,
IN GUID guidDatabase,
IN WCHAR * wszDatabaseStreamsS,
IN WCHAR * wszDatabaseStreamsD);


HRESULT ESEBACK_API HrESERestoreOpenFile (
IN HCCX hccxRestoreContext,
IN WCHAR * wszFileName,
IN unsigned long cSections,
OUT void ** rghFile
);

HRESULT ESEBACK_API HrESERestoreWriteFile(
IN HCCX hccxRestoreContext,
IN void * hFile,
IN void * pvBuffer,
IN unsigned long cbBuffer
);

HRESULT ESEBACK_API HrESERestoreCloseFile(
IN HCCX hccxRestoreContext,
IN void * hFile
);

/* function used to find the computers to be queried for backup/restore */
/* MAD like behaviour */
#define BACKUP_NODE_TYPE_MACHINE 0x00000001
#define BACKUP_NODE_TYPE_ANNOTATION 0x00000010
#define BACKUP_NODE_TYPE_DISPLAY 0x00000100

typedef struct _BACKUP_NODE_TREE
{
RPC_STRING wszName;
unsigned long fFlags;
ESE_ICON_DESCRIPTION iconDescription;

struct _BACKUP_NODE_TREE * pNextNode;
struct _BACKUP_NODE_TREE * pChildNode;

} BACKUP_NODE_TREE, * PBACKUP_NODE_TREE;


HRESULT ESEBACK_API HrESEBackupRestoreGetNodes(
IN WCHAR * wszComputerName,
OUT PBACKUP_NODE_TREE * ppBackupNodeTree);

void ESEBACK_API ESEBackupRestoreFreeNodes(
IN PBACKUP_NODE_TREE pBackupNodeTree);



// Specific errors that can be returned by callback functions

// Database to be restored is in use
#define hrFromCB_DatabaseInUse hrCBDatabaseInUse

// Database not found
#define hrFromCB_DatabaseNotFound hrCBDatabaseNotFound

// Display name for the database not found
#define hrFromCB_DatabaseDisplayNameNotFound hrCBDatabaseDisplayNameNotFound

// Requested path for restore log files not provided
#define hrFromCB_RestorePathNotProvided hrCBRestorePathNotProvided

// Instance to backup not found
#define hrFromCB_InstanceNotFound hrCBInstanceNotFound

// Database can not be overwritten by a restore
#define hrFromCB_DatabaseCantBeOverwritten hrCBDatabaseCantBeOverwritten

// snapshot API

HRESULT ESEBACK_API HrESESnapshotStart(
IN HCCX hccxBackupContext,
IN WCHAR * wszDatabases,
IN unsigned long fFlags );


HRESULT ESEBACK_API HrESESnapshotStop( IN HCCX hccxBackupContext,
IN unsigned long fFlags );

#ifdef __cplusplus
}
#endif

#endif // _EDBBCLI2_

cionci
17-05-2007, 16:43
Come vedi quella dichiarazione viene fatta solo se è definita MIDL_PASS cioè l'header sta venendo letto dal linguaggio per la definizione delle interfacce di Microsft: http://msdn2.microsoft.com/en-us/library/aa367091.aspx

Puoi vedere il significato di unique, string, size_is qui: http://msdn2.microsoft.com/en-us/library/aa367088.aspx

Quindi non si tratta di C++, ma di un preprocessore Microsft usato per la definizione delle interfacce...infatti nel caso MIDL_PASS non sia definita, il tipo RPC_STRING viene semplicemente definito come WCHAR * ed è così che lo interpreta il C++...

Addirittura IN, OUT e RPC_SIZE(X) sono "vuoti" quando vengono letti dall'inteprete C++...

Quando usi
#define XYZ xxxx

il preprocessore del compilatore sostituisce a tutti gli "XYZ" trovati nel codice "xxxx"...

niko_lol
17-05-2007, 16:48
RPC_STRING ok...l' ho capito. Ma RPC_SIZE che cavolo FA? :D

grazie!

cionci
17-05-2007, 16:52
Stesso discorso...hanno un significato per IDL, ma non per C++ (è vuoto quando) il file viene letto dal compilatore C++...

cionci
17-05-2007, 16:54
#ifdef MIDL_PASS

#define RPC_STRING [unique, string] WCHAR *
#define RPC_SIZE(X) [size_is(X)]

#else // ! MIDL_PASS


#include <objbase.h>
#include <initguid.h>
#include <mapiguid.h>

typedef long HRESULT;
#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif

#define RPC_STRING WCHAR *
#define RPC_SIZE(X)

#define IN
#define OUT

#endif // MIDL_PASS

La parte fra il primo e il secondo grassetto viene definita per il passaggio del preprocessore del compilatore MIDL...fra il secondo e il terzo grassetto viene definita per il preprocessore C++...