В Delphi XE2 Компилятор ругается на функции WriteProcessMemory
и ReadProcessMemory
, выдавая ошибку
error E2033: E2033 Types of actual and formal var parameters must be identical
В Delphi7 всё работает замечательно.
Кто-нибудь сталкивался?
angry
8,64717 золотых знаков73 серебряных знака180 бронзовых знаков
задан 31 янв 2012 в 11:26
Григорий ПономарёвГригорий Пономарёв
8151 золотой знак10 серебряных знаков25 бронзовых знаков
2
Сравним определение методов в 2010 (7ки под рукой нет) и XE2:
//Delphi 2010
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: DWORD; var lpNumberOfBytesRead: DWORD): BOOL; stdcall;
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;
//Delphi XE2
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesRead: SIZE_T): BOOL; stdcall;
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesWritten: SIZE_T): BOOL; stdcall;
Т.е. все что нужно — это явно указать тип данных для переменной, передаваемой в качестве lpNumberOfBytesWritten
, как SIZE_T
.
SIZE_T
, очевидно, появился с поддержкой 64-битных систем.
ответ дан 31 янв 2012 в 18:15
Nofate♦Nofate
34.3k15 золотых знаков65 серебряных знаков93 бронзовых знака
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
TYPE MASSIV = ARRAY[1..52] OF REAL; MASSIV2 = ARRAY[1..52] OF integer; MASSIV1 = ARRAY[1..53] OF REAL; var k,P,H,N,i,j:integer; x,WSPOM,Y:MASSIV; m:MASSIV2; a:MASSIV1; Y1,Ynom,U,C,C1:real; begin {1. Vvod ishod dannih} writeln('Vvedite chislo datch - k'); readln(k); writeln('Vvedite nomera datchikov (kanalov oprosa) - M'); for i:=1 to k do begin write('nomer ',i,'-'); readln(m[i]); end; writeln('Vvedite nomer kanala s upravl vozd - P'); readln(p); writeln('Vvedite nomer chislo datch otklika obekta na uprav - H'); readln(h); writeln('Vvedite nomin jelaem znach otklnomer - Ynom'); readln(Ynom); writeln('Vvedite chislo taktov virabotki upravl vosdeyst - N'); readln(N); writeln('Vvedite koeff zakona uprav - A'); for i:=1 to k+1 do begin write('koef ',i-1,'-'); readln(a[i-1]); end; {Vivod Ishod dannih} writeln('Ishodnie dannie:'); writeln('Vvedite nomer kanala s upravl vozd - P=',p); writeln('Vvedite nomer chislo datch otklika obekta na uprav - H=',H); writeln('Vvedite nomin jelaem znach otklnomer - Ynom=',Ynom); writeln('Vvedite chislo taktov virabotki upravl vosdeyst - N=',N); writeln('koeff zakona uprav - A'); for i:=1 to k+1 do writeln('koef ',i-1,'=',a[i-1]:6:2); C:=0; for j:=2 to N do begin {2. Opros kanalov i vivod izmer X} for i:=1 to k do OPROS(M[i],x[i],WSPOM); writeln('Izmeren znachen X'); for i:=1 to k do write('x[ ',i,']=',x[i]:6:2); writeln; {3. Rassch velichini upravliauchego znachen U po formule upravl} i:=1; U:=A[i-1]; for i:=1 to k do U:=U+A[i]*x[i]; writeln('Rassch velichini upravliauchego znachen U po formule upravl=',U:6:2); {4. Ustanov v kanale P rasschitan znachenie upravl vozdey U} UPRAV(P,U,WSPOM); {5-6. Opros kanala H i zapomn izmeren znachen otklika Y1} OPROS(H,Y[H],WSPOM[H]); writeln('Opros kanala H i zapomn izmeren znachen otklika Y1=',Y1:6:2); OPROS(H,Y[j],WSPOM[j]); } writeln('Opros kanala i zapomn izmeren znachen otklika Y[',j,']=',Y[j]:6:2); {7. Raschet suumi C} C:=C+sqr(Y[j]-Ynom); end; C:=C+sqr(Y1-Ynom); {8. Vichis C1} C1:=C/N; writeln('C1=',C1:6:2); readln; end. Модуль: TYPE MASSIV = ARRAY[1..52] OF REAL; PROCEDURE OPROS(KANAL:INTEGER; VAR XIZM:REAL; VAR WSPOM : MASSIV); PROCEDURE UPRAV(KANAL:INTEGER; UPR :REAL; VAR WSPOM : MASSIV); IMPLEMENTATION PROCEDURE OPROS; (* Имитатор об"екта исследования : KANAL - номер канала опроса; *) (* XIZM - результат измерения по каналу; WSPOM - вспомогательный *) (* массив типа REAL с 52 элементами. *) var i,j,j1,j2 : integer ; t,jtim,r,r1,r2,r3,r4,delt,tau,dx : real; h,m,s,s100 : word; PROCEDURE GAUSS ( R,S : REAL; VAR R1:REAL); (* Генерация псевдослучайных нормальных чисел *) var i:integer; r2:real; begin r1:=0; for i:=1 to 12 do begin r2:=0.001*random(1000); r1:=r1+r2 end; r1:=(r1-6)*s+r end; (* GAUSS *) PROCEDURE IZMER7( J : INTEGER); (* Генерация независимых переменных *) var r,rr : real; begin GetTime:=formatdatetime('tt',time); {DecodeTime(GetTime,h,m,s,s100); rr:=s; r:=m;} rr:=+60*r; r:=h; rr:=strtofloat(copy(GetTime,7,2))+strtofloat(copy(GetTime,4,2))*60+3600*strtofloat(copy(GetTime,1,2)); wspom[11]:=rr; r:=0.001*random(1000); if j=1 then wspom[1]:=-20+50*r else if j=2 then wspom[2]:=740+30*r else if j=3 then wspom[3]:=50+50*r else if j=4 then begin wspom[4]:=0; if r>0.5 then wspom[4]:=1 end else if j=5 then begin wspom[5]:=2; if r<=0.33333 then wspom[5]:=1 else if r>=0.666667 then wspom[5]:=3 end else if j=6 then begin wspom[6]:=0; if r>0.5 then wspom[6]:=1 end end; (* IZMER7 *) begin (* Начало основной части процедуры OPROS *) randomize; if kanal>=1 then begin if kanal <=10 then begin (* Независимые переменные *) wspom[11]:=0; if kanal <= 6 then IZMER7(kanal); r:=wspom[kanal] end else if kanal <= 70 then begin r4:=0; r:=1; GAUSS(r4,r,r1); ShowMessage('gauss='+floattostr(r1)); if kanal <= 25 then begin (* Лин. регресс. модель - пассивный эксперимент *) j1:=kanal-11; j2:=kanal-18; r:=30+j1*5-(5-j2*0.14)*wspom[1]+(0.6-j1*0.014)*wspom[2]+ (350-j1*10)*wspom[4]-(3-j2*0.07)*wspom[1]*wspom[4]+ (0.05+j1*0.001)*wspom[1]*wspom[3]+0.01*wspom[3]*wspom[3]; r1:=5*r1 end else if kanal <= 40 then begin (* Лин. регресс. модель - активно-пассивный эксперимент *) j1:=kanal-26; j2:=kanal-33; r:=100+j1*20+(7+j1*0.5)*wspom[1]+(0.6+j2*0.01)*wspom[2]- (15+j1*2)*wspom[5]+(4+j2*0.1)*wspom[7]+ (40+j1*2)*wspom[8]+(0.01+j2*0.0005)*wspom[1]*wspom[2]- (0.5+j2*0.01)*wspom[7]*wspom[8]+(0.7-j1*0.02)*wspom[5]* wspom[7]-(0.15-j1*0.01)*wspom[1]*wspom[1]+(30-j1*1.4)* wspom[8]*wspom[8] ; r1:=5*r1 end else if kanal <= 55 then begin (* Нелин. модель - пассивный эксперимент *) r:=30+(kanal-41)*3+(10+(kanal-48)*0.5)*exp((0.055- (kanal-41)*0.001)*wspom[1])-(2+(kanal-50)*0.1)* exp(0.07*wspom[1]-(0.0001+(kanal-46)*0.00002)*wspom[2]+ (1+(kanal-48)*0.06)*wspom[4]); r1:=1.5*r1 end else if kanal <= 70 then begin (* Нелинейная модель - активно-пассивный эксперимент *) j1:=kanal-56; j2:=kanal-63; r:=60+(kanal-65)*3+(-5.5+j1*0.1)*exp((0.05+j1*0.001)* wspom[1]+(-0.1+j2*0.006)*wspom[9])+(9-j1*0.2)* exp((-0.55+j1*0.01)*wspom[10]+(0.7+j2*0.03)*wspom[5]); r1:=1.5*r1 end; r:=r+r1 end else if kanal <= 85 then begin (* Динамическая модель - инерционное звено *) GetTime:=formatdatetime('tt',time); jtim:=strtofloat(copy(GetTime,7,2))+strtofloat(copy(GetTime,4,2))*60+3600*strtofloat(copy(GetTime,1,2)); {decodetime(GetTime,h,m,s,s100); jtim:=s; r4:=m; jtim:=jtim+60*r4; r4:=h; jtim:=jtim+3600*r4;} tau:=15-(kanal-71)*0.4; r:=0; r3:=0; for i:=20 downto 1 do begin r2:=jtim-wspom[i+12]; r2:=r2/tau; if r2<=50 then r:=r+(wspom[i+32]-r3)*(1-exp(-r2)); r3:=wspom[i+32] end; r:=(20+(kanal-78)*2)*r; end else begin j1:=kanal-100; r1:=j1*0.1; r4:=1; GAUSS(r1,r4,r) end end ; xizm:=r; wspom[12]:=dx end; PROCEDURE UPRAV; (* Имитация подачи управл. воздействия на об'ект *) type mm = array[1..4] of real; var i,i1,j1 : integer; t,jtim,r: real; umin,umax : mm; h,m,s,s100 : word; begin umin[1]:=-70; umax[1]:=-umin[1]; umin[2]:=-3; umax[2]:=-umin[2]; umin[3]:=-5; umax[3]:=-umin[3]; umin[4]:=-2.5;umax[4]:=-umin[4]; if ((kanal < 7) or (kanal > 10)) then writeln(' ОШИБКА UPRAV : канал N',kanal:7,' упр.возд.=',upr:10:3) else begin j1:=kanal-6; if upr>umax[j1] then upr:=umax[j1] else if upr<umin[j1] then upr:=umin[j1]; wspom[kanal]:=upr; if kanal=10 then if abs(wspom[33]-upr)>=0.01 then begin GetTime:=formatdatetime('tt',time); jtim:=strtofloat(copy(GetTime,7,2))+strtofloat(copy(GetTime,4,2))*60+3600*strtofloat(copy(GetTime,1,2)); {Decodetime(GetTime,h,m,s,s100); jtim:=s; r:=m; jtim:=jtim+60*r; r:=h; jtim:=jtim+3600*r;} for i:=2 to 20 do begin i1:=22-i; wspom[i1+32]:=wspom[i1+31]; wspom[i1+12]:=wspom[i1+11] end; wspom[33]:=upr; wspom[13]:=jtim; end end end; END. |
Помогите исправить ошибку при компиляции в Delphi.
От: | Аноним | ||
Дата: | 20.01.11 01:39 | ||
Оценка: |
При компиляции выдает несколько сотен ошибок такого рода:
1. Types of actual and formal var parameters must be identical
2. Record, object or class type required
тоесть есть некоторые процедуры где в каком либо параметре тип указан как переменная
procedure SomeProc(var Value: Cardinal);
То при таком раскладе:
var
i: Integer
begin
SomeProc(i) — будет орать: Types of actual and formal var parameters must be identical
end;
Есть ли какие то директивы компилятор, что бы исправить эту проблему??
На счет второй ошибки такая же фигня..
Заранее благодарю!
Re: Помогите исправить ошибку при компиляции в Delphi.
От: |
LGB
|
||
Дата: | 20.01.11 02:56 | ||
Оценка: |
1 (1) |
Здравствуйте, Аноним, Вы писали:
А>При компиляции выдает несколько сотен ошибок такого рода:
А>1. Types of actual and formal var parameters must be identical
А>procedure SomeProc(var Value: Cardinal);
А>То при таком раскладе:
А>var
А> i: Integer
А>begin
А> SomeProc(i) — будет орать: Types of actual and formal var parameters must be identical
А>end;
А>Есть ли какие то директивы компилятор, что бы исправить эту проблему??
Нужно объявить i: Cardinal, a не Integer.
Или наоборот: SomeProc(var Value: Integer);
Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!
Re[2]: Помогите исправить ошибку при компиляции в Delphi.
От: |
irbis3003 |
||
Дата: | 20.01.11 03:02 | ||
Оценка: |
-1 |
Здравствуйте, LGB, Вы писали:
LGB>Нужно объявить i: Cardinal, a не Integer.
LGB>Или наоборот: SomeProc(var Value: Integer);
LGB>Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!
Да уж, дэлфи как женщина — не всегда очевидно то, что она хочет, часто капризничает, но если просит — лучше дать..)
Re[3]: Помогите исправить ошибку при компиляции в Delphi.
От: | Аноним | ||
Дата: | 20.01.11 03:09 | ||
Оценка: |
Здравствуйте, irbis3003, Вы писали:
I>Здравствуйте, LGB, Вы писали:
LGB>>Нужно объявить i: Cardinal, a не Integer.
LGB>>Или наоборот: SomeProc(var Value: Integer);
LGB>>Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!
I>Да уж, дэлфи как женщина — не всегда очевидно то, что она хочет, часто капризничает, но если просит — лучше дать..)
Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..
Re[4]: Помогите исправить ошибку при компиляции в Delphi.
От: |
wellwell
|
https://www.softperfect.com | |
Дата: | 20.01.11 03:19 | ||
Оценка: |
» Аноним 943 » <0@users.rsdn.ru> wrote in message news:4123492@news.rsdn.ru…
> Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..
Ручками. Видимо там текст на FreePascal или еще каком-то диалекте, где так было делать можно.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Помогите исправить ошибку при компиляции в Delphi.
От: |
irbis3003 |
||
Дата: | 20.01.11 03:29 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..
Код чужой чтоли под себя перебираешь?
Или компилишь по завершению набора текста в тысячу строк — откуда столько ошибок?))
Re[4]: Помогите исправить ошибку при компиляции в Delphi.
От: |
A.V |
||
Дата: | 20.01.11 19:18 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, irbis3003, Вы писали:
I>>Здравствуйте, LGB, Вы писали:
LGB>>>Нужно объявить i: Cardinal, a не Integer.
LGB>>>Или наоборот: SomeProc(var Value: Integer);
LGB>>>Delphi же говорит вам открытым текстом: типы должны быть одинаковыми, насяльника (must be identical). Так дайте ей, что она хочет!
А>Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..
Ну можно еще объявить в этом модуле type Сardinal = Integer, но это правда уже из серии ‘#define true (random()>0.5)’
Re[5]: Помогите исправить ошибку при компиляции в Delphi.
От: |
LGB
|
||
Дата: | 20.01.11 21:59 | ||
Оценка: |
Здравствуйте, A.V, Вы писали:
A.V>Ну можно еще объявить в этом модуле type Сardinal = Integer, но это правда уже из серии ‘#define true (random()>0.5)’
Месье знает толк в извращениях!
Re[4]: Помогите исправить ошибку при компиляции в Delphi.
От: |
Mr.Delphist |
||
Дата: | 21.01.11 17:36 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, irbis3003, Вы писали:
А>Хеххх.. Это я на примере привел одну функцию…))) А в реале компилятор выдает несколько сотен таких ошибок.. И как и все исправлять..
Именно что указывать правильные типы — так и исправлять. Потому как Cardinal — это беззнаковый тип, Integer — знаковый. И хотя разрядность по расходу памяти у них одинакова (по 4 байта на брата), взаимозаменяемыми эти типы НЕ являются.
Вообще, смешение знаковой и беззнаковой арифметики — серьезная бомба, отлаживать наплачетесь. Например, тривиальные циклы вида «while (i >= 0)» начинают вести себя причудливым образом
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
Delphi Compiler Error
E2033 Types of actual and formal var parameters must be identical
Reason for the Error & Solution
For a variable parameter, the actual argument must be of the exact type of the formal parameter.
program Produce; procedure SwapBytes(var B1, B2 Byte); var Temp: Byte; begin Temp := B1; B1 := B2; B2 := Temp; end; var C1, C2 0..255; (*Similar to a byte, but NOT identical*) begin SwapBytes(C1,C2); (*<-- Error message here*) end.
Arguments C1 and C2 are not acceptable to SwapBytes, although they have the exact memory representation and range that a Byte has.
program Solve; procedure SwapBytes(var B1, B2 Byte); var Temp: Byte; begin Temp := B1; B1 := B2; B2 := Temp; end; var C1, C2 Byte; begin SwapBytes(C1,C2); (*<-- No error message here*) end.
So you actually have to declare C1 and C2 as Bytes to make this example compile.
Solution 1
You just need to remove the var in the Control parameter and make it a value parameter. Because Delphi objects are actually implemented as reference types, you can call methods on them, change member fields etc. even if you pass them to a procedure as a value or const parameter.
Solution 2
Just remove var — you don’t need it to change Control’s properties:
procedure Change_prop(Control: TControl;height:integer;width:integer);
begin
......
end;
Solution 3
As David said, the problem’s in the var. That doesn’t mean that you can modify the members of the TControl, it means you can replace the TControl with another, completely different TControl, because objects are reference types.
If you’re passing an object to a var parameter, the variable you pass has to be declared as exactly the same type as the parameter in order to preserve type safety. Otherwise, you could do this:
procedure TForm1.VarControl(var control: TControl);
begin
control := TButton.Create;
end;
procedure TForm1.Mistake;
begin
VarControl(self.Memo1); //defined as TMemo
Memo1.Lines.Text := 'Undefined behavior here...';
end;
Comments
-
I am trying to write a procedure in delphi.
This procedure gets the name ofTControl
descendent element and then try to change some properties.
But when i try to do it, Delphi gives an error like:E2033 Types of actual and formal var
parameters must be identicalProcedure:
procedure Change_prop(var Control: TControl;height:integer;width:integer); begin //...... end;
Usage Example :
Change_prop(Label1, 50,200);
What can be the solution of that error..Thanks. -
There is no such thing as undefined behaviour in Object Pascal, it is only available to C users.
TTrouble(Pointer(Random(MaxInt))).AskFor(EXPLICIT)
-
@user205376 what are you going on about?!!
-
@David: I think it was a joke.
-
Clearly I need to get out more and stop SO rep-hunting!!
-
@User, although Delphi has no formal concept of undefined behavior the way C and C++ do, it’s still a useful term. The Delphi language doesn’t say what will happen in the situation Mason demonstrated. If you’re lucky, your program will crash immediately, but you might have data corruption, stack corruption, or even no errors at all. It’s futile to attempt to reason any further about the expected behavior of the program; all sorts of things could happen, and they may depend on outside factors, including the OS, compiler, and library versions.
-
What about when for example I want to call OnKeyDown event, where the «Key» parameter has «var» written…? Is there any way to call it directly like OnKeyDown(Self, VK_RETURN, ssNone) (which throws the error in the title), or do we need to create subprocedure to be called from within OnKeyDown event, and can as such be used elsewhere….?
-
@Just You should not call event handlers. Let the framework do that. If you need to share code, put it in a method that you call from the event handler.
-
I actually used the Perform method, using WM_KEYDOWN as sender, and it seems to work just fine. Thanks!
-
@Just Not the best way to do it
-
THe same goes for output parameters, out or var will give this problem.