openexr-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Openexr-devel] Microsoft Windows non-administrator user ilmbase-1.0.0 b


From: Павел
Subject: [Openexr-devel] Microsoft Windows non-administrator user ilmbase-1.0.0 build problem
Date: Thu, 13 Dec 2007 22:50:12 +0600

Hello!

I found some bugs while building ilmbase-1.0.0 on my Microsoft Windows Vista PC with MSVC 2005 Express Edition.

The thing is createDLL attempts to create some files in the root directory of disk C: ("C:\\response.txt" in static void createResponseFile and "C:\\createDLL_out.txt" in int main). But creating files in root directory under non-administrator acount is not allowed. So build breaks.

Here is a quick'n'dirty patch to avoid this problem using WinAPI GetTempPath function (buggy under some older versions of Windows):

--- createDLL_orig.cpp 2006-12-11 11:36:52.000000000 +0300 +++ createDLL.cpp 2007-12-13 19:48:17.000000000 +0300 @@ -652,10 +652,18 @@ static void getSymbolsFromMap(char* buf,
     }
 }

+static std::string getTempPath()
+{
+       DWORD   dwBufferLength = GetTempPathA( 0, NULL );
+ std::auto_ptr<char> lpBuffer ( new char [dwBufferLength + 1] );
+       GetTempPathA( dwBufferLength, lpBuffer.get() );
+       return  string( lpBuffer.get() );
+}

static void createResponseFile(string& path, string& moduleName, vector<string>& libpath, string& implib, set<string>& libs, set<string>& objs, bool noDefaultLibs)
 {
-    FILE* r = fopen("C:\\response.txt", "wb");
+       string  rName = getTempPath() + "response.txt";
+    FILE* r = fopen(rName.c_str(), "wb");
     if (r != 0)
     {
fprintf(r, "/OUT:\"%s\\%s.dll\" /NOLOGO ", path.c_str(), moduleName.c_str()); @@ -701,7 +709,7 @@ static void createResponseFile(string& p
     }
     else
     {
- std::cerr << "Unable to open response file C:\\response.txt" << endl; + std::cerr << "Unable to open response file " << rName << endl;
     }
 }

@@ -729,7 +737,8 @@ int main(int argC, char* argV[])
     std::cout << "CreateDLL v1.1" << std::endl;

     // banner
- std::ofstream logfile("c:\\createDLL_out.txt", std::ios::out); + std::string logName = getTempPath() + "createDLL_out.txt"; + std::ofstream logfile(logName.c_str(), std::ios::out); logfile << "createDLL was built " << __DATE__ << " " << __TIME__ << endl;

     if (mapFileName == "" || importlib == "")
@@ -865,7 +874,8 @@ int main(int argC, char* argV[])
             char**  new_argv = new char *[3];
             size_t  new_argc = 0;
             new_argv[0] = "createDLL";
-            new_argv[1] = "@C:\\response.txt";
+ std::string new_argv1 = "@" + getTempPath() + "response.txt"; + new_argv[1] = const_cast<char*>( new_argv1.c_str() );
             new_argv[2] = 0;

             int status = -1;


--
Best regards,
Pavel Burov <address@hidden>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]