Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Ошибка при вызове функции из DLL.   Найти похожие ветки 

 
X9   (2004-03-25 09:42) [0]

Уважаемые Мастера!
Создаю DLL:
-------------mydll.dpr----------------
library mydll;

uses Windows;

function RegGetValue(RootKey: HKEY; Name: String; ValType: Cardinal; var PVal: Pointer; var ValSize: Cardinal): boolean;
var SubKey: String;
   n: integer;
   MyValType: DWORD;
   hTemp: HKEY;
   Buf: Pointer;
   BufSize: Cardinal;
   PKey: PChar;
begin
Result := False;
n := LastPos("\", Name);
if n > 0 then
begin
SubKey := Copy(Name, 1, n - 1);
if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then
begin
SubKey := Copy(Name, n + 1, Length(Name) - n);
if SubKey = "" then
PKey := nil
else PKey := PChar(SubKey);
if RegQueryValueEx(hTemp, PKey, nil, @MyValType, nil, @BufSize) = ERROR_SUCCESS then
begin
GetMem(Buf, BufSize);
if RegQueryValueEx(hTemp, PKey, nil, @MyValType, Buf, @BufSize) = ERROR_SUCCESS then
begin
if ValType = MyValType then begin
PVal := Buf;
ValSize := BufSize;
Result := True;
end else begin
FreeMem(Buf);
end;
end else begin
FreeMem(Buf);
end;
end;
RegCloseKey(hTemp);
end;
end;
end;

function RegGetString(RootKey: HKEY; KeyName: string;
var S: string): boolean;
var Buf: Pointer;
   BufSize: Cardinal;
begin
Result := False;
S := "";
if RegGetValue(RootKey, KeyName, REG_SZ, Buf, BufSize) then
begin
Dec(BufSize);
SetLength(S, BufSize);
if BufSize > 0 then
Move(Buf^, S[1], BufSize);
FreeMem(Buf);
Result := True;
end;
end;

exports RegGetString;

begin
end.
-----------------------------------------

Затем в программе импортирую эту функцию, получаю значение, но сразу после этого появляется ошибка EInvalidPointerOperation. Если эту же функцию поместить в модуль самой программы, то никаких ошибок не возникает. Может быть это из-за использования типа string при импортировании функции из DLL? Опубликуйте, пожалуйста, кусок кода, а то сроки уже совсем поджимают! Заранее большое всем спасибо!


 
stone ©   (2004-03-25 10:01) [1]

function RegGetString(RootKey: HKEY; KeyName: string;
var S: string): boolean; stdcall;


 
MBo ©   (2004-03-25 10:02) [2]

Прочитай то, что пишется в свежесозданном проекте DLL.


 
Digitman ©   (2004-03-25 10:06) [3]

вот только что дискуссия кипела примерно на ту же тему
http://delphimaster.net/view/1-1080138951/

вчитайся ..

у тебя РАЗНЫЕ менеджеры памяти в хост-приложении и в библ-ке, оттого и проблемы

в принципе, если ты соберешь оба проекта с оцией Build With Run-Time packages, можно и не париться с поиском своих ошибок (раз уж сроки поджимают) - менеджер памяти будет единый и проблема рассосется сама собой


 
Digitman ©   (2004-03-25 10:09) [4]


> stone ©   (25.03.04 10:01) [1]


зачем stdcall ? автор явно не упомянул об использовании  BCB для построения хост-приложения


 
Ega23 ©   (2004-03-25 10:14) [5]

Может PChar вместо String?


 
X9   (2004-03-25 10:49) [6]

Всем большое спасибо! Вопрос исчерпан.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
3-1079511944
Voyage
2004-03-17 11:25
2004.04.11
BLOB has been modified


1-1080146765
В л а д и м и р
2004-03-24 19:46
2004.04.11
MessageDlg: перенос строк сообщения


4-1075748523
DelphiN!
2004-02-02 22:02
2004.04.11
Как достать файл из ресурса и сохранить на диск


1-1082456952
Ruslan
2004-04-20 14:29
2004.04.11
Как узнать по какой строке щелкнул пользователь в ListView?


8-1071861824
mmmaloy
2003-12-19 22:23
2004.04.11
mp3: ID3v1, ID3v2