Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.03 c
14-1079814765
GebbelZ
2004-03-20 23:32
2004.04.11
Помогите доказать!


1-1082927765
Wi_Julia
2004-04-26 01:16
2004.04.11
StrToInt


14-1082542987
begAdm
2004-04-21 14:23
2004.04.11
Здесь много людей знающих компьютерную литературу


14-1082202368
garry79
2004-04-17 15:46
2004.04.11
Народ, где можно поискать avi шки или gif ы для заставок


3-1079533564
Kein
2004-03-17 17:26
2004.04.11
какая база данных побыстрей




   Наверх