DLL中导出ANSI和UNICODE函数

模仿window中的DLL导出ANSI和UNICODE版本的函数,使用UNICODE宏来控制使用哪个版本;

在函数实际的执行代码UNICODE版本中,在ANSI函数的版本中只做参数的转换,及ANSI字符串转UNICODE字符串,然后调用UNICODE版本的函数。

 0、DLL头文件

#include <Windows.h>

#ifndef _ICAL_H_
#define _ICAL_H_

#ifdef  DLL_EXPORT_IMP
    #define DLL_EXPORT  extern "C" __declspec(dllexport)
#else
    #define DLL_EXPORT  extern "C" __declspec(dllimport)
#endif

DLL_EXPORT int Add(int a, int b);
DLL_EXPORT void ShowA(LPCSTR lpStr);
DLL_EXPORT void ShowW(LPCWSTR lpStr);

#ifdef _UNICODE
    #define  Show ShowW
#else
    #define  Show ShowA
#endif

#endif

 1、DLL导出函数的实现

#include "stdafx.h"

#define   DLL_EXPORT_IMP
#include "ICal.h"
#include <iostream>

int Add(int a, int b)
{
    return 0;
}

void ShowW( LPCWSTR lpStr )
{
    std::wcout << lpStr << std::endl;
}

void ShowA( LPCSTR lpStr )
{
    if (! lpStr)
        return;

    int nCntOfChs = MultiByteToWideChar(CP_ACP, 0, lpStr,-1, NULL, 0);
    LPWSTR lpwStr = new WCHAR[nCntOfChs]();
    if (! lpwStr)
        return;

    nCntOfChs = MultiByteToWideChar(CP_ACP, 0, lpStr, -1, lpwStr, nCntOfChs);
    ShowW(lpwStr);
    delete[] lpwStr;
    lpwStr = NULL;
}
 

 2、使用DLL中的导出函数

    Show(TEXT("hello T world"));
    ShowA("hello A world");
    ShowW(L"hello W world");
时间: 2024-10-10 04:09:29

DLL中导出ANSI和UNICODE函数的相关文章

C++ DLL中导出函数的声明的方法

定义: TESTDLLEXPORT_API int fnTestDllExport(void); TESTDLLEXPORT_API int fnTestCall(void); TESTDLLEXPORT_API int fnAddInt(int i,int j); TESTDLLEXPORT_API BOOL fnContact(char* a); 建立一个.def文件 LIBRARY TestDllExportEXPORTS fnContact @1fnAddInt @2fnTestDllE

[转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但能否导出类应该也不是必须用MFC才能够做到,一定是有相应的机制可以实现.于是查了一下MSDN,发现这个机制简单的可怕,原来就和导出函数一样,把dllexport关键字加到类名前就可以了.估计和我一样的同学大有人在,把MSDN的相关文档翻译出来,附上我的注解,希望对大家有用. 评注程序均在Visual S

从dll中导出c++类

简介: 动态库(DLL)从开始就作为windows平台的组成部分而存在.它以独立的模块把c函数封装起来供其他用户使用 .DLL从开始就是以封装C语言的形式而存在,当然现在你也可以封装其他语言,比如c++,而如果要实现跨平台使用DLL,则我们必须回归到C语言. 利用C语言接口并不意味着我们必须丢弃掉面向对象方法.C语言可以实现应用二进制接口(ABI),这样使调用者和被调用着可以遵从统一的标准,但是C++语言没有这个特性,导致从一个编译器生成的binary不能被另一个编译器所识别.这样使得直接导出C

从普通DLL中导出C++类 &lt;一&gt;

Microsoft Specific You can declare C++ classes with the dllimport or dllexport attribute. These forms imply that the entire class is imported or exported. Classes exported this way are called exportable classes.The following example defines an export

从普通DLL中导出C++类 &lt;二&gt;

上一篇文章中,我们介绍了怎么从一个DLL中导出C++类,及选择性导出C++类的成员的方法.那么,整个系统的底层机制是怎么样的?是通过什么途径,使得我们可以在另一个程序中使用一个DLL中导出的类的呢? 我们知道,要使用一个C++类,必要的条件是在编译期能得到这个类的头文件,并在链接期可以找到对应的符号的链接地址(比如成员函数.静态数据成员等).如果这个C++类与你的使用者在同一个工程,那这个条件很好满足:    首先,C++类的头文件很好获得.直接在使用者那里将类的头文件include即可    

从DLL中导出变量学习

本文的目的就是想探究dll文件中的变量是如何导出.借此了解ntoskrnl.exe 的导出到底是怎么实现的. 在前面的<SSDT HOOK>代码段中有这么一句话: extern "C" PSERVICE_DESCRIPTOR_TALBE KeServiceDescriptorTable; 当时是说:这个符号是从ntoskrnl.exe 中导出的.从当时测试的时候改变符号名发现执行错误就可以看出来,这个符号绝对是从ntoskrnl.exe 文件中查找出来的.今天使用Depen

DLL中导出全局变量

1. DEF文件 1 EXPORTS 2 3 g_nTest DATA ;导出全局变量 4 5 GetGlobalVar ;导出函数 2. 调用 1 extern int g_nTest; //声明 2 3 int main(int argc, char *argv[]) 4 { 5 *(int*)g_nTest = 1; //注意前面的转换 6 7 return 0; 8 } 需要注意的是用 extern int g_nTest 声明所导入的并不是DLL中全局变量本身,而是其地址,应用程序必须

C#控制台 assembly与getmethod获取一个dll中的类的公有函数名

1 dll中有两个类 class1 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ClassLibrary1 8 { 9 public class Student 10 { 11 private int _ageStudent; 12 private string

Qt调用dll中的功能函数

DLL 优点 ------------------------------------- 1.扩展了应用程序的特性: 2.可以用许多种编程语言来编写: 3.简化了软件项目的管理: 4.有助于节省内存: 5.有助于资源共享: 6.有助于应用程序的本地化: 7.有助于解决平台差异: 8.可以用于一些特殊的目的.windows使得某些特性只能为DLL所用. 转载:http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html Qt调用d