博文

DLL中调用Dialog的奇怪现象 (2007-09-14 14:43:00)

摘要:DLL中调用Dialog的奇怪现象 发布时间:2007-5-20 0:45:46  
我在一个DLL中使用一个对话框,该对话框中使用了一个custom控件,该控件在Exe中可以正常使用,但是在DLL中使用时,DoModal()返回-1,对话框不显示,这是为什么?  
---------------------------------------------------------------  
 
在DllMain中PROCESS_ATTACH的时候调用CoInitialize(),在PROCESS_DETACH的时候调用CoUnInitialize()  
---------------------------------------------------------------  
 
http://www.vchome.net/tech/dll/dll44.htm  
在Dll中创建对话框并调用  
作者:freedk  
 
下载本文示例代码  
 
1、第一步创建一“MFC  AppWizard  (dll)”工程,接下来选择“Regular  Dll  using  shared  MFC  DLL”,点击“Finish”。  
 
2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”  
选择“New”,至此对话框已添加到DLL工程中。  
 
3、为对话框添加一新类,如:CTest,基类为CDialog。  
 
4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:  
 
extern  "C"  __declspec(dllexport)  void  Show()  ......

阅读全文(19688) | 评论:0

VC中使用CFileDialog进行文件操作(2007-09-14 13:30:00)

摘要: 一般来讲你不需要派生新的类,因为基类已经提供了常用的功能。而且在创建并等待对话框结束后你可以通过成员函数得到用户在对话框中的选择。

CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:

bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
......

阅读全文(4362) | 评论:0

 转【vc】CFileDialog 使用介绍     (2007-09-14 13:18:00)

