"creative22" <creative22@discussions.microsoft.com> ha scritto nel messaggio
news:9FF91E76-2175-420F-802A-851B696ADC4B@microsoft.com...
[...]
Could I ask you tell me what the problem is with this code?
Any help would be greatly appreciated,
In addition to other answers, I tried rewriting your code to try to show the
use of robust container classes like std::vector and CString class to store
strings.
I did some modifications to original code, e.g.:
* The 'buff' struct is not required at DLL interface, so I moved it away
from public DLL header and put it in private DLL implementation file
(DlgInDLL.cpp)
* I rewrote the 'buff' struct storing an array of CString's inside, instead
of the unique string with \0 termination of substrings plus explicit size
field.
In this way you make the code simpler because you don't need complex and
error-prone parsing code.
Moreover, you make your life easier using robust container and string
classes instead of TCHAR* raw pointers.
* I rewrote the DLL import/export #define
* I tried to indent the code a bit better (I think that code indentation is
a very important point of quality code)
You can find the new project here:
http://www.geocities.com/giovanni.dicanio/vc/DlgInDLL.zip
The source (DlgInDLL.cpp) and header (DlgInDLL.h) files of the DLL are also
copied below.
HTH,
Giovanni
[DlgInDLL.cpp]
//////////////////////////////////////////////////////////////////////////
// DlgInDLL.cpp
//////////////////////////////////////////////////////////////////////////
// Export from DLL
#define DLGINDLL_API __declspec(dllexport)
#include <windows.h> // Win32 SDK
#include <vector> // STL vector
#include <atlstr.h> // CString
#include "DlgInDLL.h" // DLL public header
#include "resource.h"
struct Buff
{
// List of strings to fill the combobox with
std::vector< CString > Strings;
// The string chosen by the user
CString UserChoice;
};
// DLL instance handle
static HINSTANCE g_hModule = NULL;
//------------------------------------------------------------------------
// DllMain
//------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hinstDLL);
g_hModule = hinstDLL;
}
return TRUE;
}
//------------------------------------------------------------------------
// Dialog-box procedure - handles messages
//------------------------------------------------------------------------
BOOL CALLBACK SecondDlgProc(HWND hwndDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
// Store 'buf' parameter when WM_INITDIALOG is called.
// This is used to exchange data with caller function.
static Buff * buff = NULL;
switch (message)
{
case WM_INITDIALOG:
//
// *** Dialog Initialization ***
//
// Save buffer pointer
buff = reinterpret_cast<Buff *>( lParam );
// Clear contents of the combobox
SendDlgItemMessage(hwndDlg, IDC_COMBO1, CB_RESETCONTENT, 0, 0);
// Add strings to combobox
for (size_t i = 0; i < buff->Strings.size(); i++)
{
SendDlgItemMessage(
hwndDlg,
IDC_COMBO1,
CB_ADDSTRING,
0,
(LPARAM) buff->Strings[i].GetString()
);
}
return TRUE;
case WM_COMMAND:
if ( LOWORD (wParam) == IDOK )
{
//
// *** OK Button Pressed ***
//
//
// Get current selection
//
int index = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO1,
CB_GETCURSEL, 0, 0);
int length = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO1,
CB_GETLBTEXTLEN, index, 0) + 1 ;
if (length > 0)
{
std::vector<TCHAR> readerName(length);
SendDlgItemMessage(hwndDlg, IDC_COMBO1, CB_GETLBTEXT, index,
(LPARAM) (&readerName[0]) );
// Store it in string class
buff->UserChoice = &readerName[0];
}
else
{
// Empty string
buff->UserChoice = _T("");
}
EndDialog( hwndDlg, TRUE );
return TRUE ;
}
else if ( LOWORD (wParam) == IDCANCEL )
{
//
// *** Cancel Button Pressed ***
//
EndDialog( hwndDlg, FALSE );
return TRUE;
}
break;
}
return FALSE;
}
//------------------------------------------------------------------------
// Function exported by the DLL
//------------------------------------------------------------------------
DLGINDLL_API void WINAPI SecondFunction(void)
{
// Create buff struct on the heap
Buff * buff = new Buff();
// Fill the list of strings
buff->Strings.push_back(TEXT("ACS READER 0"));
buff->Strings.push_back(TEXT("ACS READER 1"));
buff->Strings.push_back(TEXT("ACS READER 2"));
// Show the dialog-box
if( DialogBoxParam(
g_hModule,
MAKEINTRESOURCE(IDD_DIALOG2),
NULL,
SecondDlgProc,
reinterpret_cast<LPARAM>(buff)) )
{
// Show the selected string to the user
CString msg;
msg.Format(_T("The value of reader is %s."),
buff->UserChoice.GetString());
MessageBox( NULL, msg, TEXT("Note"), MB_OK );
MessageBox( NULL, TEXT("The Second Function Succeeded."), NULL,
MB_OK);
}
else
{
MessageBox( NULL, TEXT("The Second Function Failed."), NULL,
MB_OK|MB_ICONERROR);
}
// Delete Buff structure
delete buff;
buff = NULL;
}
--------------------------------------------------------------------------
[DlgInDLL.h]
//////////////////////////////////////////////////////////////////////////
// DlgInDLL.h
//////////////////////////////////////////////////////////////////////////
#ifndef DLGINDLL_H
#define DLGINDLL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef DLGINDLL_API
#define DLGINDLL_API __declspec(dllimport)
#endif /* DLGINDLL_API */
DLGINDLL_API void WINAPI SecondFunction(void);
#ifdef __cplusplus
}; /* extern C */
#endif
#endif /* DLGINDLL_H */
--------------------------------------------------------------------------