Вверх ↑
Этот топик читают: Гость
Ответов: 498
Рейтинг: 39
#1: 2013-11-28 19:03:18 ЛС | профиль | цитата
Задача: собрать схему в обход hiasm.
Вопросы:
1. Для сборки достаточно взывать buildPrepareProc() и потом buildProcessProc() ?

2. struct TCodeGenTools { ... int __stdcall(* sdkGetCount)(id_sdk SDK); .... - http://svn.hiasm.com/hiasm5/packs/RTCG/CGTShare.h
В этой строке происходит добавление в структуру TCodeGenTools функцию вызова sdkGetCount которая передаётся из hiasm при вызове функции?
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4476
Рейтинг: 716
#2: 2013-11-28 19:38:48 ЛС | профиль | цитата
1) Вероятно достаточно. Если заполнить TBuildProcessRec
2) TCodeGenTools содержит указатели на функции и их описание, которые заполняются средой. Кодогенератор вызывает эти функции в процессе сборки. Эти функции размещены в HiAsm и без их полной реализации ничего не получится.
Нужно распарсить схему, конфиги компонентов и предоставить все необходимые данные для своей реализации этих функций, которые затем и будет вызывать кодогенератор.
карма: 26

1
Голосовали:Muz-Tv
Ответов: 498
Рейтинг: 39
#3: 2013-11-28 19:41:59 ЛС | профиль | цитата
Netspirit, спасибо за подробный ответ, так и думал.
карма: 0

0
Ответов: 498
Рейтинг: 39
#4: 2013-12-13 20:19:06 ЛС | профиль | цитата
3) Хочу вызвать из C# функцию CheckVersionProc()
С++ кодогенратора структура выглядит так:
#cpp
typedef struct {
short int major;
short int minor;
short int build;
} THiAsmVersion;
//Функция так:
DLLIMPORT int CheckVersionProc(THiAsmVersion *params) {
CG_LOG_BEGIN
//if ((params->major >= 3) && (params->minor >= 63) && (params->build >= 162))
//return CG_SUCCESS;
CG_LOG_RETURN(CG_SUCCESS)
}
В Delphi так:
#pas
THiAsmVersion = record
major:word;
minor:word;
build:word;
end;

Вызываю из c# так:
public struct THiAsmVersion{
public ushort major;
public ushort minor;
public ushort build;
};
...
[DllImport(@"C:/Program Files (x86)/HiAsm_AltBuild/Elements/Android/CodeGen.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
private static extern int CheckVersionProc(THiAsmVersion Params);

...
THiAsmVersion t = new THiAsmVersion();
t.build = 4;
t.major = 4;
t.minor = 4;

CheckVersionProc(t);

Получаю ошибку о повреждение стека, наверняка ошибка в типах.
Подскажите где ошибка?
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#5: 2013-12-13 22:58:17 правка | ЛС | профиль | цитата


Редактировалось 6 раз(а), последний 2021-05-21 06:21:18
карма: 0

0
Главный модератор
Ответов: 2980
Рейтинг: 393
#6: 2013-12-14 00:57:09 ЛС | профиль | цитата
Platform target должен быть соответствующий. У меня работает для Platform target = x86.
карма: 7
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 498
Рейтинг: 39
#7: 2013-12-14 21:29:12 ЛС | профиль | цитата
Cdecl помогло, CheckVersionProc вызывается, но buildProcessProc нет. Проверил ещё раз типы функции, в CodeGenTool, там созданы пустые функции возвращающие данные нужного типа.
Выглядит так:
struct TBuildProcessRec
{
public TCodeGenTools cgt;
public object sdk;//id_sdk sdk;
public object result;
};
...
class TCodeGenTools {
//~~~~~~~~~~~~~~~~~~~~~~~~ SDK ~~~~~~~~~~~~~~~~~~~~~~~~~~
int sdkGetCount(object SDK)
{
return 0;
}
...
}
..

public class SDK
{
public string PackageName = "delphi";
public List<Element> Elements = new List<Element>();
};
..
public class Element
{
public string Name;
public int Id;
public int X;
public int Y;
public int Root;
public List<Property> Props = new List<Property>();
public List<Method> Methods = new List<Method>();

}
...
TBuildProcessRec Param = new TBuildProcessRec();
Param.sdk = sdk;
Param.cgt = new TCodeGenTools();

В С++ структура выглядит так:
#cpp
struct TCodeGenTools;
typedef TCodeGenTools *PCodeGenTools;

struct TCodeGenTools { ... }
Показывает ту же ошибку.
------------ Дoбавленo в 21.29:
Nic писал(а):
Platform target должен быть соответствующий. У меня работает для Platform target = x86.

это который в свойствах проекта?
карма: 0

0
файлы: 1code_32608.txt [823B] [342]
Главный модератор
Ответов: 2980
Рейтинг: 393
#8: 2013-12-14 22:04:56 ЛС | профиль | цитата
Надо внимательно изучить в интернете тему передачи параметров или, если для Вас это неприемлемо, "методом тыка" подбирать параметры маршалинга. Изучение вопроса можно, например, начать с этого ресурса: http://www.pinvoke.net
карма: 7
Дорогу осилит идущий. Install/Update HiAsm.NET
2
Голосовали:Muz-Tv, LastLeader
Ответов: 498
Рейтинг: 39
#9: 2013-12-15 14:44:52 ЛС | профиль | цитата
Зачем в кодогенераторе делается ссылка на структуру? вот тут:
#cpp
struct TCodeGenTools;
typedef TCodeGenTools *PCodeGenTools;
Нужно ли прописывать Params как ссылку? т.е. ref TBuildProcessRec Params
private static extern int buildProcessProc(TBuildProcessRec Params);
карма: 0

0
Главный модератор
Ответов: 2980
Рейтинг: 393
#10: 2013-12-15 17:21:57 ЛС | профиль | цитата
Изучите передачу простых параметров на примере компонента i1 пакета cnet. Затем прочитайте в интернете передачу структуры. Наконец, можно будет пробовать с кодогенератором.
карма: 7
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 314
Рейтинг: 21
#11: 2013-12-15 18:49:42 ЛС | профиль | цитата
Nic, а можешь просто ответить на прошлый "глупый" вопрос нам не опытным?
карма: 0

0
Главный модератор
Ответов: 2980
Рейтинг: 393
#12: 2013-12-15 20:11:05 ЛС | профиль | цитата
LastLeader, с чего вы взяли что мне известен ответ на "глупый" вопрос? Чтобы на него ответить мне необходимо пройти все те же шаги. Вы думаете мне настолько скучно?
карма: 7
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 314
Рейтинг: 21
#13: 2013-12-15 22:09:41 ЛС | профиль | цитата
Спасибо за вразумительный ответ.
карма: 0

0
Главный модератор
Ответов: 2980
Рейтинг: 393
#14: 2014-11-22 18:37:05 ЛС | профиль | цитата
Эксперименты с SDK
карма: 7
Дорогу осилит идущий. Install/Update HiAsm.NET
1
Голосовали:CriDos
Ответов: 1841
Рейтинг: 366
#15: 2014-11-22 18:58:40 ЛС | профиль | цитата
Nic, я как раз изучаю Ваш форк RTCG
карма: 1
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)