Как получить доступ к EXE серверу?
От: Razz Россия  
Дата: 21.05.04 12:08
Оценка:
Создан в 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

Чайник.
Re: Как получить доступ к EXE серверу?
От: KGP http://kornilow.newmail.ru
Дата: 21.05.04 12:22
Оценка:
Здравствуйте, Razz, Вы писали:

#import ... и
IDWCDA* pIDWCDA;
pIDWCDA->CreateInstance(...
... << RSDN@Home 1.1.2 stable >>
Re: Как получить доступ к EXE серверу?
От: BK  
Дата: 21.05.04 12:48
Оценка:
Если есть idl-файл, можно так
midl.exe /header lingvo.h lingvo.idl
Получишь:
lingvo.h
lingvo.tlb
lingvo_i.c
Re: Как получить доступ к EXE серверу?
От: Razz Россия  
Дата: 21.05.04 14:21
Оценка:
А если сервер предполагается быть удаленным, то
как быть? Сложно ли настроить DCOM?


С уважением,
Чайник.
Re[2]: Как получить доступ к EXE серверу?
От: rus blood Россия  
Дата: 21.05.04 14:32
Оценка:
Здравствуйте, Razz, Вы писали:

R>А если сервер предполагается быть удаленным, то

R>как быть? Сложно ли настроить DCOM?


R>С уважением,

R> Чайник.

Если ты имеешь в виду компиляцию — то же самое. Тебе нужно проимпортить tlb, или включить хидер и исполняемый файлы (описанные раньше).

Если ты имеешь в виду права, то тоже не сложно...
На клиенте нужно зарегистрировать tlb exe-шника (чтоб зарегистрировать интерфейсы).
Затем открываешь dcomcnfg на сервере и настраиваешь права на launch и на access, а также имперсонификацию, ну и на сервере права нужно дать на каталоги.

На клиенте можно в dcomcnfg настроить, где удаленно будет подниматься компонент, а можно программно указать, через CoCreateInstanceEx

Права можно и програмно настраивать, через CoInitializeSecurity.

Ну и т.д. и т.п.
Имею скафандр — готов путешествовать!
Re[2]: Как получить доступ к EXE серверу?
От: Razz Россия  
Дата: 21.05.04 17:50
Оценка:
Не хочет создавать объект
Хотел посмотреть что возвращает 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;
}




С уважением,
Чайник.
Re[3]: Как получить доступ к EXE серверу?
От: Razz Россия  
Дата: 21.05.04 18:34
Оценка:
Объект не хочет создаваться и в OLE/COM Object Viewer.
При попытке Create Instance пишет ошибку:


IClassFactory::CreateInstance failed
<No system message defined>RPC_E_SERVERFAULT ($80010105)


В чём может быть проблема?


С уважением,
Чайник.
Re[4]: Как получить доступ к EXE серверу?
От: rus blood Россия  
Дата: 22.05.04 09:50
Оценка:
R>

R>IClassFactory::CreateInstance failed
R><No system message defined>RPC_E_SERVERFAULT ($80010105)


R>В чём может быть проблема?


The server threw an exception
Ошибка в сервере.
Имею скафандр — готов путешествовать!
Re[3]: Как получить доступ к EXE серверу?
От: rus blood Россия  
Дата: 22.05.04 09:50
Оценка:
Здравствуйте, Razz, Вы писали:


R>
R>


Так у тебя exe-сервер удаленный или локальный?
Имею скафандр — готов путешествовать!
Re[4]: Как получить доступ к EXE серверу?
От: Razz Россия  
Дата: 22.05.04 12:25
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Razz, Вы писали:



R>>
R>>


RB>Так у тебя exe-сервер удаленный или локальный?


Сервер предполагается быть удаленным.
Но сейчас он на стадии разработки и поэтому локальный
(CLSCTX_LOCAL_SERVER)
Re[5]: Как получить доступ к EXE серверу?
От: rus blood Россия  
Дата: 22.05.04 12:31
Оценка:
Что конкретно не работает?
Имею скафандр — готов путешествовать!
Re[6]: Как получить доступ к EXE серверу?
От: Razz Россия  
Дата: 22.05.04 13:54
Оценка:
Здравствуйте, 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;
    };
};
Re[7]: Как получить доступ к EXE серверу?
От: rus blood Россия  
Дата: 22.05.04 14:52
Оценка:
RB>>Что конкретно не работает?

R>
R>// Constructor CCDWCDA ///////// Подключение и инициализация драйвера БД ////////////
R>CCDWCDA::CCDWCDA()
R>{
.............
R>}
R>


Падает наверно, что-нить в конструкторе.
1. Продебажь
2. Поставь try-catch блоки.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.