#Import для ком библиотеки - проблема
От: dida  
Дата: 25.11.03 09:47
Оценка:
НародЮ помогите:
Импортирую dll, написанную на коме посредством #import " .tlb"
в которой одна функция имеет параметр HWND/
А при обращении к этой функции выдается следующая ошибка
cannot convert parameter 1 from 'struct HWND__ *' to 'struct _RemotableHandle *'

Как ее обойти?

25.11.03 15:06: Перенесено модератором из 'Базы данных' — M
Re: #Import для ком библиотеки - проблема
От: dida  
Дата: 25.11.03 12:26
Оценка:
Ну помогите!!!
Re: (RemotableHandle*)
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.11.03 12:35
Оценка:
Здравствуйте, dida, Вы писали:

D>... выдается следующая ошибка cannot convert parameter 1 from 'struct HWND__ *' to 'struct _RemotableHandle *'
D>Как ее обойти?

Не сталкивался, даже не знаю, что посоветовать. Ну например сделать то, что просит компилятор — добавить (RemotableHandle*) перед параметром.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: (RemotableHandle*)
От: dida  
Дата: 25.11.03 12:38
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Не сталкивался, даже не знаю, что посоветовать. Ну например сделать то, что просит компилятор — добавить (RemotableHandle*) перед параметром.


Не помогает — первое что пробовала...
Re: #Import для ком библиотеки - проблема
От: dida  
Дата: 25.11.03 13:23
Оценка:
ПОМОГИТЕ, горю!!!!!
Re: #Import для ком библиотеки - проблема
От: Tom Россия http://www.RSDN.ru
Дата: 25.11.03 15:16
Оценка:
Здравствуйте, dida, Вы писали:

D>НародЮ помогите:

D>Импортирую dll, написанную на коме посредством #import " .tlb"
D>в которой одна функция имеет параметр HWND/
D>А при обращении к этой функции выдается следующая ошибка
D>cannot convert parameter 1 from 'struct HWND__ *' to 'struct _RemotableHandle *'

D>Как ее обойти?

что то не совсем понятно. показывай свой #import и idl если есть
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re: #Import для ком библиотеки - проблема
От: Дарней Россия  
Дата: 11.12.03 09:23
Оценка:
Здравствуйте, dida, Вы писали:

D>НародЮ помогите:

D>Импортирую dll, написанную на коме посредством #import " .tlb"
D>в которой одна функция имеет параметр HWND/
D>А при обращении к этой функции выдается следующая ошибка
D>cannot convert parameter 1 from 'struct HWND__ *' to 'struct _RemotableHandle *'

D>Как ее обойти?


попробую догадаться.... у тебя Platform SDK стоит? Или просто где-то STRICT определен?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: #Import для ком библиотеки - проблема
От: UnrealAlex Россия  
Дата: 11.12.03 09:56
Оценка: 3 (1)
Посмотрим как определен HWND в wtypes.idl, который автоматом подключается к любому idl:

typedef union _RemotableHandle switch( long fContext ) u
{
    case WDT_INPROC_CALL:   long   hInproc;
    case WDT_REMOTE_CALL:   long   hRemote;
} RemotableHandle;

typedef [unique] RemotableHandle * wireHWND;
typedef [unique] RemotableHandle * wireHMENU;
typedef [unique] RemotableHandle * wireHACCEL;
typedef [unique] RemotableHandle * wireHBRUSH;
typedef [unique] RemotableHandle * wireHFONT;
typedef [unique] RemotableHandle * wireHDC;
typedef [unique] RemotableHandle * wireHICON;


Я вижу 2 выхода:
1. Определи в idl импортируемого компонента вместо HWND — long и конверти на обоих концах.
2. Используй на обоих концах этот юнион.

P.S.
Судя по google чаще всего советуют первый выриант

P.P.S.
Единственная инфа в MSDN по этому поводу написана в статье по портированию idl 32bit -> 64bit
Microsoft Interface Definition Language (MIDL): 64-Bit Porting Guide