摘要:CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下: bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。 lpszDefExt 指定默认的文件扩展名。 lpszFileName 指定默认的文件名。 dwFlags 指明一些特定风格。 lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。 pParentWnd 为父窗口指针。 创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择: CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1 POSITION CFileDialog::GetStartPosition( ......

阅读全文(6559) | 评论:0

作者tag:c/c++ 消息 应用 属性 mb messagebox CSDN(2007-09-07 14:36:00)

摘要:http://blog.csdn.net/qiumingbo/archive/2007/05/25/1625324.aspx   MessageBox用法
消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。
1.
MessageBox("这是一个最简单的消息框!");
2.
MessageBox("这是一个有标题的消息框!","标题");
3.
MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );
4.
MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );
5.
MessageBox("这是一个两种属性的消息框!","标题", MB_ICONEXCLAMATION|MB_OKCANCEL ); 6.
if(MessageBox("一种常用的应用","标题",MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)
 return; 附其它常用属性 系统默认图标,可在消息框上显示
X错误 MB_ICONHAND, MB_ICONSTOP, and MB_ICONERROR
?询问 MB_ICONQUESTION
!警告 MB_ICONEXCLAMATION and MB_ICONWARNING
i信息 MB_ICONASTERISK and MB_ICONINFORMATION 按钮的形式
MB_OK  默认
MB_OKCANCEL 确定取消
MB_YESNO 是否
MB_YESNOCANCEL 是否取消 返回值
IDCANCEL 取消被选
IDNO 否被选
IDOK 确定被选
IDYES 是被选 补充:
以上消息框的用法是在CWnd的子类中的应用,如果不是,则要MessageBox(NULL,"ddd","ddd",MB_OK);  或MessageBox(hWnd,"ddd","ddd",MB_OK); hWnd为某窗口的句柄,或者直接用AfxMe......

阅读全文(2619) | 评论:0

Visual C++ 中的ODBC编程(2007-09-03 10:17:00)

摘要: Visual C++ 中的ODBC编程 2003-12-09加入  来自CPCW  作者董毅  7条评论  点击7241次        
ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。本文给出Windows 95 环境下用Visual C++ 进行ODBC 编程的具体方法及技巧。

---- 关键字:ODBC,Visual C++,Windows 编程。

---- 一.概述

---- ODBC 是一种使用SQL 的程序设计接口。使用ODBC 让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS 厂商们的广泛支持。

---- Microsoft Developer Studio 为大多数标准的数据库格式提供了32 位ODBC 驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle 以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC 驱动器及DBMS。

---- 用户使用自己的DBMS 数据库管理功能生成新的数据库模式后,就可以使用ODBC 来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC 的联机帮助。

---- 二.MFC 提供的ODBC 数据库类

---- Visual C++ 的MFC ......

阅读全文(1917) | 评论:0

VC数据库编程技术应用(2007-08-24 13:37:00)

摘要:您正在看的VC教程是:VC数据库编程技术应用。ADO C++ Extensions

  实际上,如果你是用C++进行应用程序开发的话,就应该使用ADO C++ Extensions。我们知道,在VB或者用VBScript来操作ADO的话,是非常方便的,但是如果使用C/C++或者是Java的话,就必须要处理类似VARIANTs这样的数据结构,实现和C++数据结构的转换,而这个无疑是所有C++开发人员都很头疼的事情。但如果你使用C++扩展的话, ADO不需要从数据提供者处得到列信息。ADO在设计时刻使用开发人员提供的列信息。以下是一个简单的示例:

  file://创建和具体记录相对应的类

  class CAuthor : public CADORecordBinding

  {

   BEGIN_ADO_BINDING(CCustomRs1)

   ADO_VARIABLE_LENGTH_ENTRY4(1, adVarChar, m_szau_id, sizeof(m_szau_id), FALSE)

   ADO_VARIABLE_LENGTH_ENTRY4(2,adVarChar,m_szau_fname,sizeof(m_szau_fname), FALSE)

   ADO_VARIABLE_LENGTH_ENTRY4(3,adVarChar,m_szau_lname,sizeof(m_szau_lname), FALSE)

   END_ADO_BINDING()

   protected:

   char m_szau_id[12];

   char m_szau_fname[21];

   char m_szau_lname[41];

  };
  void FetchAuthorData()

  {

   CAuthor author;

   _RecordsetPtr pRs; file://记录集对象

   IADORecordBinding *piAdoRecordBinding;
......

阅读全文(2991) | 评论:0

VC数据库编程(2007-08-24 13:33:00)

摘要:在使用VC开发应用软件的时候,经常需要进行数据库操作,可是VC操作数据库实在比较麻烦,而VB编制数据库软件却十分方便快捷,有什么办法可以让VC编制数据库软件也这么轻松呢?
  
  在工作中,本人需要从串口接收数据并保存到数据库中,如果直接由VC调用ADO组件进行数据库访问、操作,比较麻烦,因此我想利用VB使用ADO组件的方便以及微软的COM接口由VC调用VB完成任务,经过资料查找,发现大部分都是关于如何使用VC制作控件或者DLL后从VB进行调用的,很少关于VB制作ACTIVEX DLL由VC进行调用的文章,在此本人将结合实例说明如何用VB制作一个操作数据库的ACTIVEX DLL,再在VC调用该DLL,从而使得VC方便的使用ADO技术操作数据库。

  一、 制作VB数据库访问ACTIVEX DLL

  1、首先使用VB6.0创建一个心得ACTIVEX DLL工程,将工程命名为prjado、将类命名为clsado。

  2、为工程添加ADO对象库的引用。工程->引用:Microsoft ActiveX Data Objects2.0 Library

  3、为类增加两个新的变量:

Dim con As New ADODB.Connection '定义ADO会话连接对象
Dim cmd As New ADODB.Command '定义ADO命令对象

  4、增加初始化函数

Public Function ado_Init()
 con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=True;Data Source=sms.mdb"
 cmd.ActiveConnection = con
End Function

  建立到数据源的物理连接

  指定Command对象当前所属的 Connection 对象。

  5、数据库操作函数

Public Function ado_add(ByVal strdata As String)
 cmd.CommandText = "insert into ......

阅读全文(5000) | 评论:0

 WSAAsyncSelect模型(2007-08-21 16:51:00)

摘要: Winsock提供了一个有用的异步I / O模型。利用这个模型,应用程序可在一个套接字上, 接收以Windows消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用 WSAAsyncSelect函数。 异步通知,但不提供异步数据传送。异步数据传送有“重叠及完成端口模型提供”。 要想使用WSAAsyncSelect模型,在应用程序中,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口例程支持函数( Winproc)。亦可使用一个对话框,为其提供一个对话例程,而非窗口例程,因为对话框本质也是“窗口”。 int WSAAsyncSelect (    SOCKET s,    //要进行操作的SOCKET      HWND hWnd, //要绑写的窗口句柄(当事件发生后要接收消息的窗口)      unsigned int wMsg, //网络事件发生时的的消息响应 long lEvent //感兴趣的网络事件,请查阅MSDN ); 使用方法可分为: (1)初始化套接字相关信息: (2) 开始启动一个事件通知。WSAAsyncSelect(Sock, hWnd, 自定义消息, 网络事件) (3) 响应窗口的自定义消息处理函数, 其中lparam的高位字包含了可能出现的错误 代码,低字节表示发生的网络事件。wParam表示发生网络事件的套接字。 WSAGETSELECTERROR(lParam); //查看是否出现错误,获取低字节位 WSAGETSELECTEVENT(lParam); //查看发生了什么事件,获取高字节位 事件种类请查看MSDN,可用WSAGetLastError()来获取错误信息。 注意:多个事件必须一次注册完成,closesocketWSAAsyncSelect 优点:可在系统开销不大的情况下同时处理许多连接。 缺点:即使用不需要窗口(如服务器,控制台)它也不得不额外使用一个窗口。同时如果处理成千上万套接字的所有事件,性能可想而知。 MFC的CSocke......

阅读全文(7354) | 评论:0

基于Visual C++的Winsock API研究 (2007-08-21 11:27:00)

摘要: 基于Visual C++的Winsock API研究
 
 
    为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
微软为VC定义了 Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,读者朋友当然可以使用这些类来实现自己的网络程序,但是为了更好的了解Winsock API编程技术,我们这里探讨怎样使用底层的API函数实现简单的 Winsock 网络应用程式设计,分别说明如何在Server端和Client端操作Socket,实现基于TCP/IP的数据传送,最后给出相关的源代码。   在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。   1.WINSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。   2.WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。   3.WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。   一、服务器端操作 socket(套接字)   1)在初始化阶段调用WSAStartup()   此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程式中调用该函数的形式如下:WSAStartup((WORD)((1<<8|1),(LPWSADATA) &WSAData),其中(1<<8......

阅读全文(1847) | 评论:0

 Windows Socket API 运用心得体会(2007-08-21 10:52:00)

摘要: 本文是我在进行MS-Windows、HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。

一、WSAStartup函数
   int WSAStartup(
     WORD wVersionRequested,  
     LPWSADATA lpWSAData  
   );
    使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
例:假如一个程序要使用2.1版本的Socket,那么程序代码如下
           wVersionRequested = MAKEWORD( 2, 1 );
           err = WSAStartup( wVersionRequested, &wsaData );

二、WSACleanup函数
   int WSACleanup (void);
   应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库......

阅读全文(2614) | 评论:1