"%" вместо "*"
От: Kaukko Россия  
Дата: 18.07.07 07:21
Оценка:
есть компонент. у него есть фунция void GetData(..., float * massiv), которая заполняет этот massiv. так написано и в описании, и в работающей программе, сделаной в VS 2003. я пишу программу в 2005-ой, и вместо float* она требует float% — соответсвенно ошибка — нельзя преобразовать типы. как я понял из MSDN, % — это ещё одна модная ссылка. вопрос: как всё-таки организовать выполнение функции GetData? ибо у меня преобразовать типы не получилось.
Re: "%" вместо "*"
От: dip_2000 Россия  
Дата: 18.07.07 08:09
Оценка:
Здравствуйте, Kaukko, Вы писали:

K>есть компонент. у него есть фунция void GetData(..., float * massiv), которая заполняет этот massiv. так написано и в описании, и в работающей программе, сделаной в VS 2003. я пишу программу в 2005-ой, и вместо float* она требует float% — соответсвенно ошибка — нельзя преобразовать типы. как я понял из MSDN, % — это ещё одна модная ссылка. вопрос: как всё-таки организовать выполнение функции GetData? ибо у меня преобразовать типы не получилось.


Если речь идет о pure c++, то никаких операторов "%- модных ссылок" в нем нет И соответственно необходимости в изменении кода при переносе от VS 2003 к 2005 нет.
Re[2]: "%" вместо "*"
От: Kaukko Россия  
Дата: 18.07.07 08:16
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>Если речь идет о pure c++, то никаких операторов "%- модных ссылок" в нем нет И соответственно необходимости в изменении кода при переносе от VS 2003 к 2005 нет.


ну и как тогда сделать так, чтоб был "pure c++"? не хочу всё переделывать в 2003-ей студии...
Re[3]: "%" вместо "*"
От: dip_2000 Россия  
Дата: 18.07.07 08:38
Оценка:
K>ну и как тогда сделать так, чтоб был "pure c++"? не хочу всё переделывать в 2003-ей студии...

В настройках проекта. Вместо CLR выбрать, что то более "классическое" MFC там, или Win32
Re[4]: "%" вместо "*"
От: Kaukko Россия  
Дата: 18.07.07 09:01
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>В настройках проекта. Вместо CLR выбрать, что то более "классическое" MFC там, или Win32


в настройках нашел только
configuration properties -> general -> common language runtime support ->...
перебрал все варианты (No support, /clr:pure, /clr:oldSyntax, /clr:safe) — или та же ошибка, или их ещё больше
Re[5]: "%" вместо "*"
От: dip_2000 Россия  
Дата: 18.07.07 09:09
Оценка:
K>в настройках нашел только
K>configuration properties -> general -> common language runtime support ->...
K>перебрал все варианты (No support, /clr:pure, /clr:oldSyntax, /clr:safe) — или та же ошибка, или их ещё больше
Вы наверное изначально создавали проект как CLR ? Вам нужен чистый с++(что бы не заморачиваться с % )
Re[6]: "%" вместо "*"
От: Kaukko Россия  
Дата: 18.07.07 09:48
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>Вы наверное изначально создавали проект как CLR ? Вам нужен чистый с++(что бы не заморачиваться с % )


Видимо, придётся всё же заморачиваться. Т.к. при добавлении в пустой проект Windows Form студия говорит, что если добавляется CRL компонент, то проект конвертируестя в CRL...

и так, ещё раз вопрос: что делать с "%"?
Re[7]: "%" ?????? "*"
От: TheBeard Россия  
Дата: 23.07.07 20:06
Оценка:
Kaukko wrote:

> ??????, ???????? ??? ?? ??????????????. ?.?. ??? ?????????? ? ??????

> ?????? Windows Form ?????? ???????, ??? ???? ??????????? CRL ?????????, ??
> ?????? ?????????????? ? CRL...
>
> ? ???, ??? ??? ??????: ??? ?????? ? "%"?

???? ?? ????: ??? ???????? ? ?++ ? ?? ???????????? Windows Forms, ???
???????????? Windows Forms ? ???????? ? ?++/CLR.

?++ ? ?++/CLR -- ?????????? ?????? ?????, ?? ?????? ??????????? ???????
??????? ?????
Posted via RSDN NNTP Server 2.1 beta
Re[7]: "%" вместо "*"
От: TheBeard Россия  
Дата: 23.07.07 20:09
Оценка:
Прошу прощения, кодировка сбилась

