我不知道如何解释这个,但我会尝试。这是我正在使用的:
C ++:
extern "C" __declspec(dllexport) void c(char path[])
{
//some code with the path.
}
C#:
[DllImport("DLL")]
static extern void c(char[] path);
正如您所看到的,我正在使用c ++中的导出函数。 我的问题是,是否有更简单的方法从DLL 获取应用程序的路径,而不将其作为参数传递给导出的函数?
答案 0 :(得分:2)
@peachykeen(拥有最出色的名字)正确地提出GetModuleFileName建议。获取EXE路径的技巧是将NULL作为hModule参数传递。
来自MSDN:
hModule [in,optional] 正在请求路径的已加载模块的句柄。 如果此参数为NULL,则GetModuleFileName将检索当前进程的可执行文件的路径。
答案 1 :(得分:1)
这很容易,但需要一些预见:
要做的第一件事是在本机DLL中实现DllMain
,它将在DLL加载时缓存模块的句柄。看起来像是:
EXTERN_C BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_opt_ LPVOID lpvReserved)
{
UNREFERENCED_PARAMETER(lpvReserved);
if (fdwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hinstDLL);
g_Handle = hinstDLL;
}
return TRUE;
}
稍后,当您想要获取名称时,只需拨打GetModuleFileName
,就像这样:
TCHAR dllName[MAX_PATH + 1];
GetModuleFileName(g_Handle, dllName, MAX_PATH);
唯一复杂的部分,如果要调用它,则存储来自DllMain的句柄。调用GetModuleHandle(NULL)
将为您提供执行模块的句柄,而不是DLL(与C#中的GetExecutingAssembly
相同)。
答案 2 :(得分:0)
独立应用程序和Windows服务的路径(但不适用于网站):
AppDomain.CurrentDomain.BaseDirectory