Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизОшибка при вызове функции из 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.049 c