Posted by jpluimers on 2009/11/09
This just had this happen on a Windows 2003 server with a client’s client.
Any .asmx page would return a 404 error like this IIS log line shows:
2009-11-06 09:46:05 127.0.0.1 GET /MyVirtualDirectory/MyWebService.asmx – 80 – 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+SV1;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 404 2 1260
Searching for “iis 404 2 1260 asp.net” found this top from Marc Valk, that solved the issue: ASP.NET v2.0.5727 was prohibited to run.
Which means that none of the ASP.NET bound extensions would work: they all returned 404 errors.
(Note: if you are wondering where your IIS log files are, this post shows you).
–jeroen
Posted in .NET, ASP.NET, Development, IIS, SOAP/WebServices, Software Development, Web Development | Leave a Comment »
Posted by jpluimers on 2009/10/27
The “out of the box” .NET 3.0 component in Windows XP Embedded drags way too many required components (like the System Restore Core) into your image.
So most people build their own .NET 3.0 component.
If you get errors like this when you make your own, then you didn’t get your dependencies right.
These are the dependencies for the .NET 3.0 framework:
- .NET Framework 2.0
- ASP.NET 2.0
These are the error messages you get when you forget the ASP.NET 2.0 dependency:
Of course I always get all my dependencies right
(yeah right, not this time)
–jeroen
Posted in Development, XP-embedded | Leave a Comment »
Posted by jpluimers on 2009/10/27
I like enumerated type a lot.
The allow you to perfectly describe what the members of such a type actually mean, much more readable than a bunch of integer constants!
Given an enumerated type like TTraphicLightColors
type
TTraphicLightColors = (Red, Orange, Green);
I always wondered why - since the for ... in statement was added to the structured statements part of the Delphi language – it is not possible to use a for … in statement like the this:
</span>
<pre>var
TraphicLightColor: TTraphicLightColors;
begin
try
for TraphicLightColor in TraphicLightColor do
ShowValueAsTraphicLightColor(Ord(Value));
// [DCC Error] EnumerationEnumeratorDemoProcedures.dpr(63): E2430 for-in statement cannot operate on collection type 'TTraphicLightColors'
end;
Somehow, for … in expects a collection type.
A request for the for … in do on enumerated types compiler feature is in QC, but it is closed with reason “Won’t do”.
Back in Delphi 2007, I tried working around this by writing a type implementing the GetEnumerator pattern myself, but got Internal Errors when compiling anything but the most basic sample.
Until today, where I found how I could get that most basic sample to work!
It is an example on how you could implement this: it is research, so you decide if you find the result practical enough to use yourself.
Read the rest of this entry »
Posted in Delphi, Development, Software Development | 15 Comments »
Posted by jpluimers on 2009/10/19
Operator overloading is a very nice feature of the Delphi language.
However. the Delphi documentation on Operator overloading is not completely right.
Below is my table of what I found out so far, and some notes.
It is part of my “Nullable types in Delphi” session that I gave on some conferences.
The downloads for that session contain more detailed information.
This is just an abstract to get you going and a try to answer this operator overloading question on Stackoverflow.
Download the full presentation to get more in depth information.
Let me know if you need more information.
Notes
Operator overloading
Add your own “behaviour” to operators
- Win32: Works only for records, not classes!
- An operator and the operand(s)
are being implemented worden by a “class operator”;
this is a kind of class method with name and argumen(s)
Example:
- Multiplication X : = A * B;
- Operator: *
- Name: Multiply
- Operands: 2 -> two parameters
type
TMyRecord = record
class operator Multiply(A, B: TMyRecord): TMyRecord;
end;
Documentation is not correct!
Watch the result type of comparison operators!
Tips:
- Some operators should be overloaded pair-wise
= and <>
shl and shr
< and >=
> and <=
dec and inc
+ and -
/ and *
div and mod
- Prefer Explicit over Implicit operators
- Beware of the built-in type coercion (implicit operators)
- e.g
- Byte to Integer;
- Integer to Double;
- Variants from/to anything!
Table of operators
| operator |
# |
usage |
name |
cagetory |
* |
| and |
2 |
R := A and B; |
BitwiseAnd |
bit |
|
| not |
1 |
R := not A; |
//BitwiseNot |
bit |
glitch: does not exist! |
| or |
2 |
R := A or B; |
BitwiseOr |
bit |
|
| xor |
2 |
R := A xor B; |
BitwiseXor |
bit |
|
| () cast |
1 |
R := TValue(A); |
Explicit |
conversion |
|
| := |
1 |
R := A; |
Implicit |
conversion |
|
| operator |
# |
usage |
name |
category |
* |
| round |
1 |
R := Round(A); |
Round |
function |
|
| trunc |
1 |
R := Trunc(A); |
Trunc |
function |
|
| and |
2 |
R := A and B; |
LogicalAnd |
logical |
|
| not |
1 |
R := not A; |
LogicalNot |
logical |
|
| or |
2 |
R := A or B; |
LogicalOr |
logical |
|
| xor |
2 |
R := A xor B; |
LogicalXor |
logical |
|
| operator |
# |
usage |
name |
category |
* |
| + |
2 |
R := A + B; |
Add |
binary |
|
| / |
2 |
R := A / B; |
Divide |
binary |
|
| div |
2 |
R := A div B; |
IntDivide |
binary |
|
| mod |
2 |
R := A mod B; |
Modulus |
binary |
|
| * |
2 |
R := A * B; |
Multiply |
binary |
|
| - |
2 |
R := A – B; |
Subtract |
binary |
|
| operator |
# |
usage |
name |
category |
* |
| shl |
2 |
R := A shl B; |
LeftShift |
binary |
name is confusing |
| shr |
2 |
R := A shr B; |
RightShift |
binary |
name is confusing |
| - |
1 |
R := -A; |
Negative |
binary |
|
| + |
1 |
R := +A; |
Positive |
binary |
|
| dec |
1 |
Dec(A); |
Dec |
self |
|
| inc |
1 |
Inc(A); |
Inc |
self |
|
| operator |
# |
usage |
name |
category |
* |
| = |
2 |
R := A = B; |
Equal |
comparison |
|
| > |
2 |
R := A > B; |
GreaterThan |
comparison |
|
| >= |
2 |
R := A >= B; |
GreaterThanOrEqual |
comparison |
|
| < |
2 |
R := A < B; |
LessThan |
comparison |
|
| <= |
2 |
R := A <= B; |
LessThanOrEqual |
comparison |
|
| <> |
2 |
R := A <> B; |
NotEqual |
comparison |
|
–jeroen
Posted in Conferences, Delphi, Development, Event, Software Development | Leave a Comment »
Posted by jpluimers on 2009/10/15
There are quite a few registry tricks that you can perform to influence the Delphi IDE.
If you have any registry settings to share, please let me know by posting a comment below, or filling out the contact form.
This summary will be enhanced over time:
Have fun with them!
–jeroen
Posted in Delphi, Development, Software Development | 2 Comments »
Posted by jpluimers on 2009/10/15
Finding the correct VERxxx conditional define for a particular Delphi version is asked by a lot of people.
Even the first link in the above search, does not contain the full list!
But: JCL comes to the rescue
The JCL file JEDI.INC usually (read: like 99.999% of the time) is up to that with that information soon.
Currently, it contains all the defines starting with Delphi 1, up to Delphi 2010.
You can always browse the to JEDI.INC with this link to the sourceforge trunk.
In fact that file contains a lot more useful defines.
Actually, having the JCL and/or JVCL at hand is a very good practice: it is filled with high quality code that solves a lot of everyday problems.
Note:
VER190 (by some people attributed to the wrong Delphi version) is only used by Delphi 2007 for .NET (Delphi 2007 for Win32 used VER185 by itself and shares VER180 with Delphi 2006 for Win32).
The number 13 (in between Delphi 2009 aka Delphi 12, and Delphi 2010 aka Delphi 14) was never used as a Delphi version number
Since Delphi is mainly developed in the USA, and since a lot people there have Triskaidekaphobia, they showed mercy to those and skipped Delphi 13.
–jeroen
Posted in Delphi, Development, Software Development | 6 Comments »
Posted by jpluimers on 2009/10/15
Recently we got involved with a client having a large and complex application that (historically) consists of
- A main .EXE that loads
- Many DLLs
- Underlying BPLs
One of the biggest problems is debugging the startup sequence.
Somehow, when the Delphi IDE loads DLLs in the initialization sequences of units, it looses its ability symbol tables.
This article describes a few tips on how to debug those, especially where to put breakpoints.
Read the rest of this entry »
Posted in Debugging, Delphi, Development, Software Development | 3 Comments »
Posted by jpluimers on 2009/10/12
I found back one of my earliest mail messages: it is dated back in februari 1989.
Wow – ain’t search engines nice!
Today, messages like those seem totally irrelevant.
But back then, getting in touch with other people through email could be a real challenge.
The internet was forming (out of UUNET, DECnet, BITNET, Usenet, EARN, ARPANET and others), and not everything was completely interconnected yet, let alone connected on-line 24/7.
For instance, newsgroups were limited to the usenet portion of the internet, and not available on the bitnet portion.
So, mail and mailing lists were the prevalent means of communication: LISTSERV was the first program facilitating mailing lists.
Routing mail could be a challenge as well.
There was not yet such a widespread thing as SMTP or POP3 as it is today.
So mail got relayed (in fact open mail relays were the standard configuration), and often you had to provide the routing instructions in your mail as well.
Hence the complicated mail addresses used in the message linked above.
Back then, on the for sending mail on the on the VAX/VMS I was working on, gMail (note the spelling) was a very good mail program that would magically do most of the routing for you.
BITNIC used to be a repository to download information and programs.
UUENCODE one of the early encoding schemes to send binaries over email (and still one of Microsoft’s email programs barfs when you put ‘begin 664′ at the beginning of a line).
BITNET Relay was one of the earliest chat programs (much like IRC now), and HEARN the mean node in The Netherlands.
History is fun!
–jeroen
Posted in About, History, Personal | 6 Comments »
Posted by jpluimers on 2009/10/11
Recently, I had to change the “Password Never Expires” flag for some users on Windows systems.
In the past, there used to be a netuser tool available from WindowsITPro where you could use the pwnexp flag to set or clear that flag.
That tool seems to be vanished, so I was searching for alternatives.
Most alternatives I found depend on some kind of scripting, or the use of the WMIC WMI command line interface: that was “out” because this particular setup is running on Windows XP Embedded, which is trimmed down very much.
The only C# example I found was on CodeProject, but it does
- not take into account the existing flags correctly,
- have hard coded literals without any references where they are from,
- use bit flag arithmetic without letting the C# compiler do its magic with enums,
- use a call to the deprecated InvokeGet method,
- use the Invoke(“Put”, … way of calling that so many people use (which actually should have been an – also deprecated – InvokeSet method),
- use COM Interop
Hence the solution below:
C#, with the proper ADS_USER_FLAG_ENUM enum from the MSDN documentation and no COM Interop, it also moves all literals to constants.
Read the rest of this entry »
Posted in .NET, C#, C# 2.0, CommandLine, Development, Software Development, XP-embedded | Leave a Comment »