Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
#1

Linking obj file

16.02.2013, 14:29. Просмотров 1797. Ответов 8
Метки нет (Все метки)

Доброго времени суток, в общем в дельфи я нуб, но есть следующее:
Суть задачи: возможность вызывать управляемый CLR код из неуправляемого.
На С++ эта зада была успешно реализована, а вот реализовать на дельфи у меня не получается.
что имеется:
есть некий код на С++, который вызывает среду CLR, и запускает сборку .NET
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <metahost.h>
#pragma comment(lib, "mscoree.lib")
#define DllExport extern "C" _declspec(dllexport)
 
DllExport int CLRCreateInstance(char* dllName, char* typeName)
{
    ICLRMetaHost *pMetaHost = nullptr;
    ICLRRuntimeInfo *pCLRRuntimeInfo = nullptr;
    ICLRRuntimeHost *pCLRRuntimeHost = nullptr;
    __try
    {
        HRESULT hr;
        hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (void**)&pMetaHost);
        if (hr!=S_OK)
            return -1;
 
        hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (void**)&pCLRRuntimeInfo);
 
        BOOL bCLRIsLoadable;
        hr = pCLRRuntimeInfo->IsLoadable(&bCLRIsLoadable);
 
        if (hr!=S_OK)
            return -1;
        if (!bCLRIsLoadable)
            return -1;
 
        hr = pCLRRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (void**)&pCLRRuntimeHost);
        if (hr!=S_OK)
            return -1;
 
        hr = pCLRRuntimeHost->Start();
        if (hr!=S_OK)
            return -1;
полученный при компиляции файл я попытался прилинковать в проекте дельфи
Delphi
1
2
3
4
implementation
 
{$L 'CLRApplet.obj'}
function GetCLR(dllName, typeName, methodName, params : PChar): integer; cdecl; external;
в итоге он мне выдает
[dcc32 Error] Unit1.pas(25): E2065 Unsatisfied forward or external declaration: 'GetCLR'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '_CLRCreateInstance@12'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '@_RTC_CheckStackVars@8'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '__RTC_CheckEsp'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '__RTC_InitBase'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '__RTC_Shutdown'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '__except_handler4'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '__local_unwind4'
[dcc32 Error] Unit1.pas(36): E2065 Unsatisfied forward or external declaration: '___security_cookie'
пробовал линковать CLRApplet.obj в С++ - там все хорошо.
не могу понять что ему необходимо объявлять, для того чтобы он скушал данный объектный файл.

ЗЫ. пробовал пойти другим путем.
Создал интерфейсы
C++
1
2
3
ICLRMetaHost   
ICLRRuntimeInfo
ICLRRuntimeHost
потом объявил
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
function CLRCreateInstance(clsid, riid :TGUID; mHost : PPointer) : integer; external 'MSCorEE.dll' name 'CLRCreateInstance';
//............
 
var
    mHost: ^ICLRMetaHost;
    clsid, riid : TGUID;
begin
    mHost  := nil;
    clsid  := StringToGUID('{9280188D-0E8E-4867-B30C-7FA83884E8DE}');
    riid   := StringToGUID('{D332DB9E-B9B3-4125-8207-A14884F53216}');
 
    CLRCreateInstance(clsid, riid, pointer(@mHost));
и попытался вызвать функцию CLRCreateInstance но получил ошибку, мол лезу не туда куда следует...

не представляю как можно еще выкрутится из этой ситуации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2013, 14:29
Ответы с готовыми решениями:

Файлы Object File (.obj) в проекте Делфи
Че это за файлы не пойму? Скачал один исходник (на скрине) хотел картинок с...

procedure fileoperation (var f: file of integer; var h: file of TCount); что неправильно?????
procedure fileoperation (var f: file of integer; var h: file of TCount); что...

Warning: Duplicate resource: Type 24 (user-defined), ID 1; File resource <>.res kept; file …\WindowsXP.res
аааааааааа.... что тут делать) я и этот файл .res удаляла и \WindowsXP.res тоже...

Obj(openssl) use in Delphi
Собрал openssl с помощью builder c++ Появились обьектные файлы. Их количество...

Функция из файла *.obj
Есть некая функция в файле *.obj можно ли ее вызвать и если да то как? ...