System handles that are partially remoted 
Partial remoting of a handle means that it has been remoted only as long (or as a DWORD) in both inproc and remote cases. This applies to a handle that would make sense only in the process that generated it, and its remoting as a DWORD was no more than a fix to a legacy problem when some OLE interfaces became remoted. The following handles fall into this category: HWND, HMENU, HACCEL, HBRUSH, HFONT, HDC, and HICON.

All of these are USER handles and behave as described in the section about the GDI and USER handles.

In particular, the following definition has not changed for porting to 64b:

typedef union _RemotableHandle switch( long fContext ) u
{
    case WDT_INPROC_CALL:   long   hInproc;
    case WDT_REMOTE_CALL:   long   hRemote;
} RemotableHandle;
Then the handles are defined in the usual manner:

typedef [unique] RemotableHandle * wireHWND;
typedef [wire_marshal( wireHWND)] void * HWND;

In the future, other branches can be added fairly easily to the union to cover full support for remoting these handles if needed. Please see the section "Changing Data Types Without Changing the Interface Version" to learn more about the meaning of the lack of a default clause in a remoted union.
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re[2]: #Import для ком библиотеки - проблема
От: UnrealAlex Россия  
Дата: 11.12.03 09:59
Оценка:
UA>
UA>typedef union _RemotableHandle switch( long fContext ) u
UA>{
UA>    case WDT_INPROC_CALL:   long   hInproc;
UA>    case WDT_REMOTE_CALL:   long   hRemote;
UA>} RemotableHandle;

UA>


Забыл дописать: этот union превращается в структуру после компиляции мидлом:
typedef struct _RemotableHandle
    {
    long fContext;
    /* [switch_is] */ /* [switch_type] */ union __MIDL_IWinTypes_0009
        {
        /* [case()] */ long hInproc;
        /* [case()] */ long hRemote;
        }     u;
    }     RemotableHandle;
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re[3]: (RemotableHandle*)
От: UnrealAlex Россия  
Дата: 11.12.03 10:38
Оценка:
Здравствуйте, dida, Вы писали:

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


Vi2>>Не сталкивался, даже не знаю, что посоветовать. Ну например сделать то, что просит компилятор — добавить (RemotableHandle*) перед параметром.


D>Не помогает — первое что пробовала...

Почему же не помогает? Помогает еще как...
[server idl]
    interface IHDCHolder : IUnknown
    {
        [helpstring("method DrawLine")] HRESULT DrawLine([in] HDC hdc);
        [helpstring("method DrawLine")] HRESULT DrawLineOnWindow([in] HWND hwnd);
    };



[server cpp]
STDMETHODIMP CHDCHolder::DrawLine(HDC hdc)
{

    ::MoveToEx(hdc, 10, 10, 0);
    ::LineTo(hdc, 100, 10);

    return S_OK;
}

STDMETHODIMP CHDCHolder::DrawLineOnWindow(HWND hwnd)
{
    HDC hdc = 0;
    hdc = ::GetDC(0);
    
    ::MoveToEx(hdc, 10, 10, 0);
    ::LineTo(hdc, 10, 100);
    
    ::ReleaseDC(0, hdc);

    return S_OK;
}



[client cpp]
#include "stdafx.h"
#import "D:\\Test\\dc_test\\Debug\\dc_test.dll" no_namespace

int main(int argc, char* argv[])
{
    ::CoInitialize(0);

    IHDCHolder* hdc_holder = 0;

    ::CoCreateInstance(__uuidof(HDCHolder), 0, CLSCTX_ALL, __uuidof(hdc_holder), reinterpret_cast<void**>(&hdc_holder));

    HDC hdc = 0;
    hdc = ::GetDC(0);

    hdc_holder->DrawLine(reinterpret_cast<RemotableHandle*>(hdc));
    hdc_holder->DrawLineOnWindow(reinterpret_cast<RemotableHandle*>(0));
    
    ::ReleaseDC(0, hdc);
    hdc_holder->Release();


    ::CoUninitialize();
    return 0;
}
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.