Sector_Tula |
Отправлено: 18.04.2006, 14:13 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 1
|
Народ помогите я просто уже запарился.
Есть 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
И всет тут. Блин. Можт кто знает где собака зарыта???
Если надо, то могу прислать файлики. |
|
Grigoriy |
Отправлено: 18.04.2006, 15:24 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Есть ещё один способ использовать DLL.
С помощью функций
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
);
Тип 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
|
|
|