K>Видимо, придётся всё же заморачиваться. Т.к. при добавлении в пустой проект Windows Form студия говорит, что если добавляется CRL компонент, то проект конвертируестя в CRL...


K>и так, ещё раз вопрос: что делать с "%"?



Одно из двух: или работать в С++ и не использовать Windows Forms, или использовать Windows Forms и работать в С++/CLR.

С++ и С++/CLR -- совершенно разные языки, по чистой случайности имеющие похожие имена и синтаксис
Re[8]: "%" вместо "*"
От: SuhanovSergey  
Дата: 24.07.07 20:12
Оценка:
Здравствуйте, TheBeard, Вы писали:

K>>Видимо, придётся всё же заморачиваться. Т.к. при добавлении в пустой проект Windows Form студия говорит, что если добавляется CRL компонент, то проект конвертируестя в CRL...

K>>и так, ещё раз вопрос: что делать с "%"?
TB>Одно из двух: или работать в С++ и не использовать Windows Forms, или использовать Windows Forms и работать в С++/CLR.
Не скажите, Framework Class Library и чистый C++ могут ужиться в одно проетке очень даже успешно.

Из вопроса непонятно, GetData — это чья функция? Это метод компонента .net? Это метод класса C++? Это метод COM-интерфейса?
Re[9]: "%" вместо "*"
От: TheBeard Россия  
Дата: 25.07.07 08:00
Оценка:
SS>Из вопроса непонятно, GetData — это чья функция? Это метод компонента .net? Это метод класса C++? Это метод COM-интерфейса?

Из вопроса вообще мало что понятно. Судя по сигнатуре функции, она на С++ (там указатель на float). Соответственно, вызывать ее из managed кода проблематично, придется объявлять код unsafe.
Re[10]: "%" вместо "*"
От: Kaukko Россия  
Дата: 25.07.07 10:52
Оценка:
Здравствуйте, TheBeard, Вы писали:


SS>>Из вопроса непонятно, GetData — это чья функция? Это метод компонента .net? Это метод класса C++? Это метод COM-интерфейса?


TB>Из вопроса вообще мало что понятно. Судя по сигнатуре функции, она на С++ (там указатель на float). Соответственно, вызывать ее из managed кода проблематично, придется объявлять код unsafe.


GetData — метод неповторимого и важнейшего в программе ActiveX компонента. организовать выполнения метода без ругательств компилятора удалось объявляя в качестве последнего аргумента или нулевой элемент массива, или *<имя массива>. но ни при одном из них программа не работает. так что у меня творческий кризис — этот компонент я переписать не в состоянии и разобраться в нём тоже.

придётся всё переделывать в MFC, с которым, кстати, возникли трудности — нету привычных методов и параметров. даже не знаю как сделать кнопку невидимой, ибо поля Visible не нахожу. посоветуйте нормальную книжку по mfc плз.
Re[11]: "%" вместо "*"
От: SuhanovSergey  
Дата: 25.07.07 19:26
Оценка:
Здравствуйте, Kaukko, Вы писали:


K>GetData — метод неповторимого и важнейшего в программе ActiveX компонента.

Для ActiveX-контрлов как и для других COM-компонентов должны без проблем генерироваться .net-обёртки при условии, что компоненты соотвествую спецификации COM. Вероятно, GetData() ей не соответствует. Раз уж вы всё-равно пишете на C++/CLI, то проще всего воспользоваться основной фичей языка: возможно легко смешивать управляемый и неуправляемый код. Предлагаю рабоатать с вашим ActiveX-объектом с помощью тех же средств C++, которыми вы пользовались раньше, а всё остальное писать в виде управляемого кода. Для примера сделал тестовый проект C++/CLR/Windows Forms Application, бросил на форму контрол "SVGActiveX 3.0" и кнопку с таким onclick-ом:

    System::IntPtr unk = Marshal::GetIUnknownForObject(axSVGCtl1->GetOcx()); // берём указатель на IUnknown
    CComQIPtr<ISVGControl> svgCtrl(static_cast<IUnknown*>(unk.ToPointer())); // получаем ATL-ный CComQIPtr, указывающий на наш контрол
    Marshal::Release(unk); // релизим ссылку, неявно добавленную в GetIUnknownForObject

    // дальше работаем с svgCtrl старыми добрыми средствами  C++, без каких-либо %-ссылок
    svgCtrl->setDefaultFontSize(4.0);
    TCHAR buf[MAX_PATH];
    GetModuleFileName(NULL,buf,MAX_PATH);
    _tcscpy(PathFindFileName(buf), TEXT("1.svg"));
    svgCtrl->put_SRC(CComBSTR(buf));


