100分求教!关于DLL的问题 我要创建两个DLL,但是如何进行它们之间的数据交换(或者一个调用一个的数据),是不是在一个DLL中的自定义一个寒暑,然后输出,有另一个来调用。但是我试验一次不行,求教!!!请详细说明!!!谢了,先~!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你那两个DLL是怎么调用的,如果都是在主程序中调用,那样好像只能通过主程序来交换数据。如果在一个DLL中调用另一个DLL的话,应该可以直接调用另一个DLL中的函数 这么说吧,我在一个软件中调用一个主DLL(PTC.dll),然后它去调用另一个DLL(MFC.dll, Dependency of PTC),然后我要用的程序(PRO/E)调用PTC,PTC调用MFC,由MFC向PTC传输数据,怎么进行!!!请写明!!谢了,先!! 在MFC.CPP中定义的函数LoadDlg是为了能从PRO/E中调用由MFC.dll生成的对话框,同时能够传递有对话框得到的数据(4个),定义如下:_declspec(dllexport) void LoadDlg(Box* box){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); Box* m_pBox=new Box(); CMyDlg111 dlg; m_pBox->c=dlg.m_c; m_pBox->m=dlg.m_m; m_pBox->y=dlg.m_y; m_pBox->k=dlg.m_k; int i; i=aaa1.DoModal(); if(i==0) { AfxMessageBox("对话框调用失败"); } }然后在PTC中的MainPTC.CPP(我自己编写的,为了能够在PRO/E中画图)中调用,void Load_Dlg(){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); Box* m_pBox=new Box(); LoadDlg(m_pBox); //savedata(c,k,m,y); ProMdl part; ProParameter param1; ProParameter param2; ProParameter param3; ProParameter param4; ProParamvalue value1; ProParamvalue value2; ProParamvalue value3; ProParamvalue value4; ProModelitem feature; int i; int teethnum1; double pitch1,angle1,width1; ProMdlRetrieve(L"C:\\Documents and Settings\\Administrator\\桌面\\新建文件夹\\spur_gear.prt.1", PRO_MDL_PART, &part); ProMdlIdGet(part,&i); ProModelitemInit(part,i,PRO_PART,&feature); ProParameterInit(&feature, L"TEETH", ¶m1); ProParameterInit(&feature, L"PITCH", ¶m2); ProParameterInit(&feature, L"ANGLE", ¶m3); ProParameterInit(&feature, L"WIDTH", ¶m4); value1.type=PRO_PARAM_INTEGER; value1.value.i_val=m_pBox->c; value2.type=PRO_PARAM_DOUBLE; value2.value.d_val=1/m_pBox->m; value3.type=PRO_PARAM_DOUBLE; value3.value.d_val=m_pBox->y; value4.type=PRO_PARAM_DOUBLE; value4.value.d_val=m_pBox->k; ProParameterValueSet(¶m1, &value1); ProParameterValueSet(¶m2, &value2); ProParameterValueSet(¶m3, &value3); ProParameterValueSet(¶m4, &value4); ProSolidRegenerate((ProSolid)part, PRO_B_TRUE); ProMdlDisplay(part);}其中Load_Dlg是调用函数;我在PTC中加入了一个Import.h文件,是调入由MFC省城的Loaddlg函数,Import.h文件如下:#pragma once// 加载系统数据结构的头文件声明#include "MFC\datastruct.h"#include "stdafx.h"// 库文件导入列表_declspec(dllimport) void LoadDlg(Box* box);// 函数声明(主要是调用导入库的函数)void Load_Dlg();我又在MFC中定义了一个数据结构的文件DataStruct.h:#pragma once// 整个工程数据结构的声明typedef struct{ int c; double m; double y; double k; }Box;这样我就能够在PRO/E中调用了,但是如何传递数据?(从MFC到PTC)谢了,先!!! declspec(dllexport) void LoadDlg(Box* box){ ...... Box* m_pBox=new Box(); //这是干什么用的? CMyDlg111 dlg; m_pBox->c=dlg.m_c; m_pBox->m=dlg.m_m; m_pBox->y=dlg.m_y; m_pBox->k=dlg.m_k; int i; i=aaa1.DoModal();//aaa1 怎么出来的? }CMyDlg111 是产生那4个所需数据的对话框吗? 好,我就假设 CMyDlg111 是数据的生产者:==================== MFC.dll ===========================declspec(dllexport) BOOL LoadDlg(Box* box){ CMyDlg111 dlg; int i=dlg.DoModal(); if(i==0) return FALSE; Box->c=dlg.m_c; Box->m=dlg.m_m; Box->y=dlg.m_y; Box->k=dlg.m_k; return TRUE;}====================================================================================== PTC.dll =====================================declspec(dllexport) BOOL PTCLoadDlg(Box* box){ BOOL i=LoadDlg(box); return i;}=============================================================================================== 主程序 ======================================== Box * box= new Box; if(PTCLoadDlg(box)) { 得到数据 }else { 未得到数据 }=============================================================================== 关键是要你的思路清晰,不要把自己搞糊涂了。调dll函数跟调本地函数没差别。 CMyDlg111是产生那4个数据的对话框,忘了说了,aaa是在MFC中创建的第一个对话框,所以要调用它:aaa aaa1;//加一句_declspec(dllexport) void LoadDlg(Box* box){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); Box* m_pBox=new Box(); CMyDlg111 dlg; m_pBox->c=dlg.m_c; m_pBox->m=dlg.m_m; m_pBox->y=dlg.m_y; m_pBox->k=dlg.m_k; int i; i=aaa1.DoModal(); if(i==0) { AfxMessageBox("对话框调用失败"); } } 在PTC中为什么是dllexport,PTC要调用对话框的,我觉得应该是dllimport才对吧?========================= PTC.dll =====================================declspec(dllexport) BOOL PTCLoadDlg(Box* box){ BOOL i=LoadDlg(box); return i;}======================================================================== 我的MyDlg111中的是EDIT Box 来输入数据的,CMyDlg111 dlg; int i=dlg.DoModal(); if(i==0) return FALSE; Box->c=dlg.m_c; Box->m=dlg.m_m; Box->y=dlg.m_y; Box->k=dlg.m_k; return TRUE;我需要在对话框中摁下按钮后,数据进行传递。您这么写行吗?我不太清楚!!请指点!谢谢 看来你懂得太少;我问你,你的 CMyDlg111 是干什么用的?他的作用自然是显示对话框,接受输入,并保存输入数据。int i=dlg.DoModal();这一句作用就是执行对话框。直到对话框关闭后i才会有直;当你通过 i 值确定对话框成功以后,就从里面把值读出来,这都不懂。我给你的那些语句当然编不过,他只是重点部分,要让他工作,你还得自己把另外 80%的代码补充完整。 给你说真实太累了 我的MSDN例子不全,急需Acmapp例子的代码文件,请好心人发给我。 这样的接口申明,如何知道传入的BSTR*被分配了多少存储空间? 如何调用CMainFrame类里的函数 初学ado救命啊~~~ 寻找数据库解密高手 如何在主对话框退出,但是应用不退出的情况下的消息截获 一个初学COM/ATL的问题(其实也不能叫问题) 如何在对话框里绘图 dsoframer控件使用问题 关于fstream的一个小问题 高分求教··在线等待··关于VC连接Sybase的问题 小弟关于汉字个数的问题已经解决。
请写明!!
谢了,先!!
_declspec(dllexport) void LoadDlg(Box* box)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Box* m_pBox=new Box();
CMyDlg111 dlg;
m_pBox->c=dlg.m_c;
m_pBox->m=dlg.m_m;
m_pBox->y=dlg.m_y;
m_pBox->k=dlg.m_k;
int i;
i=aaa1.DoModal();
if(i==0)
{
AfxMessageBox("对话框调用失败");
}
}
然后在PTC中的MainPTC.CPP(我自己编写的,为了能够在PRO/E中画图)中调用,
void Load_Dlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Box* m_pBox=new Box();
LoadDlg(m_pBox);
//savedata(c,k,m,y);
ProMdl part;
ProParameter param1;
ProParameter param2;
ProParameter param3;
ProParameter param4;
ProParamvalue value1;
ProParamvalue value2;
ProParamvalue value3;
ProParamvalue value4;
ProModelitem feature;
int i;
int teethnum1;
double pitch1,angle1,width1;
ProMdlRetrieve(L"C:\\Documents and Settings\\Administrator\\桌面\\新建文件夹\\spur_gear.prt.1", PRO_MDL_PART, &part);
ProMdlIdGet(part,&i);
ProModelitemInit(part,i,PRO_PART,&feature);
ProParameterInit(&feature, L"TEETH", ¶m1);
ProParameterInit(&feature, L"PITCH", ¶m2);
ProParameterInit(&feature, L"ANGLE", ¶m3);
ProParameterInit(&feature, L"WIDTH", ¶m4);
value1.type=PRO_PARAM_INTEGER;
value1.value.i_val=m_pBox->c;
value2.type=PRO_PARAM_DOUBLE;
value2.value.d_val=1/m_pBox->m;
value3.type=PRO_PARAM_DOUBLE;
value3.value.d_val=m_pBox->y;
value4.type=PRO_PARAM_DOUBLE;
value4.value.d_val=m_pBox->k;
ProParameterValueSet(¶m1, &value1);
ProParameterValueSet(¶m2, &value2);
ProParameterValueSet(¶m3, &value3);
ProParameterValueSet(¶m4, &value4);
ProSolidRegenerate((ProSolid)part, PRO_B_TRUE);
ProMdlDisplay(part);
}
其中Load_Dlg是调用函数;
我在PTC中加入了一个Import.h文件,是调入由MFC省城的Loaddlg函数,Import.h文件如下:
#pragma once// 加载系统数据结构的头文件声明
#include "MFC\datastruct.h"
#include "stdafx.h"
// 库文件导入列表
_declspec(dllimport) void LoadDlg(Box* box);
// 函数声明(主要是调用导入库的函数)
void Load_Dlg();
我又在MFC中定义了一个数据结构的文件DataStruct.h:
#pragma once
// 整个工程数据结构的声明
typedef struct
{
int c;
double m;
double y;
double k;
}Box;
这样我就能够在PRO/E中调用了,但是如何传递数据?(从MFC到PTC)
谢了,先!!!
{
......
Box* m_pBox=new Box(); //这是干什么用的?
CMyDlg111 dlg;
m_pBox->c=dlg.m_c;
m_pBox->m=dlg.m_m;
m_pBox->y=dlg.m_y;
m_pBox->k=dlg.m_k;
int i;
i=aaa1.DoModal();//aaa1 怎么出来的?
}CMyDlg111 是产生那4个所需数据的对话框吗?
{
CMyDlg111 dlg;
int i=dlg.DoModal();
if(i==0) return FALSE;
Box->c=dlg.m_c;
Box->m=dlg.m_m;
Box->y=dlg.m_y;
Box->k=dlg.m_k;
return TRUE;
}
====================================================================================== PTC.dll =====================================declspec(dllexport) BOOL PTCLoadDlg(Box* box)
{
BOOL i=LoadDlg(box);
return i;
}
=============================================================================================== 主程序 ======================================== Box * box= new Box;
if(PTCLoadDlg(box))
{
得到数据
}else
{
未得到数据
}
===============================================================================
调dll函数跟调本地函数没差别。
aaa aaa1;//加一句
_declspec(dllexport) void LoadDlg(Box* box)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Box* m_pBox=new Box();
CMyDlg111 dlg;
m_pBox->c=dlg.m_c;
m_pBox->m=dlg.m_m;
m_pBox->y=dlg.m_y;
m_pBox->k=dlg.m_k;
int i;
i=aaa1.DoModal();
if(i==0)
{
AfxMessageBox("对话框调用失败");
}
}
========================= PTC.dll =====================================declspec(dllexport) BOOL PTCLoadDlg(Box* box)
{
BOOL i=LoadDlg(box);
return i;
}
========================================================================
CMyDlg111 dlg;
int i=dlg.DoModal();
if(i==0) return FALSE;
Box->c=dlg.m_c;
Box->m=dlg.m_m;
Box->y=dlg.m_y;
Box->k=dlg.m_k;
return TRUE;
我需要在对话框中摁下按钮后,数据进行传递。
您这么写行吗?我不太清楚!!请指点!谢谢
这一句作用就是执行对话框。直到对话框关闭后i才会有直;
当你通过 i 值确定对话框成功以后,就从里面把值读出来,这都不懂。我给你的那些语句当然编不过,他只是重点部分,
要让他工作,你还得自己把另外 80%的代码补充完整。 给你说真实太累了