Solved

How to convert $(SolutionDir) into a C++ string?

Posted on 2009-07-10
6
1,774 Views
Last Modified: 2013-12-14
I need to access the compile-time path of the solution/project in C++ code. This seems to be easy to solve by way of compiler option /D ("preprocessor definitions"), which allows to add C++ macros that are treated the same way as regular "#define" statements. Using the /D compiler switch, I can use environment variables such as $(SolutionDir) or $(ProjectName), which are resolved to their actual values before being passed to the preprocessor.

Example: /D _SOLUTIONPATH_="$(SolutionDir)"
Resolves to: #define _SOLUTIONPATH_ "C:\svn\solutions\mysolution\"

Unfortunately, the solution path contains backslashes which create unintended escape sequences in the string that is resolved from the environment variable. I did not find a way to create a properly escaped string. The problem has been discussed elsewhere without any solution:
http://bytes.com/sitemap/t-788402.html

Any of the following would qualify as a solution to my question:
- A way to create a properly escaped C++ string from the $(SolutionDir) environment variable.
- A way to make $(SolutionDir) a path with forward slashes instead of backslashes, which would eliminate the necessity to escape anything.
- A way to define a C++ macro that contains the length of the $(SolutionDir) string, rather than the string itself.
- Any other way to make the compile-time solution path available in the C++ code without going through compiler option /D.
0
Comment
Question by:think-cell
  • 3
  • 2
6 Comments
 
LVL 30

Accepted Solution

by:
Zoppo earned 500 total points
Comment Utility
Hi think-cell,

I guess I found a quite tricky way, take a look at it if you like it - it works by generating a include file ...

First set a PreBuild-event like this:

> set __TEMP__=$(OutDir)
> set __TEMP__=%__TEMP__:\=\\%
> echo #define _SOLUTION_PATH_ "%__TEMP__%"  > tmp.h

Then in the 'C/C++' settings 'Command Line' add this:

> /FI tmp.h

If you want you can delete the temporary include file in a post-build step.


Hope that helps,

ZOPPO
0
 
LVL 33

Expert Comment

by:pgnatyuk
Comment Utility
Really cool! :) Just nice. It is a solution.
Maybe the question just looks so strange and the problem is somewhere in the application design?
Maybe an API like GetModuleFileName / GetCurrentDirectory could help?
 
0
 
LVL 33

Expert Comment

by:pgnatyuk
Comment Utility
BTW, set the working folder in the project settings as the $(SolutionDir) and then from the code call GetCurrentDirectory. Or $(SolutionDir)Bin.
But, I'd say, this folder name is always known - predefined/calculated somehow.
0
6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

 
LVL 30

Expert Comment

by:Zoppo
Comment Utility
@pgnatyuk: Please re-read the question - think-cell wants to have the value of the macro $(OutDir) as a string at compile-time, not at run-time ...
0
 

Author Closing Comment

by:think-cell
Comment Utility
Crazy, and works! Thanks.

Why would you use the compiler switch to include the file? I use a regular include statement next to the only place where I refer to the _SOLUTION_PATH_.
0
 
LVL 30

Expert Comment

by:Zoppo
Comment Utility
You're welcome, I'm glad I could help ...

And, I used this command line option for include so it 'feels' as if the macro was declared through preprocessor-settings - of course you can even include the created file instead using #include's where you need it.

Have a nice day,

best regards,

ZOPPO
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Programmer's Notepad is, one of the best free text editing tools available, simply because the developers appear to have second-guessed every weird problem or issue a programmer is likely to run into. One of these problems is selecting and deleti…
How to install Selenium IDE and loops for quick automated testing. Get Selenium IDE from http://seleniumhq.org (http://seleniumhq.org) Go to that link and select download selenium in the right hand columnThat will then direct you to their downlo…
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now