· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.DIRECTX.OPENGL —› DirectShow (VC++) + asm

Посл.отвђт Сообщенiе


Дата: Июл 7, 2003 22:54:22

есть относительно большая библиотека, сооруженная из кусков DX SDK, соотв на VC++ 6.0 все работает, переписать ее на асм пока что не смогу и есть идея прилинковать ее к асмовскому проекту .dll (которая работает с нужной программой гораздо лучше)... но допустим из всей этой библиотеки, которая занимается инитом COM, устройства видимозахвата и т.д. нужно вызвать одну функцию например HRESULT Init(void), то как ее надо описать в VC++ и затем в .asm (из которой собирается .dll) чтобы и асм и линкер поняли что надо собрать...

пока что пытался засунуть эту функцию в PUBLIC класса, но линкер всеравно ее не видит :/ ... в .asm делаю

EXTERNDEF Init:

и асемблит нормально без ошибок, а линкер выдает "символ _Init" не найден... includelib вставил, но толку нету :/ ...


Дата: Июл 7, 2003 23:06:18

Загляните вовнутрь LIB (хексредактором, например) и узнайте точное имя вашей ф-ции: _Init или __imp__Init@XX или или _imp__Init@XX или ... Далее фиксите это имя в сорсах MASM и всё :-)


Дата: Июл 13, 2003 10:24:06

обратный вопрос - вот к .dll собранной в VC++ прикручена .lib, собранная в масме... как объяснить линкеру в VC++, что одна из функций из .lib должна быть доступна для вызова из .dll ?

пока что пришлось сделать так:
MMPlyFS proc
...
MMPlyFS endp

в масме, затем в VC++ :

#ifdef FS_DLL_EXPORTS
#define FS_DLL_API __declspec(dllexport)
#else
#define FS_DLL_API __declspec(dllimport)
#endif

extern FS_DLL_API void MMPlyFSC();

void MMPlyFSC();

extern "C"
{
	extern void __cdecl MMPlyFS();
}

void MMPlyFSC()
{
MMplyFS()
};


и только после этого до функции MMPlyFS можно добраться через вызов MMPlyFSC, да и то VC++ зачем-то прикручивает проверку ESP после возврата из MMPlyFS, а в .dll имя функции выглядит как ?MMPlyFSC@@YAXXZ :/ ...

можно как-нить покороче добираться до функции из асмовой .lib ? т.е. вариант сразу
extern FS_DLL_API void MMPlyFS();

не работает :/ :
: error C2732: linkage specification contradicts earlier specification for 'MMPlyFS'
: see declaration of 'MMPlyFS'

загружать две .dll как-то неудобно т.к. загрузку LoadLibrary и вызов GetProcAddress приходится вносить побайтно в исправляемый .exe, и места там немного...


Дата: Июл 13, 2003 20:00:42

т.е. вариант сразу
Можно, конечно:

1. Создаём функцию в MASM32:
testF proc param1:DWORD
ret
testF endp

2. Компилим и делаем testF.lib (можно оставить testF.obj)
3. Создаём простой проект DLL в VC:
test.cpp
--------
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved){
  return TRUE;
}

test.def
--------
LIBRARY test
EXPORTS testF

4. Добавляем testF.lib (или testF.obj) и test.def в дерево файлов.
5. Идём в Project Settings > Link и убираем "Generate debug info"
6. Build и готово!


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.034