C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DLL, Использование чужой DLL в своей программ
Sector_Tula
  Отправлено: 18.04.2006, 14:13


Ученик-кочегар

Группа: Участник
Сообщений: 1



Народ помогите я просто уже запарился. ohmy.gif

Есть DLL — DHSOUND_LIB.DLL + DHSOUND_LIB.PAS.
C++ Builder 6.0 сделал из *.PAS — *.HPP.
Сколько всего не читал, ничего не помогает.
Как мне использовать этот DLL в своей программе???

<строка> extern "C" void __fastcall SetFileName(AnsiString fn);
При компиляции пишет
[Linker Error] Unresolved external 'SetFileName' referenced from "C:\*.OBJ"

А если написать
<строка> extern "C" void __stdcall SetFileName(AnsiString fn);
При компиляции ничего не пишет
А после вызова SetFileName — EAccessViolation sad.gif

И всет тут. Блин. Можт кто знает где собака зарыта???
Если надо, то могу прислать файлики.
Grigoriy
Отправлено: 18.04.2006, 15:24


Мастер участка

Группа: Участник
Сообщений: 381



Есть ещё один способ использовать DLL.
biggrin.gif biggrin.gif
С помощью функций
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module
);
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);
BOOL FreeLibrary(
HMODULE hLibModule // handle to loaded library module
);
wink.gif wink.gif

Тип HINSTANCE
совместим с
*void
FARPROC
тоже совместим с
*void

LPCTSTR lpLibFileName
можно писать строкой в кавычках, например
"kernel32.dll"
те библиотеки, которые есть в том же каталоге, где программа или принадлежат собственно WINDOWS, можно указывать без полного пути к файлу DLL.
LPCSTR lpProcName
можно указать аналогично lpLibFileName — строчкой — это имя функции в библиотеке, которую (функцию) нужно использовать.
В результате последовательного вызова двух функций
LoadLibrary
GetProcAddress
получаем указатель на функцию в памяти.
А затем этот указатель на функцию присваиваем
указателю на функцию, описанному в программе.
Пример

CODE

TForm1 *Form1;
POINT p1;
BOOL (__stdcall *Line_To)(HDC,int,int);
BOOL (__stdcall *Move_ToEx)(HDC,int,int,POINT*);
HDC DC1;
void* m1;
//**********--------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DC1=GetDC(Form1->Handle);
m1=LoadLibrary("gdi32.dll");
(void*)Line_To=GetProcAddress(m1,"LineTo");
(void*)Move_ToEx=GetProcAddress(m1,"MoveToEx");
Move_ToEx(DC1,56,45,&p1);
Line_To(DC1,202,303);
Move_ToEx(DC1,500,90,&p1);
Line_To(DC1,202,303);
FreeLibrary(m1);
}


Отредактировано Grigoriy — 18/04/2006, 15:24

Вернуться в Вопросы программирования в C++Builder