Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прилинковать .LIB к экзешнику через враппер Link.exe / 16 сообщений из 16, страница 1 из 1
26.05.2015, 11:19
    #38968445
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
По-моему это можно сделать. У меня сейчас линкер в VB подменен для добавления строчки /FIXED:NO, чтобы при билде в экзешник релоки добавлялись. Надо вот прилинковать сишную либу, что в готовом EXE была секция экспорта, откуда можно вызывать функции.
Как это сделать?
...
Рейтинг: 0 / 0
26.05.2015, 11:34
    #38968464
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
Посмотри это . Ты хочешь добавить секцию экспорта?
...
Рейтинг: 0 / 0
26.05.2015, 12:14
    #38968539
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
btw статическая линковка возможна (только что проверил), но нужно только уладить проблему декорирования имен. Я поработаю над этим, может сделаю Add-in для статической линковки.
...
Рейтинг: 0 / 0
26.05.2015, 12:14
    #38968540
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
ATM-TURBO 2Посмотри это . Ты хочешь добавить секцию экспорта?

Не только, я хочу прилинковать к VB-экзешнику сишный код, который скомпилирован в .lib файл.
В аттаче пример проекта на VB6 где это сделано, только мне непонятно как.
...
Рейтинг: 0 / 0
26.05.2015, 12:17
    #38968543
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
При этом секция экспорта в EXE выглядит как на скриншоте, а сишный код в .lib

Код: plaintext
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
#include <stdio.h>
#include <windows.h>

/*
	apparently all winapi has to go through dynamically loaded function pointers
	because I cant get the VB link to include any other lib files without it wacking
	the import table of the VB exe corrupting the executable..really though this technique
	is most useful for math like functions anyway which shouldnt need much if any api at all.
	i tried lib files from VC6 and VS2008. The Obj files from either work as long as they in
	debug mode.
*/

typedef FARPROC  (__stdcall *GetProc)(HMODULE a0,LPCSTR a1);
typedef HMODULE  (__stdcall *LoadLib)(LPCSTR a0);
typedef int (__stdcall *SysAllocSBL)(void* str, int sz);
typedef int (__cdecl *Sprnf)(char *, const char *, ...);
typedef int (__cdecl *Strlen)(char *);

GetProc getproc;
LoadLib loadlib;
Sprnf sprnf;
Strlen strln;
SysAllocSBL sysAlloc;

#define EXPORT comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__)

/*

 these will help you with strings..
	http://progtutorials.tripod.com/COM.htm
	http://forums.codeguru.com/showthread.php?257924-Access-the-BSTR-from-VB

 Compiler settings
	character set: multibyte
	runtime library: multithreaded (compiled in not dll)
	buffer security check = false
	disable randomization
	not compatiable with dep
	basic runt time checks = default
	/noentry  

*/ 

int __stdcall init(int lpfnGetProc, int lpfnLoadLib){
#pragma EXPORT 	 
	 int h = 0;
	 int failed = 0;

	 //_asm int 3
	 getproc = (GetProc)lpfnGetProc;
     loadlib = (LoadLib)lpfnLoadLib;

	 h = loadlib("msvcrt.dll");
	 sprnf = (Sprnf)getproc(h,"sprintf");
	 strln = (Strlen)getproc(h,"strlen");
	 
	 h = loadlib("oleaut32");
	 sysAlloc = (SysAllocSBL)getproc(h,"SysAllocStringByteLen");
	 
	 if( (int)sprnf == 0) failed++;
	 if( (int)strln == 0) failed++;
	 if( (int)sysAlloc == 0) failed++;

	 return failed;
}

unsigned __int64 __stdcall to64(unsigned int hi, unsigned int lo){
#pragma EXPORT
	unsigned __int64 ret=0;
	ret = hi;
	ret = ret << 32;
	ret += lo;  
	return ret;
}

unsigned __int64 __stdcall add64(unsigned __int64 base, unsigned __int64 val){
#pragma EXPORT
	return base + val;
}

unsigned __int64 __stdcall sub64(unsigned __int64 v0, unsigned __int64 v1){
#pragma EXPORT
	return v0 - v1;
}

BSTR __stdcall hex64(unsigned __int64 v0){
#pragma EXPORT
	char buf[100];
	sprnf(buf, "0x%016I64x", v0);
	return sysAlloc(buf, strln(buf));
}
...
Рейтинг: 0 / 0
26.05.2015, 14:26
    #38968730
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
Смотри. Как описано в твоем проекте сделать не проблема. Для примера вот функция которую будем прилинковывать:
Код: plaintext
1.
2.
3.
4.
5.
6.
extern "C" int __stdcall FuncAdd(int v1, int v2)
{

	return v1 + v2;

};


