diff --git a/ch32v003fun/ch32v003fun.mk b/ch32v003fun/ch32v003fun.mk
index 0f74ac4ea9e4da5b2e127c888196f21fdd7a493f..11ac26b518d9dfec73946a0c842a8e0898a13789 100644
--- a/ch32v003fun/ch32v003fun.mk
+++ b/ch32v003fun/ch32v003fun.mk
@@ -14,7 +14,7 @@ CFLAGS+= \
 	-nostdlib \
 	-I. -Wall
 
-LDFLAGS+=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L../../misc -lgcc
+LDFLAGS+=-T $(CH32V003FUN)/ch32v003fun.ld -Wl,--gc-sections -L$(CH32V003FUN)/../misc -lgcc
 
 SYSTEM_C:=$(CH32V003FUN)/ch32v003fun.c
 
diff --git a/minichlink/Makefile b/minichlink/Makefile
index e90cca96cf0b361db14d32b2c54619de2e217ac6..5f83f33eca92fea8fee101dc1b456bda18659721 100644
--- a/minichlink/Makefile
+++ b/minichlink/Makefile
@@ -38,7 +38,7 @@ minichlink.so : $(C_S)
 	gcc -o $@ $^ $(LDFLAGS) $(CFLAGS) $(INCS) -shared -fPIC
 
 minichlink.dll : $(C_S)
-	x86_64-w64-mingw32-gcc -o $@ $^ $(LDFLAGS) $(CFLAGS) $(INCS) -shared
+	x86_64-w64-mingw32-gcc -o $@ $^ $(LDFLAGS) $(CFLAGS) $(INCS) -shared -DMINICHLINK_AS_LIBRARY
 
 install_udev_rules :
 	cp 99-WCH-LinkE.rules /etc/udev/rules.d/
diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index d64b844c9295bb38c07cff46acc6bdd8368caea9..c4d2dd8f08fbc28ca0b80c86f436163b9675aa9d 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -11,14 +11,14 @@
 #include "minichlink.h"
 #include "../ch32v003fun/ch32v003fun.h"
 
-static int64_t StringToMemoryAddress( const char * number );
-static void StaticUpdatePROGBUFRegs( void * dev );
-static int InternalUnlockBootloader( void * dev );
+static int64_t StringToMemoryAddress( const char * number ) __attribute__((used));
+static void StaticUpdatePROGBUFRegs( void * dev ) __attribute__((used));
+static int InternalUnlockBootloader( void * dev ) __attribute__((used));
 
 void TestFunction(void * v );
 struct MiniChlinkFunctions MCF;
 
-int main( int argc, char ** argv )
+void * MiniCHLinkInitAsDLL( struct MiniChlinkFunctions ** MCFO )
 {
 	void * dev = 0;
 	if( (dev = TryInit_WCHLinkE()) )
@@ -34,6 +34,24 @@ int main( int argc, char ** argv )
         fprintf( stderr, "Found NHC-Link042 Programmer\n" );
     }
 	else
+	{
+		fprintf( stderr, "Error: Could not initialize any supported programmers\n" );
+		return 0;
+	}
+	
+	SetupAutomaticHighLevelFunctions( dev );
+	if( MCFO )
+	{
+		*MCFO = &MCF;
+	}
+	return dev;
+}
+
+#if !defined( MINICHLINK_AS_LIBRARY ) && !defined( MINICHLINK_IMPORT )
+int main( int argc, char ** argv )
+{
+	void * dev = MiniCHLinkInitAsDLL( 0 );
+	if( !dev )
 	{
 		fprintf( stderr, "Error: Could not initialize any supported programmers\n" );
 		return -32;
@@ -516,7 +534,7 @@ unimplemented:
 	fprintf( stderr, "Error: Command '%s' unimplemented on this programmer.\n", lastcommand );
 	return -1;
 }
-
+#endif
 
 #if defined(WINDOWS) || defined(WIN32) || defined(_WIN32)
 #define strtoll _strtoi64
diff --git a/minichlink/minichlink.exe b/minichlink/minichlink.exe
index eda0a5a992c0971a374653f4e5e505ddabd6859f..e9436b78095303f977b4ba748ec43a27adeefb5c 100644
Binary files a/minichlink/minichlink.exe and b/minichlink/minichlink.exe differ
diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h
index 4bbd18aa65b91d659d4e633e72a3fd296acdc293..0462984284cef827728f2e2631ce0745fef5280e 100644
--- a/minichlink/minichlink.h
+++ b/minichlink/minichlink.h
@@ -130,8 +130,22 @@ struct InternalState
 #define DMCFGR       0x7D
 #define DMSHDWCFGR   0x7E
 
+#if defined( WIN32 ) || defined( _WIN32 )
+#if defined( MINICHLINK_AS_LIBRARY )
+	#define DLLDECORATE __declspec(dllexport)
+#elif defined( MINICHLINK_IMPORT )
+	#define DLLDECORATE __declspec(dllimport)
+#else
+	#define DLLDECORATE
+#endif
+#else
+	#define DLLDECORATE
+#endif
+
+void * MiniCHLinkInitAsDLL(struct MiniChlinkFunctions ** MCFO) DLLDECORATE;
 extern struct MiniChlinkFunctions MCF;
 
+
 // Returns 'dev' on success, else 0.
 void * TryInit_WCHLinkE();
 void * TryInit_ESP32S2CHFUN();