Use ShGetFolderPath in Delphi, which unit should I include? - shell

I try to use ShGetFolderPath in Delphi XE3. Since it is an Windows API, I search the Delphi source codes and find both Winapi.ShFolder.pas and WinApi.Shlobj.pas have its definition. I try to include ShFolder or ShlObj, both are OK. So which unit should I include for using ShGetFolderPath? Or can I just use any?

SHGetFolderPath is deprecated and is supported only for backward compatibility.
For new system and new application you can use SHGetKnownFolderPath instead.
About which header to include you can refer to document of that API and check the requirements part.

Related

Is it possible to include the cpp-reference.com documentation into clion's quick documentation viewer?

The provided documentation for the basic c++ packages within clion seems to be very short, and sometimes it is not possible to find any documentation for basic functions like e.g. the tangens function of the math package.
Is it somehow possible to include the offline-version of cppreference.com into clion's doxygen-based documentation viewer?
At the moment CLion doesn't support such functionality, here's the ticket for that https://youtrack.jetbrains.com/issue/CPP-9413.
As workaround, in case you use Linux you can install standard library with documentation, for instance:
https://packages.debian.org/sid/libstdc++-6-doc
https://packages.debian.org/sid/glibc-doc
After that CLion will have to work with lib-sources which documentation comments.

External DLL in VB6 with namespaces

I'm currently having some trouble with a VB6 application that needs to encode some text using the same encoding method available at .NET framework 4.5.
I've searched through the internet and found some functions that tries to do the encoding based in UTF-8, but it still doesn't match the 4.5 output.
Then I looked for a way to import the 4.5 framework DLL within the VB6 project. This is what I accomplished so far:
Private Declare Function dotNetUrlEncode Lib "System.Web.dll" Alias "UrlEncode" (str As String) As String
The problem is that the method "UrlEncode" it's inside the namespace "HttpUtility", "System.Web.HttpUtility.UrlEncode" and using the code above I cant access the method. I've tried changing it to look like the code below, but the problem persists, I cant reach the method UrlEncode:
Private Declare Function dotNetUrlEncode Lib "System.Web.dll" Alias "HttpUtility.UrlEncode" (str As String) As String
Private Declare Function dotNetUrlEncode Lib "System.Web.HttpUtility.dll" Alias "UrlEncode" (str As String) As String
Is there a way to reach the method UrlEncode inside "System.Web.dll"? Where am I going wrong?
Thanks for the help!
Best regards.
This will not work. The .NET DLLs contained managed code, which requires the .NET runtime. Your VB6 app can't call that code. Its process does not have the .NET runtime loaded.
You can only import functions from native DLLs this way. That's why it works for system DLLs included with the operating system.
The best solution would really be to consult the documentation and determine precisely how the UrlEncode function works. The internals of the implementation will not be documented, of course, but that doesn't matter. All you're interested in is the specification. Follow that same specification when implementing your own function if you cannot find a system function that has equivalent behavior.
If you absolutely needed to call .NET functions from a VB 6 application, it can be done. You will need to create a .NET wrapper that calls the framework-provided function and exposes in a COM-compatible manner using the ComVisibleAttribute. More information here, here, and here.

Can I generate UUID in C++11?

Is there any build-in facility that allows to generate UUID in C++11 without using any adidtional libraries?
Reposted from comment:
Built-in facility, no. But if you use a third party library (as opposed to OS functionality), I strongly recommend Boost.UUID.
I know this is an old thread, but another option is Poco's UUIDGenerator.
auto uuid_str = Poco::UUIDGenerator().createRandom().toString();

Calling a DLL function from tcl via twapi

I have a TCL application that is intented to run on Windows only and uses twapi to access some Windows-specific functions.
Now I need to call some C function that are in a custom DLL.
I know I can load the DLL with twapi::load_library (should be the same as LoadLibraryEx()) but I can't understand how to call a function within the DLL itself!
What did I miss?
I would prefer to avoid other dependencies (like critcl, for example) and to avoid to have to transform the current dll in a tcl extension (e.g. via SWIG) so a twapi only solution would be really helpful!
TWAPI doesn't seem to provide any public binding of GetProcAddress (the Windows API function for getting from the name to the address of a function in a DLL).
Use ffidl for simple APIs (i.e., where there are no callbacks) or critcl (for all kinds of APIs, including those with callbacks, because it can do much more extensive code generation; more effort to use though).
twapi's load_library command is there for manipulating the resources in a dll (string tables, icon etc.). It's not intended for calling functions in the dll since that, as Donal points out, requires marshalling and some code generation.
Looks like you'll have to use ffidl to do the job.

where are windows API functions defined?

when you need to use a function you include a header file but wheres the function code is defined?
Dave, the code lives in the various and many DLL files in your Windows\system32 directory.
The actual code that implements the Win-32 API are defined in various DLLs on your system. These DLLs have names like kernel32.dll, comctl32.dll etc. You will find them in C:\Windows\System32.
What generally happens is that you link your code with kernel32.lib etc. that have a little code to dynamically load the DLLs when your program starts. This allows Win32 API functions to directly call into the DLLS.
Well as explained above you are in the hands of microsoft.
You can always look at the msdn http://msdn.microsoft.com.
For most API functions you can find some information at the bottom.
For most function you get from there:
Minimum supported client
Minimum supported server
Header
Library
DLL
Unicode and ANSI names

Resources