[fpc-pascal] Problem with FPC2.0.2 and windows

Hans Mårtensson cirkulation at maartensson.net
Tue Jan 3 19:57:38 CET 2006


Jonas Maebe wrote:

>
> On 28 Dec 2005, at 23:49, Hans Mårtensson wrote:
>
>> The problem was the following program line, using the windows unit:
>> if DialogBoxIndirect(0, pBox2, Window, @Box2Proc) = 0 then exit;
>> The compiler assessed an error in parameter 4. Should not be an  
>> address, but a variable.
>
>
> Is your Box2Proc procedure declared as stdcall? In FPC 1.x, the  
> default calling convention was compatible with stdcall, but in 2.x  
> this is no longer the case.


It is declared as stdcall ... and it was so when using ver. 1.0.10.

>> So I tried:
>> if DialogBoxIndirect(0, pBox2, Window, Box2Proc) = 0 then exit;
>> And the compiler assessed that the number of parameters was wrong.
>> But this is an error in message, because the number of parameters  is 
>> right.
>
>
> It was probably complaining that too few parameters were specified to  
> Box2Proc, not to DialogBoxIndirect. I guess from this that you are  
> working in either fpc or objfpc mode.


I had that option in my mind too, but the number of parameters in 
Box2Proc is also correct.
I use the fpc compiler on a source code written in the CrEdit program. I 
have not changed the configuration file that comes with the FreePascal 
download (except for file location of units).
The only compiler directive I have used in the program is the {$APPTYPE GUI}

>> Then I tried to define a procedural type TBoxproc and then declared  
>> a variable:
>> var BoxProc: TBoxproc;
>
>
> How is TBoxProc defined?

Here is the definition that I used:
Type TBoxProc = Function(x: longword; y: longword; a: longint; b: 
longint): longint; stdcall;

>> and changed my program to:
>> BoxProc:=@Box2Proc;
>> if DialogBoxIndirect(0, pBox2, Window, BoxProc)=0 then exit;
>>
>> Now FPC compiled my program to the end.
>
>
> This is the declaration of DialogBoxIndirect:
>
> function DialogBoxIndirect(hInstance:HINST;  
> hDialogTemplate:LPCDLGTEMPLATE; hWndParent:HWND;  
> lpDialogFunc:DLGPROC):longint;
>
> This is the declaration of DLGPROC:
>
> DLGPROC = function (_para1:HWND; _para2:UINT; _para3:WPARAM;  
> _para4:LPARAM):LRESULT;stdcall;
>
> As long as the definition of Box2Proc is compatible with this, there  
> should be no problem.


I cannot see any problem here.
But where are these definitions, I cannot find them in the FPC download, 
should they be downloaded separately?
Are they exactly the same as the definitions in the Microsoft documentation?


>> BUT following problems remains:
>> 1) I don’t understand why it should be necessary to use a variable  
>> that is assigned to @Box2Proc, in stead of using @Box2Proc directly  
>> as the parameter.
>
>
> It shouldn't be. Please always supply a fully compilable (or non- 
> compilable in this case, but in any case *complete*) sample if you  
> want us to investigate.


Yes of course. I only hoped that someone could point out some simple 
mistake I had made, or, inform me that there were some known problem 
with the compiler.
The problem is that my program is large with many units that depends on 
each other, so it was not easy to pick out the part that invoked the error.
Also it seemed very strange to me that the source code after some 
changes could be compiled with both FPC 1.0.10 AND FPC 2.0.2 and both 
exe files worked, except for that the FPC 2.0.2 version did not show the 
dialog boxes.
Now, I will try to construct a simple program that can reproduce the 
problems.

>> 2) Even though the compiler produces an exe file, this does not  
>> work. The call of DialogBoxIndirect does not produce any dialogue  
>> box, but returns having done nothing. Now it is a bit tricky to  make 
>> this dialogue box business work, because pBox2 must point to a  data 
>> structure, and if there are errors in this data structure,  windows 
>> do not produce any error message. But in this case, my data  
>> structure worked with the old version of FPC. I have tried to  
>> compile exactly the same source files with compiler 1.0.10 and with  
>> 2.0.2. The first program worked all right, but the second did not  
>> show any dialogue box, when the procedure in question was invoked.
>>
>> So I suspect that the compiler or the windows unit that comes with  
>> the 2.0.2 version has some error.
>> Does anybody know about these problems?
>
>
> The most likely reason is that your callback is not declared as  
> stdcall. But then the compiler should complain that the calling  
> conventions don't match, and not say that it "Should not be an  
> address, but a variable" (btw, what is the exact error message you  
> get since this error does not exist). And you should not be able to  
> circumvent calling convention requirements by using a procvar, as  
> procvars also have a calling convention associated with them (so that  
> would be a bug in the compiler if you can do that nevertheless).

I tried to omit the stdcall, which made the compiler produce an error 
message (something like: wrong format of procedure)


Thank you for your careful answer. I will return later if I am able to 
make a simple sample program that can reproduce the problem.
(Or may be I should stick to 1.0.10 that worked for me)

Hans Mårtensson




More information about the fpc-pascal mailing list