Теперь на нужно просто добавить дополнительные ключи линкеру of VB6:
Код: xml
1.
2.
[VBCompiler]
LinkSwitches= "D:\Program Files\Microsoft Visual Studio\VB98\BitPirit\VBForum\StaticLink\CppProject\Release\CppProject.lib" /EXPORT:_FuncAdd@8 


Как видишь тут путь до нужного lib файла. Я не использовал def-файл поэтому имеет место быть декорирование имен.
Теперь сам EXE:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Option Explicit

Private Declare Function FuncAdd Lib "StaticLinkTest.exe" Alias "_FuncAdd@8" (ByVal v1 As Long, ByVal v2 As Long) As Long

Private Sub Form_Load()
    MsgBox FuncAdd(100, 900)
End Sub


Компилируем и получаем результат.
Этот способ не очень хороший, поэтому я хочу сделать непосредственную линковку без экспорта. Я это сделал, но для этого пришлось вскрывать OBJ файл и править декорированные имена, т.к. VB6 декорирует не по общему правилу (возможно ошибаюсь).
...
Рейтинг: 0 / 0
26.05.2015, 15:29
    #38968850
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
ATM-TURBO 2,

Круто! Спасибо, это то что я искал!
...
Рейтинг: 0 / 0
26.05.2015, 15:48
    #38968876
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
ATM-TURBO 2,

а можно таким образом импортировать C++ классы в VB ?
Чтобы эта абракадабра обрабатывалась как обычные функции

Код: plaintext
1.
2.
3.
4.
5.
6.
??0?$CArray@PAVCXTPCommandBar@@PAV1@@@QAE@XZ
??0?$CArray@PAVCXTPDatePickerButton@@PAV1@@@QAE@XZ
??0?$CArray@PAVCXTPDockingPaneCaptionButton@@PAV1@@@QAE@XZ
??0?$CArray@PAVCXTPReportInplaceButton@@PAV1@@@QAE@XZ
??0?$CArray@PAVCXTPReportRow@@PAV1@@@QAE@XZ
??0?$CArray@PAVCXTPReportSection@@PAV1@@@QAE@XZ
...
Рейтинг: 0 / 0
26.05.2015, 16:13
    #38968928
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
Eolt,

Я думаю да, но не знаю как ты будешь делать соглашение вызова.
...
Рейтинг: 0 / 0
26.05.2015, 17:55
    #38969085
Прилинковать .LIB к экзешнику через враппер Link.exe
ATM-TURBO 2,

соглашения вызова можно объехать на кривой козе CreateDispTypeInfo+CreateStdDispatch. Но как будут создаваться/уничтожаться экземпляры классов?
...
Рейтинг: 0 / 0
28.05.2015, 08:18
    #38970323
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
автор поэтому я хочу сделать непосредственную линковку без экспорта.

А какие тут могут быть пути? Только правка ссылок в бинарном файле?
...
Рейтинг: 0 / 0
28.05.2015, 08:23
    #38970326
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
EoltА какие тут могут быть пути? Только правка ссылок в бинарном файле?
Я делаю сейчас Add-in. Дело в том что VB6 независимо от функции приравнивает ее к одному виду, поэтому нужно просто в каждом объектном файле поправить ссылки так чтобы они указывали на LIB.
...
Рейтинг: 0 / 0
28.05.2015, 10:12
    #38970407
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
ATM-TURBO 2Я делаю сейчас Add-in. Дело в том что VB6 независимо от функции приравнивает ее к одному виду, поэтому нужно просто в каждом объектном файле поправить ссылки так чтобы они указывали на LIB.

Ок, буду ждать твой аддин!
...
Рейтинг: 0 / 0
28.05.2015, 10:30
    #38970426
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
У меня еще идея появилась, весь есть же тулза Dll to Lib которая позволяет конвертировать Dll в .lib файлы
Можно делать портабельные программы из одного EXE, прилинковав используемые VB-программой Dll прямо в экзешник
...
Рейтинг: 0 / 0
13.07.2015, 20:31
    #39006327
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
Eolt, пока проект остановился, т.к. у меня полетел ЖД, где была вся информация и исходники.
...
Рейтинг: 0 / 0
13.07.2015, 20:36
    #39006329
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прилинковать .LIB к экзешнику через враппер Link.exe
ATM-TURBO 2Eolt, пока проект остановился, т.к. у меня полетел ЖД, где была вся информация и исходники.

Пичаль, я по этой причине храню все проекты в папке дропбокс, если умрет ssd диск исходники останутся целыми.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прилинковать .LIB к экзешнику через враппер Link.exe / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]