Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > подключение C# dll к проекту Builder с помощью COM


Автор: franzR 2.3.2010, 16:58
Вобщем ситуация такова.
Нужно подключить dll написанную на C# к проекту Builder 6.
Нашел пример для Delphi ( http://krez0n.org.ua/archives/248?rcommentid=503&rerror=invalid-request-cookie&rchash=765ad2e79491e151602e64b2a2a4a37c#comment-504 ), попробовал - работает. Проделал все манипуляции с созданием DLL, настройкой и регистрацией в винде. Builder увидел dll и  подключил. Обращаться к IMyInterface получается, его видит. А вот дальше сделать так как в примере не выходит..(((

Как можно перевести этот пример кода на с делфи на билдер?

Код

procedure TForm1.btnSumClick(Sender: TObject);
var
  intfRef: IMyInterface;
  result: Integer;
begin
  intfRef := CreateComObject(CLASS_TestClass) as IMyInterface;
  result := intfRef.Sum(StrToInt(Edit1.Text), StrToInt(Edit2.Text));
  lblSum.Caption := IntToStr(result);
end;


Я пробую так, посмотрел в хелпе Buildera
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        IMyInterface *initfRef;

        initfRef = CreateComObject(CLSID_TestClass &IID_IMyInterface);
}


Крутил и так и так.... не запускается пишет
Код

[C++ Error] Unit1.cpp(23): E2093 'operator&' not implemented in type '_GUID' for arguments of the same type


пробую еще так запускается но при выполнении обработчика вылетает ошибка при выполнении....

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        IMyInterface *initfRef;
        initfRef->Sum(5,5);
        
}


Собственно пытаюсь вызвать Sum из этого кода в либе.

Код

public interface IMyInterface
{
    int Sum(int x, int y);
    string AppendText(string text);
}

[ClassInterface(ClassInterfaceType.None)]
public class TestClass : IMyInterface
{
    //просто суммируем два числа
    public int Sum(int x, int y)
    {
        return x + y;
    }



 
Посоветуйте пожалуйста выход из ситуации. Я с COM-мами еще не сильно дружу, так как только вот первый день воюю, а нужно разрулить быстро... smile 

Автор: xvr 2.3.2010, 18:43

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
       DelphiInterface<IMyInterface> initfRef = CreateComObject(CLSID_TestClass);
       lblSum->Caption = IntToStr(initfRef->Sum(StrToInt(Edit1->Text), StrToInt(Edit2->Text)));
}




Автор: franzR 2.3.2010, 19:21
Цитата(xvr @ 2.3.2010,  18:43)
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
       DelphiInterface<IMyInterface> initfRef = CreateComObject(CLSID_TestClass);
       lblSum->Caption = IntToStr(initfRef->Sum(StrToInt(Edit1->Text), StrToInt(Edit2->Text)));
}


Спасибо все сработало! smile 

Но сразу в догонку еще вопрос, а можно ли обойтись без 
Код

DelphiInterface<IMyInterface>
 ?  smile  Чет он меня смущает...


Автор: xvr 2.3.2010, 21:11
Цитата(franzR @ 2.3.2010,  19:21)
Но сразу в догонку еще вопрос, а можно ли обойтись без 
Код

DelphiInterface<IMyInterface>
 ?  smile  Чет он меня смущает...

И чем смущает? Обычный Smart Pointer в VCL реализации. Если больше нравится ATL, можно взять оттуда - CComPtr и CComQIPtr

Автор: franzR 23.2.2011, 16:33
Уже ничем не смущает. Слегка было не понятно как объявить глобальную переменную, разобрался.

Всем откликнувшимся спасибо!

Тему можно считать закрытой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)