MFC dll

说说这两天的郁闷之事!

最初是想给UE4写插件,后来说先学学写插件吧,也搞不懂插件是啥,就说先写一个DLL吧!

坑爹的是导出函数可以调用成功,但是如果向导出函数中传值就会出现错误。

最最坑爹的是导出函数可以向调用它的程序传值,可偏偏不能传CString类型的……

网上查了好多坑爹的办法哦。。。到如今也没能实现。。。他妹的

 

真狗血,本以为半天都用不了就能够搞定的事情  现在已经折腾快两天了…………

唉!

 

后来发现是这样的:

这两行代码  不太明白是什么意思,但第一句是错的,第二句是正确的,必须加WINAPI

这样就能正确的传递参数了!

 

并且也可以返回CString类型的变量。。。。原来如此!

感谢感谢http://blog.csdn.net/dybinx/article/details/7709822  博主!

 

现在贴一下代码吧,哈哈!

dll  代码:

由于之前用MFC标准dll没能成功,后来有人说标准MFC不能返回CString 类型,然后就用扩展的MFC dll

所以下面使用的是扩展MFC DLL 

首先新建一个类:

#pragma once
class openFi
{
public:
    openFi();
    CString showTime();
    int __declspec(dllexport)  add(int a);
    ~openFi();
};
View Code
#include "stdafx.h"
#include "openFi.h"


openFi::openFi()
{
}
CString openFi::showTime()
{
    CFileDialog openFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("文本文件|*.txt||"), NULL);
    if (openFile.DoModal() == IDOK)
    {
        return openFile.GetPathName();
    }
}
int openFi::add(int a)
{
    return 2*a;
}
openFi::~openFi()
{
}
.def文件

; mySelf.def : 声明 DLL 的模块参数。

LIBRARY

EXPORTS
    ; 此处可以是显式导出
	showTime @1
	add @2

  切记 在此 注释和代码不能在一行

然后必须EXPORTS  下面写上将要在外部调用的代码

这样 DLL 文件就完成了  生成 一下就行!

下面看一下主MFC 窗体的代码

void CUseDllDlg::OnBnClickedOk()
{
    // TODO:  在此添加控件通知处理程序代码
    HINSTANCE hdll = LoadLibrary(_T("\mySelf.dll"));
    typedef CString(WINAPI *getPath)();   //必须添加 WINAPI
    typedef int(WINAPI *qiuhe)(int a);
    qiuhe add;
    add = (qiuhe)GetProcAddress(hdll, "add");
    int c = 2;
    int aa = add(c);



    getPath getFilePath;
    getFilePath = (getPath)GetProcAddress(hdll, "showTime");
    CString str;
    str = getFilePath();

}
View Code

注意 必须添加 WINAPI

 

好了 就这样吧!

 

今天又测试过程中发现了一个问题,DLL实际上是区分32位和64位的,这个要与主程序对应,否则就会出错。娘娘的,真蛋疼,后续还有好多东西要学……乎,,加油!

 

常规的MFC  DLL 在接口中导出窗体失败,改成扩展MFC  DLL后 就好了!

posted @ 2015-04-02 16:05  沙中世界  阅读(202)  评论(0)    收藏  举报