从现有(但旧)的示例代码创建DLL

时间:2018-05-31 14:41:50

标签: c dll compilation

我遇到了创建DLL的代码问题(或者可能是编译器设置)。

我试图创建一个DLL作为Windows 64下运行的软件包(ZEMAX)的扩展 - 虽然它是OLD(2005)的软件 - 升级它将花费&$ 5000美元并且它工作正常所以尝试是有意义的。

软件(ZEMAX)使用dll文件来扩展它可以做的事情,并期望这些DLL具有给出参数和返回给定值的函数。给出了示例代码,我可以将其编译为DLL,但软件无法找到函数。

示例代码由ZEMAX提供,我对其进行了少量修改。我想创建four_angle.dll。示例代码中的关键行(全部在C#中,我不想重写所有内容):

int __declspec(dllexport) APIENTRY UserParamSourceDefinition(double *data);
int __declspec(dllexport) APIENTRY UserParamNames(char *data);

BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

以及稍后

int __declspec(dllexport) APIENTRY UserParamNames(char *data)
{
    strcpy_s(data[1],16,'hello');
}

int __declspec(dllexport) APIENTRY UserSourceDefinition(double *data)
{
    data[30] = (double)data[2] + 1.0;
}

Visual Studio编译没有错误。有没有理由在运行时加载DLL的软件无法调用这些函数?我是制作dll的新手,所以我不知道DLLMain的定义语句和选项是如何工作的。

PS - 我注意到visual studio还创建了一个DLLmain,我注释掉了,因为你无法定义两次。我再一次只知道它是如何工作的,如果我打算填写一些案例陈述。

#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

PPS我一直按照这里的说明进行操作 - 但没有运气:http://customers.zemax.com/os/resources/learn/knowledgebase/how-to-compile-a-user-defined-surface.aspx

1 个答案:

答案 0 :(得分:1)

考虑到:

  • WINAPIAPIENTRY只是#define__stdcall
  • 根据Dependency WalkerUserParamNames函数由 .dll 版本导出:
    • 作品:_UserParamNames@4
    • 不起作用:?UserParamNames@@YGHPAD@Z

出现以下结论:

  • 代码编译(和函数导出)为 C ++ (check [MSDN]: Decorated Names
  • 目标架构为32位( Win32 x86

我只是在这里推测,但很可能你将函数定义放在 .cpp 文件中(默认编译为 C ++ )。

为了解决您的问题,请将您的功能导出为 C 。您修改了1 st 代码段(对于出现此问题的每个函数,您都必须执行相同的操作)。您可以按照以下方式执行此操作,也可以单独为每个功能添加extern "C"

#if defined(__cplusplus)
extern "C" {
#endif

    __declspec(dllexport) int APIENTRY UserParamSourceDefinition(double *data);
    __declspec(dllexport) int APIENTRY UserParamNames(char *data);

#if defined(__cplusplus)
}
#endif

有关详细信息(信息,代码,资源),请检查: