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

Не только, я хочу прилинковать к VB-экзешнику сишный код, который скомпилирован в .lib файл.
В аттаче пример проекта на VB6 где это сделано, только мне непонятно как.
...
Рейтинг: 0 / 0
Прилинковать .LIB к экзешнику через враппер Link.exe
    #38968543
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом секция экспорта в 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
Прилинковать .LIB к экзешнику через враппер Link.exe
    #38968730
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотри. Как описано в твоем проекте сделать не проблема. Для примера вот функция которую будем прилинковывать:
Код: 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
Прилинковать .LIB к экзешнику через враппер Link.exe
    #38968850
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2,

Круто! Спасибо, это то что я искал!
...
Рейтинг: 0 / 0
Прилинковать .LIB к экзешнику через враппер Link.exe
    #38968876
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Прилинковать .LIB к экзешнику через враппер Link.exe
    #38968928
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eolt,

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

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

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

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

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


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