VBStreets Conference - Преглед на темата - #import TLB
Целият вкус на програмирането!
- Списък на форумите‹Други езици за програмиране‹Други езици‹C/C++
- Променете размера на шрифта
- ЧЗВ
- вход
#import TLB
#import TLB
добър ден.
Имаше въпрос относно директивата #import
Има някои dll без източници и има tlb, генериран с помощта на MIDL от
idl файлът има нещо подобно:
Код: Изберете всички
[uuid (90000000-4000-4000-8000-0c0000000000)]
библиотека twix
[dllname ("twix.dll")]
модул двадесет
[запис („TWInit“)]
дълъг __stdcall TWInit ();
//.
>;
>;
Използвах това в BASIC, свързвайки tlb референцията в препратките и извиквайки функцията TWInit без колебание.
И сега исках да създам същата връзка с dll в проекта c++.
Код: Изберете всички #import "twix.tlb"
int main (int argc, _TCHAR * argv [])
дълъг b = twix: TWInit ();
връщане 0;
>
Като резултат:
грешка LNK2019: неразрешен външен символ "дълъг __stdcall twix: TWInit (. посочен във функция _DllMain
Е, разбира се, има прототип на функцията, няма изпълнение.
Всъщност въпросът е, защо тогава се нуждаете от директивата #import TLB, ако все пак трябва да се свързвате динамично:
Код: Изберете всички typedef long (__ stdcall * PTR) ();
PTR pFnc = (PTR) GetProcAddress (GetModuleHandleA ("twix"), "TWInit"));
(pFnc) ();
Или не взех предвид нещо и всичко е по-просто?
Re: #import TLB
Директивата е необходима за импортиране на прототипи на функции от TLB.
Функционалните прототипи са необходими на компилатора - използвайки прототипи, компилаторът проверява коректността на повикването (съвпадение на броя и типовете предадени параметри, съвпадение на типа на връщане), а също така използва информация за конвенцията (stdcall/cdecl// fastcall/thiscall), за да генерира правилния машинен код за разговора.
Но компилаторът няма внедряване на функция под ръка, така че генерира призив към външен обект. Файлът obj, създаден от компилатора, просто съхранява информация за всички повиквания към външни обекти. Дори тези външни същества да не съществуват изобщо в природата.