【发布时间】:2021-07-28 06:59:26
【问题描述】:
我已经编写了自定义 DLL,其中包含适用于 pdf 的脚本语言的函数。当我调用我的创建函数时,它可以工作,但它会在我的 C++ 项目调试目录中创建 pdf。我没有指定一个完全合格的路径作为即时测试。是否有可以在视觉工作室中控制它并以某种方式在 dll 中的设置?如果我指定一个完整路径,它会返回一个错误,假设因为它是从我的项目文件夹中开始的......有人知道吗?
MV_EL_FunctionParameter pdfApCreate_parameters[] = {
{ "filename", 8, EPF_NORMAL },
{ "location", 8, EPF_NORMAL }
};
__declspec(dllexport) void bi_pdfApCreate(mvProgram prog, mvVariableHash parameters, mvVariable returnvalue, void **)
{
int ret = LoadApWDll();
if (!ret)
{
mvVariable_SetValue_Integer(returnvalue, 33333);
return;
}
// INPUTS
int filename_len;
const char* filename;
int location;
// OUTPUT
long id;
// Not needed anymore, for a depricated Miva API function.
//char* resolved_filename = NULL;
//int resolved_filename_len;
filename = mvVariable_Value(mvVariableHash_Index(parameters, 0), &filename_len);
location = file_location(mvVariableHash_Index(parameters, 1));
//mvFile_Resolve(prog, location, filename, filename_len, &resolved_filename, &resolved_filename_len);
id = pApCreate((char*)filename);
if (id) { mvProgram_Free(prog, const_cast<char*>(filename)); }
mvVariable_SetValue_Integer(returnvalue, id);
}
这是人们离开的地方。这是为 Miva 脚本语言创建函数。这是他们用来构建它的自定义 API。 这是 Miva Mia 的图片。
【问题讨论】:
-
"它在我的 C++ 项目调试目录中创建 pdf。我没有指定完全限定的路径" - 这是你的错误。始终使用绝对路径,切勿使用相对路径。在任何给定时刻,您都不知道调用进程的“当前工作目录”指向何处。即使您在代码中调用了 `SetCurrentDirectory(),它也是一个竞争条件。 “Visual Studio 中是否有可以控制的设置” - 这不是您应该在项目设置中控制的内容。 “如果我指定了一个完整的路径,它会返回一个错误”——那么你做错了什么......
-
... 如果需要,您可以在运行时从多个路径构建绝对路径。例如,如果您需要一个相对于 DLL 的绝对文件路径,您可以在运行时检索 DLL 的路径,截断其文件名,并根据需要附加新的文件夹/文件名。但是,由于您正在尝试创建新文件,因此您应该使用 Windows 为此目的预留的文件夹,例如在
%APPDATA%或MyDocuments等系统文件夹下创建您自己的子文件夹,您可以获得路径通过使用SHGetFolderPath()或SHGetKnownFolderPath()询问Windows。 -
OK... 在我的脚本代码中,我不需要指定完全限定的路径,因为我的网络服务器应用程序指定一切就绪。我没有在上面发布的 C++ 代码中使用任何路径信息。该代码中没有路径信息。该代码创建了一个我用另一种语言调用的函数,我将其发送到创建 pdf 的路径。
-
"我将创建 pdf 的路径发送到哪里" - 您发送的具体路径是什么?相对路径还是绝对路径?如果是相对的,那么在将路径处理给 Windows 以实际创建文件之前,该函数是否足够聪明,可以将该路径转换为由网络服务器定义的绝对路径?如果路径是相对的,并且只是按原样提供给 Windows,那么您将受制于网络服务器的“当前工作目录”,它可能随时指向 任何地方。你真的没有提供有用的细节来帮助你。
-
当它被调用时,该函数采用一个位置参数,该参数具体是脚本或数据。根据它是什么,Miva 创建由我在网络服务器中设置的任何路径指定的完整路径。
标签: c++ visual-studio dll