8
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
16.02.2013, 15:37 #2
Формат объектных файлов в Delphi и C++ различается. Использование объектных файлов Си в Delphi.
1
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
17.02.2013, 21:18  [ТС] #3
Давайте еще раз вернемся к нашим баранам, немножко побадавшись, решил написать вызов GLRCreateInstance на C#
C#
1
2
3
4
5
6
7
8
9
10
[DllImport("MSCorEE.dll")]
static extern int CLRCreateInstance(Guid clsid, Guid riid, out IntPtr host);
 
static void Main(string[] args)
{
    vsr host = new IntPtr(0);
    var clsid = new Guid(0X9280188D, 0X0E8E, 0X4867, 0XB3, 0X0C, 0X7F, 0XA8, 0X38, 0X84, 0XE8, 0XDE);
    var riid  = new Guid(0xD332DB9E, 0xB9B3, 0x4125, 0x82, 0x07, 0xA1, 0x48, 0x84, 0xF5, 0x32, 0x16);
 
    var res = CLRCreateInstance(clsid, riid, out host);
в итоге получил казатель на интерфейс и удачную отработку функции, результат S_OK (0)

хоть убейте, не понимаю, что от меня хочет дельфи, и почему не отрабатывает аналогичный код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function CLRCreateInstance(clsid, riid :TGUID; out mHost : PPointer) : integer; external 'MSCorEE.dll' name 'CLRCreateInstance';
 
// ---
 
var
    mPointer : PPointer;
    clsid, riid : TGUID;
    res : integer;
begin
    mPointer := nil;
    clsid    := StringToGUID('{9280188D-0E8E-4867-B30C-7FA83884E8DE}');
    riid     := StringToGUID('{D332DB9E-B9B3-4125-8207-A14884F53216}');
 
    res      := CLRCreateInstance(clsid, riid, mPointer);

Не по теме:

PS. так не в тему, но все же спрошу, на презентации ХЕ3 так рекламировали биндинг, но что-то ничего удобного я в нем не нашел, конвертеров не поддерживает, расширений тоже, в чем прикол? в том что мышкой драг дропать бинды можно?

0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
18.02.2013, 00:07 #4
Цитата Сообщение от Konctantin Посмотреть сообщение
не понимаю, что от меня хочет дельфи, и почему не отрабатывает аналогичный код
При импорте функции в Delphi надо указать соглашение по вызову - cdecl, в данном случае. Если соглашение не указать, то автоматически будет действовать соглашение register (оно же - fastcall с особенностями Delphi).
Т. е., в Delphi надо так объявить:
Delphi
1
2
function CLRCreateInstance(clsid, riid :TGUID; out mHost : PPointer) : integer; cdecl;
  external 'MSCorEE.dll' name 'CLRCreateInstance';
1
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
18.02.2013, 09:08  [ТС] #5
все равно вылетает
First chance exception at $74744B7C. Exception class $C0000005 with message 'access violation at 0x74744b7c: read of address 0x48670e8e'. Process Project1.exe (4212)
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
18.02.2013, 12:32 #6
Konctantin, пока не знаю, что здесь можно предпринять... Можно ещё попробовать для последнего параметра заменить спецификатор с out на var. И в коде DLL для функции в явном виде указать соглашение cdecl...
0
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
18.02.2013, 12:37  [ТС] #7
вот хочу уточнить:
C++
1
2
3
4
5
6
typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;
Delphi
1
2
3
4
5
6
7
8
9
  TGUID = packed record
    D1: LongWord;
    D2: Word;
    D3: Word;
    D4: array[0..7] of Byte;
    class operator Equal(const Left, Right: TGUID): Boolean;
    class operator NotEqual(const Left, Right: TGUID): Boolean;
    class function Empty: TGUID; static;
  end;
то есть long = 8 байт, LongWord - 4 байт - не совпадение размеров, попробовал создать свой гуид, и типом int64 - в итоге то же самое.

В общем подозреваю что я что-то где-то не дообъявил, но вот знать бы что.

Добавлено через 1 минуту
Я изгалялся с порядком вызова параметров, и модификаторами var, out и тп - результат такой же
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
18.02.2013, 13:07 #8
А long разве 8 байт? Должен быть 4 байта...
0
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
18.02.2013, 15:09  [ТС] #9
ах сори туплю, это в C# 8
0
18.02.2013, 15:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2013, 15:09

Ошибка failed linking file resources
Доброго времени суток. Создаю проект типа крестики-нолики. Вылезла ошибка...

obj file
ребят подскажите что это за obj файл и как он работает и связан с вижуал...

Не линкуется obj file
Программа тасмом компилируется, но не линкуется. Мне нужно ввести данные и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru