1, 动态链接库编译
使用VS2015创建“Win32项目”,选择应用程序类型为“DLL”,创建项目完成后,头文件中:
#ifdef EXT_DEC_EXPORTS
#define EXT_DEC_API __declspec(dllexport)
#else
#defineEXT_DEC_API __declspec(dllimport)
#endif
// 此类是从 EXT_DEC.dll 导出的
class EXT_DEC_API CEXT_DEC {
public:
CEXT_DEC(void);
// TODO: 在此添加您的方法。
};
//extern EXT_DEC_API int nEXT_DEC;
extern "C" {
EXT_DEC_API int fnEXT_DEC(void);
EXT_DEC_API int load_data(void);
EXT_DEC_API int FreeMem(void);
//EXT_DEC_API int ExtIPLocation3(char* IP);
}
在cpp文件中添加:
// 这是导出函数的一个示例。
EXT_DEC_API int fnEXT_DEC(void)
{
return 42;
}
选择生成Release X64版本解决方案,便可以在项目文件夹下找到生成的DLL(EXT_DEC\x64\Release)
2, 在sas中调用DLL
/* 声明调用DLL中的函数 */
procproto stdcall package=work.proto_ds.cfcns;
link'D:\workspace\SAS\EXT_DEC\x64\Release\EXT_DEC.dll';
int load_data(void);
int FreeMem(void);
char* ExtMobileLocation(char* mobile);
run;
/* 编绎DLL中的函数 */
proc fcmpinlib=work.proto_ds outlib=work.fcmp_ds.sasfcns;
function Ext_load_data();
return (load_data());
endsub;
subroutine Ext_free_mem(re);
outargs re;
re=FreeMem();
endsub;
function Ext_MobileLocation(mobile $)$200;
return(ExtMobileLocation(compress(mobile)));
endsub;
quit;
optionscmplib=(work.proto_ds work.fcmp_ds);
datanull;
/* line = Ext_load_data();*/
/* put line = ;*/
length loc $100;
loc=Ext_MobileLocation("18788759490");
putloc = ;
call Ext_free_mem(re);
putre = ;
run;