Solved

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

Posted on 2009-07-10
6
1,884 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 31

Accepted Solution

by:
Zoppo earned 500 total points
ID: 24824886
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
ID: 24835223
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
ID: 24835448
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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 31

Expert Comment

by:Zoppo
ID: 24837575
@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
ID: 31602006
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 31

Expert Comment

by:Zoppo
ID: 24838949
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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Update (December 2011): Since this article was published, the things have changed for good for Android native developers. The Sequoyah Project (http://www.eclipse.org/sequoyah/) automates most of the tasks discussed in this article. You can even fin…
Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
THe viewer will learn how to use NetBeans IDE 8.0 for Windows to perform CRUD operations on a MySql database.

726 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