diff --git a/tools/winemaker b/tools/winemaker
index b2e58cc..052f180 100755
--- a/tools/winemaker
+++ b/tools/winemaker
@@ -20,7 +20,7 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 #
 
-my $version="0.7.3";
+my $version="0.7.4";
 
 use Cwd;
 use File::Basename;
@@ -525,8 +525,6 @@
 
     # reference to the project for this file. May not be used
     my $project;
-    # list of targets found in the current file
-    my %targets;
     # list of sources found in the current file
     my @sources_c=();
     my @sources_cxx=();
@@ -583,8 +581,7 @@
             }
 
             if (/^\# Microsoft Developer Studio Project File - Name=\"([^\"]+)/) {
-                $prj_name="$1.exe";
-                $targets{$prj_name}=1;
+                $prj_name="$1";
                 #print $prj_name;
                 next;
             } elsif (/^# TARGTYPE/) {
@@ -780,9 +777,7 @@
             } elsif (/^SOURCE=(.*)$/) {
                 my @components=split /[\/\\]+/, $1;
                 $sfilet=search_from($path, \@components);
-                if ($sfilet =~ /\.(exe|dll)$/i) {
-                    $targets{$sfilet}=1;
-                } elsif ($sfilet =~ /\.c$/i and $sfilet !~ /\.(dbg|spec)\.c$/) {
+                if ($sfilet =~ /\.c$/i and $sfilet !~ /\.(dbg|spec)\.c$/) {
                     push @sources_c,$sfilet;
                 } elsif ($sfilet =~ /\.(cpp|cxx)$/i) {
                     if ($sfilet =~ /^stdafx.cpp$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
@@ -856,7 +851,7 @@
         foreach my $vc_project ($project_xml->findnodes('/VisualStudioProject')) {
             foreach my $vc_project_attr ($vc_project->attributes) {
                 if ($vc_project_attr->getName eq "Name") {
-                    $targets{$vc_project_attr->getValue.".exe"}=1;
+                    $prj_name=$vc_project_attr->getValue;
                     last;
                 }
             }
@@ -870,9 +865,7 @@
                         $sfilet=~s/\\\\/\\/g; #remove double backslash
                         $sfilet=~s/^\.\\//; #remove starting 'this directory'
                         $sfilet=~s/\\/\//g; #make slashes out of backslashes
-                        if ($sfilet =~ /\.(exe|dll)$/i) {
-                            $targets{$sfilet}=1;
-                        } elsif ($sfilet =~ /\.c$/i and $sfilet !~ /\.(dbg|spec)\.c$/) {
+                        if ($sfilet =~ /\.c$/i and $sfilet !~ /\.(dbg|spec)\.c$/) {
                             push @sources_c,$sfilet;
                         } elsif ($sfilet =~ /\.(cpp|cxx)$/i) {
                             if ($sfilet =~ /^stdafx.cpp$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
@@ -953,10 +946,6 @@
         push @{@$project_settings[$T_DEFINES]},$prj_target_defines;
     }
 
-    my $target_count;
-    $target_count=keys %targets;
-
-
     # Add this project to the project list, except for
     # the main project which is already in the list.
     if ($is_sub_project == 1) {
@@ -991,105 +980,99 @@
         }
     }
 
-    # - Create the targets
-    # - Check if we have both libraries and programs
-    # - Match each target with source files (sort in reverse
-    #   alphabetical order to get the longest matches first)
     my @local_dlls=();
     my @local_depends=();
     my @exe_list=();
-    foreach my $target_name (map (lc, (sort { $b cmp $a } keys %targets))) {
-        # Create the target...
-        my $target=[];
-        target_init($target);
-        @$target[$T_NAME]=$target_name;
-        @$target[$T_FLAGS]|=@$project_settings[$T_FLAGS];
-        if ($target_name =~ /\.dll$/) {
-            @$target[$T_TYPE]=$TT_DLL;
-            push @local_depends,"$target_name.so";
-            push @local_dlls,$target_name;
-            my $canon=canonize($target_name);
-            push @{@$target[$T_LDFLAGS]},("-shared","\$(${canon}_MODULE:%=%.spec)");
-        } else {
-            @$target[$T_TYPE]=$opt_target_type;
-            push @exe_list,$target;
-            push @{@$target[$T_LDFLAGS]},(@$target[$T_TYPE] == $TT_CUIEXE ? "-mconsole" : "-mwindows");
-        }
-        my $basename=$target_name;
-        $basename=~ s/\.(dll|exe)$//i;
-        # This is the default link list of Visual Studio
-        my @std_imports=qw(odbc32 ole32 oleaut32 winspool odbccp32);
-        my @std_libraries=qw(uuid);
-        if ((@$target[$T_FLAGS] & $TF_NODLLS) == 0) {
-            @$target[$T_DLLS]=\@std_imports;
-            @$target[$T_LIBRARIES]=\@std_libraries;
-        } else {
-            @$target[$T_DLLS]=[];
-            @$target[$T_LIBRARIES]=[];
-        }
-        if ((@$target[$T_FLAGS] & $TF_NOMSVCRT) == 0) {
-            push @{@$target[$T_LDFLAGS]},"-mno-cygwin";
-            push @{@$target[$T_LDFLAGS]},"-m$opt_arch";
-        }
-        push @{@$project[$P_TARGETS]},$target;
 
-        # Ask for target-specific options
-        if ($opt_ask_target_options == $OPT_ASK_YES) {
-            my $flag_desc="";
-            if ((@$target[$T_FLAGS] & $TF_MFC)!=0) {
-                $flag_desc=" (mfc";
-            }
-            if ($flag_desc ne "") {
-                $flag_desc.=")";
-            }
-            print "* Specify any link option (-P/-i/-L/-l/--mfc) specific to the target\n";
-            print "* \"$target_name\"$flag_desc or 'never' to not be asked this question again:\n";
-            while (1) {
-            my $options=<STDIN>;
-            chomp $options;
-            if ($options eq "never") {
-                $opt_ask_target_options=$OPT_ASK_NO;
-                last;
-            } elsif (source_set_options($target,$options)) {
-                last;
-            }
-            print "Please re-enter the options:\n";
-            }
-        }
-        if (@$target[$T_FLAGS] & $TF_MFC) {
-            @$project_settings[$T_FLAGS]|=$TF_MFC;
-            push @{@$target[$T_DLL_PATH]},"\$(MFC_LIBRARY_PATH)";
-            push @{@$target[$T_DLLS]},"mfc.dll";
-            # FIXME: Link with the MFC in the Unix sense, until we
-            # start exporting the functions properly.
-            push @{@$target[$T_LIBRARY_PATH]},"\$(MFC_LIBRARY_PATH)";
-            push @{@$target[$T_LIBRARIES]},"mfc";
-        }
+    # Create the target...
+    my $target=[];
+    target_init($target);
 
-        # Match sources...
-        if ($target_count == 1) {
-            push @{@$target[$T_SOURCES_C]},@{@$project_settings[$T_SOURCES_C]},@sources_c;
-            @$project_settings[$T_SOURCES_C]=[];
-            @sources_c=();
-
-            push @{@$target[$T_SOURCES_CXX]},@{@$project_settings[$T_SOURCES_CXX]},@sources_cxx;
-            @$project_settings[$T_SOURCES_CXX]=[];
-            @sources_cxx=();
-
-            push @{@$target[$T_SOURCES_RC]},@{@$project_settings[$T_SOURCES_RC]},@sources_rc;
-            @$project_settings[$T_SOURCES_RC]=[];
-            @sources_rc=();
-
-            push @{@$target[$T_SOURCES_MISC]},@{@$project_settings[$T_SOURCES_MISC]},@sources_misc;
-            # No need for sorting these sources
-            @$project_settings[$T_SOURCES_MISC]=[];
-            @sources_misc=();
-        }
-        @$target[$T_SOURCES_C]=[sort @{@$target[$T_SOURCES_C]}];
-        @$target[$T_SOURCES_CXX]=[sort @{@$target[$T_SOURCES_CXX]}];
-        @$target[$T_SOURCES_RC]=[sort @{@$target[$T_SOURCES_RC]}];
-        @$target[$T_SOURCES_MISC]=[sort @{@$target[$T_SOURCES_MISC]}];
+    if ($prj_target_type!=3) {
+        $prj_name=lc($prj_name.".exe");
+        @$target[$T_TYPE]=$opt_target_type;
+        push @exe_list,$target;
+        push @{@$target[$T_LDFLAGS]},(@$target[$T_TYPE] == $TT_CUIEXE ? "-mconsole" : "-mwindows");
+    } else {
+        $prj_name=lc($prj_name.".dll");
+        @$target[$T_TYPE]=$TT_DLL;
+        push @local_depends,"$prj_name.so";
+        push @local_dlls,$prj_name;
+        my $canon=canonize($prj_name);
+        push @{@$target[$T_LDFLAGS]},("-shared","\$(${canon}_MODULE:%=%.spec)");
     }
+
+    @$target[$T_NAME]=$prj_name;
+    @$target[$T_FLAGS]|=@$project_settings[$T_FLAGS];
+
+    # This is the default link list of Visual Studio
+    my @std_imports=qw(odbc32 ole32 oleaut32 winspool odbccp32);
+    my @std_libraries=qw(uuid);
+    if ((@$target[$T_FLAGS] & $TF_NODLLS) == 0) {
+        @$target[$T_DLLS]=\@std_imports;
+        @$target[$T_LIBRARIES]=\@std_libraries;
+    } else {
+        @$target[$T_DLLS]=[];
+        @$target[$T_LIBRARIES]=[];
+    }
+    if ((@$target[$T_FLAGS] & $TF_NOMSVCRT) == 0) {
+        push @{@$target[$T_LDFLAGS]},"-mno-cygwin";
+        push @{@$target[$T_LDFLAGS]},"-m$opt_arch";
+    }
+    push @{@$project[$P_TARGETS]},$target;
+
+    # Ask for target-specific options
+    if ($opt_ask_target_options == $OPT_ASK_YES) {
+        my $flag_desc="";
+        if ((@$target[$T_FLAGS] & $TF_MFC)!=0) {
+            $flag_desc=" (mfc";
+        }
+        if ($flag_desc ne "") {
+            $flag_desc.=")";
+        }
+        print "* Specify any link option (-P/-i/-L/-l/--mfc) specific to the target\n";
+        print "* \"$prj_name\"$flag_desc or 'never' to not be asked this question again:\n";
+        while (1) {
+        my $options=<STDIN>;
+        chomp $options;
+        if ($options eq "never") {
+            $opt_ask_target_options=$OPT_ASK_NO;
+            last;
+        } elsif (source_set_options($target,$options)) {
+            last;
+        }
+        print "Please re-enter the options:\n";
+        }
+    }
+    if (@$target[$T_FLAGS] & $TF_MFC) {
+        @$project_settings[$T_FLAGS]|=$TF_MFC;
+        push @{@$target[$T_DLL_PATH]},"\$(MFC_LIBRARY_PATH)";
+        push @{@$target[$T_DLLS]},"mfc.dll";
+        # FIXME: Link with the MFC in the Unix sense, until we
+        # start exporting the functions properly.
+        push @{@$target[$T_LIBRARY_PATH]},"\$(MFC_LIBRARY_PATH)";
+        push @{@$target[$T_LIBRARIES]},"mfc";
+    }
+
+    # Match sources...
+    push @{@$target[$T_SOURCES_C]},@{@$project_settings[$T_SOURCES_C]},@sources_c;
+    @$project_settings[$T_SOURCES_C]=[];
+    @sources_c=();
+    push @{@$target[$T_SOURCES_CXX]},@{@$project_settings[$T_SOURCES_CXX]},@sources_cxx;
+    @$project_settings[$T_SOURCES_CXX]=[];
+    @sources_cxx=();
+    push @{@$target[$T_SOURCES_RC]},@{@$project_settings[$T_SOURCES_RC]},@sources_rc;
+    @$project_settings[$T_SOURCES_RC]=[];
+    @sources_rc=();
+    push @{@$target[$T_SOURCES_MISC]},@{@$project_settings[$T_SOURCES_MISC]},@sources_misc;
+    @$project_settings[$T_SOURCES_MISC]=[];
+    @sources_misc=();
+
+    @$target[$T_SOURCES_C]=[sort @{@$target[$T_SOURCES_C]}];
+    @$target[$T_SOURCES_CXX]=[sort @{@$target[$T_SOURCES_CXX]}];
+    @$target[$T_SOURCES_RC]=[sort @{@$target[$T_SOURCES_RC]}];
+    @$target[$T_SOURCES_MISC]=[sort @{@$target[$T_SOURCES_MISC]}];
+
     if ($opt_ask_target_options == $OPT_ASK_SKIP) {
         $opt_ask_target_options=$OPT_ASK_YES;
     }