В начале файла Form1.h:

#include "NPSVG3_h.h" // заколовочный файл с COM-интерфейсами, предварительно сгенерированный с помощью midl. У вас тоже по-идее должен быть такой для вышего компонента.
#include <atlbase.h> // ATL
#include <atlcom.h> // ATL


Могу прислать весь тестовый проект, если интересно.
Re[12]: "%" вместо "*"
От: Kaukko Россия  
Дата: 26.07.07 08:06
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>Могу прислать весь тестовый проект, если интересно.


да пожалуйста пришлите весь проект
Re[13]: "%" вместо "*"
От: SuhanovSergey  
Дата: 26.07.07 10:09
Оценка:
Здравствуйте, Kaukko, Вы писали:

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


SS>>Могу прислать весь тестовый проект, если интересно.


K>да пожалуйста пришлите весь проект


Куда? У вас не написан e-mail в профиле.
Re[14]: "%" вместо "*"
От: Kaukko Россия  
Дата: 26.07.07 10:28
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>Куда? У вас не написан e-mail в профиле.


Уже есть...

я почему-то думал, что здесь есть возможность прикреплять файлы к сообщениям...
Re[12]: "%" вместо "*"
От: Kaukko Россия  
Дата: 02.08.07 09:45
Оценка:
сделал всё так же, как написал SuhanovSergey.
создал файлик *_h.h, вместе с ним создался *_i.c,
для того, что бы он компилился пришлось добавлять в командную строку /Tp *_i.c, но возникает ошибка
C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file "*_i.c"
что за?

если эти файлы удалить из проекта и просто подключить библиотеки atlbase и atlcom, то выдается ошибка
An unhandled exception of type 'System.TypeInitializationException' occurred in Unknown Module.
Additional information: The type initializer for '<Module>' threw an exception.
как с этим бороться?
Re[13]: "%" вместо "*"
От: SuhanovSergey  
Дата: 03.08.07 20:38
Оценка: 7 (1)
Здравствуйте, Kaukko, Вы писали:

K>сделал всё так же, как написал SuhanovSergey.

K>создал файлик *_h.h, вместе с ним создался *_i.c,
K>для того, что бы он компилился пришлось добавлять в командную строку /Tp *_i.c, но возникает ошибка
K>C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file "*_i.c"
K>что за?
Надо откючить precompiled headers для этого файла.

K>если эти файлы удалить из проекта и просто подключить библиотеки atlbase и atlcom, то выдается ошибка

K>An unhandled exception of type 'System.TypeInitializationException' occurred in Unknown Module.
K>Additional information: The type initializer for '<Module>' threw an exception.
K>как с этим бороться?
Это известная проблема CLR/ATL приложений. Причина: не инициализируется C-runtime потому что в проекте нет WinMain. Лечение: очищается опция Linker->Advanced->Entry Point, после этого вручную пишется функция WinMain
int __stdcall WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
    return main(nullptr);
}

Имеет смысл переименовать и использовать мой тестовый проект.
Re[14]: "%" вместо "*"
От: Kaukko Россия  
Дата: 06.08.07 12:26
Оценка:
всё исправил, всё сделал...
но лучше не стало... всё так же вылетает/зависает c Access Violation на той же строчке c GetData(...)
Re[15]: "%" вместо "*"
От: SuhanovSergey  
Дата: 07.08.07 08:36
Оценка:
Здравствуйте, Kaukko, Вы писали:

K>всё исправил, всё сделал...

K>но лучше не стало... всё так же вылетает/зависает c Access Violation на той же строчке c GetData(...)
Ну не знаю тогда. Если приложение компилится и запускается, то у вас есть все возможности воспроизвести то окружение, в котором компонент работал в MFC приложении. Посмотрите внимательнее отличия старого кода от нового.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.