Создан в ATL EXE сервер с одним интерфейсом.
Клиент в виде dll создан без MFC.
Сервер зарегистрирован корректно.
Интерфейс IDWCDA.
В клиенте пишу IDWCDA * pIDWCDA.
Ошибки: error C2065: 'IDWCDA' : undeclared identifier
error C2065: 'pIDWCDA' : undeclared identifier
warning C4552: '*' : operator has no effect; expected operator with side-effect
Чайник.
Здравствуйте, Razz, Вы писали:
R>А если сервер предполагается быть удаленным, то
R>как быть? Сложно ли настроить DCOM?
R>С уважением,
R> Чайник.
Если ты имеешь в виду компиляцию — то же самое. Тебе нужно проимпортить tlb, или включить хидер и исполняемый файлы (описанные раньше).
Если ты имеешь в виду права, то тоже не сложно...
На клиенте нужно зарегистрировать tlb exe-шника (чтоб зарегистрировать интерфейсы).
Затем открываешь dcomcnfg на сервере и настраиваешь права на launch и на access, а также имперсонификацию, ну и на сервере права нужно дать на каталоги.
На клиенте можно в dcomcnfg настроить, где удаленно будет подниматься компонент, а можно программно указать, через CoCreateInstanceEx
Права можно и програмно настраивать, через CoInitializeSecurity.
Ну и т.д. и т.п.
Не хочет создавать объект
Хотел посмотреть что возвращает rc, но MessageBox
так и не появился...
Вот что я наваял в клиенте:
int DSA_CALL IDWCordDataAccess::BeginWork(void)
{
CLSID clsid;
HRESULT rc;
MessageBox(NULL, "IDWCordDataAccess::BeginWork(void)", "", MB_OKCANCEL);
/////////// Инициализация СОМ //////////////
if (FAILED(CoInitialize(NULL))){
MessageBox(NULL, "COM Error!", "", MB_OKCANCEL);
return FALSE;
}
else MessageBox(NULL, "COM Initialized Successfuly!", "", MB_OKCANCEL);
rc = CLSIDFromProgID(OLESTR("DWCordServerNew.CDWCDA.1"),&clsid);
if(FAILED(rc))
{
MessageBox(NULL, "Failure CLSIDFromProgID!", "", MB_OKCANCEL);
return 1;
}
IDWCDA *pIDWCDA;
rc = CoCreateInstance(clsid,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IDWCDA,
(void**)&pIDWCDA);
if (FAILED(rc))
{
MessageBox(NULL, "Failure in call to CoCreateInstance", "", MB_OKCANCEL);
switch(rc)
{
case S_OK:
MessageBox(NULL, "S_OK", "", MB_OKCANCEL);
break;
case REGDB_E_CLASSNOTREG:
MessageBox(NULL, "REGDB_E_CLASSNOTREG", "", MB_OKCANCEL);
break;
case CLASS_E_NOAGGREGATION:
MessageBox(NULL, "CLASS_E_NOAGGREGATION", "", MB_OKCANCEL);
break;
case E_NOINTERFACE:
MessageBox(NULL, "E_NOINTERFACE", "", MB_OKCANCEL);
break;
}
return 1;
}
return 1;
}
С уважением,
Чайник.
Здравствуйте, rus blood, Вы писали:
RB>Что конкретно не работает?
Не создается объект.
В OLE/COM Object Viewer возникает ошибка:
CodeGuard detected error(s) in the program. A log file will be created.
а потом:
IClassFactory::CreateInstance failed
<No system message defined>RPC_E_SERVERFAULT ($80010105)
// CDWCDA.cpp : Implementation of CCDWCDA
#include "stdafx.h"
#include "DWCordServerNew.h"
#include "CDWCDA.h"
#include "data_access.h"
IDSADataAccess *IDataAccess = NULL;
int DWClientID = 0;
static HINSTANCE hDriver = 0;
static funcDSADriverDeInitialize *pfDSADriverDeInitialize = NULL;
////////////////////////////////////////////////////////////////////////////////////
// Constructor CCDWCDA ///////// Подключение и инициализация драйвера БД ////////////
CCDWCDA::CCDWCDA()
{
int Initialized = 0;
hDriver = LoadLibrary("bdeldw.dww");
if(hDriver) {
funcDSADriverInfo *pfDSADriverInfo = (funcDSADriverInfo*)
GetProcAddress(hDriver, "DriverInfo");
funcDSADriverInitialize *pfDSADriverInitialize = (funcDSADriverInitialize*)
GetProcAddress(hDriver, "DriverInitialize");
pfDSADriverDeInitialize = (funcDSADriverDeInitialize*)
GetProcAddress(hDriver, "DriverDeInitialize");
if(pfDSADriverInfo && pfDSADriverInitialize && pfDSADriverDeInitialize) {
if(pfDSADriverInitialize(&IDataAccess)) Initialized = 1;
}
}
else MessageBox(NULL,"bdeldw.dll load failure!","",MB_OK);
if(!Initialized) {
if(hDriver) {FreeLibrary(hDriver); hDriver = 0;}
}
DWClientID = IDataAccess->BeginWork();
if(!DWClientID) {
if(hDriver) {FreeLibrary(hDriver); hDriver = 0;}
}
}
////////////////////////////////////////////////////////////////////////////////////
// Destructor CCDWCDA ///////////////////////////////////////////////////////////////
CCDWCDA::~CCDWCDA()
{
if(!IDataAccess) return;
IDataAccess->EndWork(DWClientID);
pfDSADriverDeInitialize();
if(hDriver) {FreeLibrary(hDriver); hDriver = 0;}
IDataAccess = 0;
pfDSADriverDeInitialize = 0;
}
.... .... ....
// DWCordServerNew.idl : IDL source for DWCordServerNew.dll
//
// This file will be processed by the MIDL tool to
// produce the type library (DWCordServerNew.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(95EFD011-C260-4813-9154-DF4436C2F6E7),
helpstring("IDWCDA Interface"),
pointer_default(unique)
]
interface IDWCDA : IUnknown
{
[helpstring("method BeginWork")] HRESULT BeginWork([out] int *Result);
[helpstring("method EndWork")] HRESULT EndWork([in] int ClientID, [out] int *Result);
[helpstring("method CurrentProblem")] HRESULT CurrentProblem([in] int ClientID, [out] int *Result);
[helpstring("method DeleteProblem")] HRESULT DeleteProblem([in] int ClientID, [in] int ProblemID, [out] int *Result);
[helpstring("method DeleteParameter")] HRESULT DeleteParameter([in] int ClientID, [in] int PID, [out] int *Result);
[helpstring("method DeleteObject")] HRESULT DeleteObject([in] int ClientID, [in] int OID, [out] int *Result);
[helpstring("method LockModel")] HRESULT LockModel([in] int ClientID, [in] int MID, [out] int *Result);
[helpstring("method UnLockModel")] HRESULT UnLockModel([in] int ClientID, [in] int MID, [out] int *Result);
[helpstring("method ModelIsLocked")] HRESULT ModelIsLocked([in] int ClientID, [in] int MID, [out] int *Result);
[helpstring("method DeleteParametersMDFNumbers")] HRESULT DeleteParametersMDFNumbers([in] int ClientID, [in] int PID, [in] int MDValues, [in] int FValues, [out] int *Result);
[helpstring("method WriteData")] HRESULT WriteData([out] int *Result, [in] int ClientID, [in] int ID, [in,out] BSTR *Data);
[helpstring("method ProblemProperties")] HRESULT ProblemProperties([out] int *Result, [in] int ClientID, [in] int Operation, [in] int ProblemID, [in] unsigned SubjectOfChange, [in, out] BSTR *Name, [in, out] BSTR *Description, [in, out] int *DWValues, [in, out] int *ChangedValues, [in, out] int *CalculatedValues, [in, out] int *MDRValues, [in, out] int *ForecastedValues);
[helpstring("method DWOperations")] HRESULT DWOperations([in] int ClientID, [in] int Operation, [out] int *Result);
[helpstring("method ParameterProperties")] HRESULT ParameterProperties([in] int ClientID, [in] int Operation, [in] int ParameterID, [in] unsigned SubjectOfChange, [in, out] BSTR *Name, [in, out] BSTR *Nick, [in, out] BSTR *Units, [in, out] long int *Period, [in, out] int *Type, [in, out] int *LinkSource, [in, out] int *ValuesType, [in, out] int *Volume, [in, out] int *MDRMethod, [in, out] int *DoCalculation, [in, out] int *DoAnomalies, [in, out] int *ForecastingMethod, [in, out] int *ForecastingHorizon, [in, out] int *DigitsAfterComma, [in, out] BSTR *ObjectsList, [in, out] BSTR *Categories, [in, out] BSTR *KELExpression, [in, out] BSTR *KELProgram, [in, out] BSTR *AnomalExpression, [in, out] BSTR *AnomalProgram, [in, out] BSTR *UserData, [in, out] unsigned long *Data1, [in, out] unsigned short *Data2, [in, out] unsigned short *Data3, [in, out] BSTR *Data4);
[helpstring("method CreateParameter")] HRESULT CreateParameter([in] int ClientID, [in] int Parent, [in, out] BSTR *Name, [in, out] BSTR *Nick, [in, out] BSTR *Units, [in, out] long int *Period, [in, out] int *Type, [in, out] int *LinkSource, [in, out] int *ValuesType, [in, out] int *Volume, [in, out] int *MDRMethod, [in, out] int *DoCalculation, [in, out] int *DoAnomalies, [in, out] int *ForecastingMethod, [in, out] int *ForecastingHorizon, [in, out] int *DigitsAfterComma, [in, out] BSTR *ObjectsList, [in, out] BSTR *Categories, [in, out] BSTR *KELExpression, [in, out] BSTR *KELProgram, [in, out] BSTR *AnomalExpression, [in, out] BSTR *AnomalProgram, [in, out] BSTR *UserData, [in, out] unsigned long *Data1, [in, out] unsigned short *Data2, [in, out] unsigned short *Data3, [in, out] BSTR *Data4);
[helpstring("method DeleteModel")] HRESULT DeleteModel([in] int ClientID, [in] int MID, [out] int *Result);
[helpstring("method DeleteData")] HRESULT DeleteData([in] int ClientID, [in] int ID, [out] int *Result);
[helpstring("method DirverProperties")] HRESULT DirverProperties([in] int ClientID);
[helpstring("method ObjectProperties")] HRESULT ObjectProperties([in] int ClientID, [in] int Operation, [in] int ObjectID, [in] unsigned SubjectOfChange, [in, out] BSTR *Properties, [out] int *Result);
[helpstring("method CreateObject")] HRESULT CreateObject([in] int ClientID, [in] int Parent, [in, out] BSTR *Properties, [out] int *Result);
[helpstring("method ModelProperties")] HRESULT ModelProperties([in] int ClientID, [in] int Operation, [in] int MID, [in] unsigned SubjectOfChange, [in, out] BSTR *Properties, [out] int *Result);
[helpstring("method CreateModel")] HRESULT CreateModel([in] int ClientID, [in] int Parent, [in, out] BSTR *Properties, [out] int *Result);
[helpstring("method ReadNumber")] HRESULT ReadNumber([in] int PID, [in] int OID, [in] __int64 Date, [in] unsigned Options, [out] double *Value, [out] double *LeftBound, [out] double *RightBound, [out] int *Result);
[helpstring("method WriteNumber")] HRESULT WriteNumber([in] int PID, [in] int OID, [in] __int64 Date, [in] int ValueType, [in] double Value, [in] double LeftBound, [in] double RightBound, [out] int *Result);
[helpstring("method DeleteNumber")] HRESULT DeleteNumber([in] int ClientID, [in] int PID, [in] int OID, [in] __int64 Date, unsigned Options, [out] int *Result);
[helpstring("method ParameterPeriod")] HRESULT ParameterPeriod([in] int PID, [out] __int64 *Result);
[helpstring("method EnumerateProblems")] HRESULT EnumerateProblems([out] int *Result, [in, out] BSTR *Problems);
[helpstring("method SelectProblem")] HRESULT SelectProblem([in] int ClientID, [in] int ProblemID, [out] int *Result);
[helpstring("method GetDate")] HRESULT GetDate([in] int ParameterID, [in] int ObjectID, [in] int Options, [out] __int64 *Result);
[helpstring("method ChangeParent")] HRESULT ChangeParent([in] int ClientID, [in] int ID, [in] int Subject, [in] int NewParent, [out] int *Result);
[helpstring("method GetParent")] HRESULT GetParent([in] int ID, [in] int Subject, [in,out] int *ParentID, [out] int *Result);
[helpstring("method GetIDOnNick")] HRESULT GetIDOnNick([in] BSTR Nick, [in] int Subject, [out] int *Result);
[helpstring("method DeleteString")] HRESULT DeleteString([in] int ClientID, [in] int PID, [in] int OID, [in] __int64 Date, [out] int *Result);
[helpstring("method CreateProblem")] HRESULT CreateProblem([in] int ClientID, [in, out] BSTR *Name, [in, out] BSTR *Description, [in, out] int *DWValues, [in, out] int *ChangedValues, [in, out] int *CalculatedValues, [in, out] int *MDRValues, [in, out] int *ForecastedValues, [out] int *Result);
};
[
uuid(A9B90FA4-CBEA-4727-9ABB-CD504C3C0C15),
version(1.0),
helpstring("DWCordServerNew 1.0 Type Library")
]
library DWCORDSERVERNEWLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(05049ACF-27E7-4B88-AB55-F1A1645029E7),
helpstring("CDWCDA Class")
]
coclass CDWCDA
{
[default] interface IDWCDA;
};
};