|
Oh. By Visual Studio.NET you mean VC++7.0 and I thought you meant managed code. Well, I create an unmanaged add-in in VC++7.0 the same way I create it in VC++6.0 and it works fine. Have you imported the correct type libraries?
---
Hakuna-Matada
It means no worries for the rest of your days...
It's our problem free, Philosophy
<marquee behavior="alternate" scrollamount="5" scrolldelay="50">
|
|
|
|
|
The question is as the title. I want to know where can I find the instruction
about this aspect. thank you!
|
|
|
|
|
hi !
I am facing a problem loading a DLL file in client application. I am using a LoadLibrary() function to load a dll file. The problem is that ; load library does not return NULL. I cheked this using value of the handle its returning. But getLastError gives error code 6 :: "Invalid Handle".
I checked the path several times. There is no problem in path for sure.
I dont know where i am goin wrong??
Plz help me out.
I am posting my code here
NewDll.cpp (win32 DLL project)
#include "stdafx.h"
HINSTANCE gl_hModule = NULL;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
gl_hModule = (HINSTANCE)hModule;
break;
}
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
return TRUE;
}
}
void getString(HINSTANCE hInst)
{
char load_str[80];
LoadString(hInst,1,load_str,80);
MessageBox(NULL,load_str,"STring Retrieved",NULL);
}
TestDllDlg.cpp( Client app , I am loadin dll in OnOK() function just to test)
[code]
#include "stdafx.h"
#include "TestDll.h"
#include "TestDllDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
typedef void (*MYAPP)(HINSTANCE);
MYAPP gets1=NULL;
HINSTANCE ghInst =NULL;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
CTestDllDlg::CTestDllDlg(CWnd* pParent )
: CDialog(CTestDllDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestDllDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTestDllDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
BOOL CTestDllDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
return TRUE;
}
void CTestDllDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CTestDllDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CTestDllDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTestDllDlg::OnOK()
{
HMODULE hMod ;
BOOL bRes;
ghInst= LoadLibrary("F:\\MyProjects2\\NewDll\\Debug\\NewDll.dll");
if(ghInst==NULL)
{
MessageBox("CANT LOAD THE LIBRARY","ER0ROR",NULL);
}
gets1 = (MYAPP) GetProcAddress(ghInst,"getString");
HINSTANCE tempInst=GetModuleHandle(NULL);
(*gets1)(tempInst);
bRes = FreeLibrary(hMod);
CDialog::OnOK();
}
|
|
|
|
|
And what is the problem exactly ? If the function returns a valid handle, you can use, you only need to check GetLastError when there is a problem. Can you retrieve successfully the function address ?
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
>>Can you retrieve successfully the function address ?
Thats the problem buddy!
It cant retrive function address! gives me error 126::procedure not found!!
And it must be because of invalid handle!!
|
|
|
|
|
sach!! wrote: Can you retrieve successfully the function address ?
Thats the problem buddy!
It cant retrive function address! gives me error 126::procedure not found!!
The procedure not found is due to C++ compiler mangles the function names...
So you use to define the function using C-style like extern "C" etc.
Knock out 't' from can't,
You can if you think you can
|
|
|
|
|
sach!! wrote: And it must be because of invalid handle!!
Why ? It can also simply be that you misspelled the function name for example.
Did you compile your dll with a definition file (.def file) ? I think this is required in order to be able to retrieve the function names without knowing their decorated names. Or, pass the decorated name of the function when calling GetProcAddress.
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
It seems not problem in your code if you get a handle with LoadLibrary
whitesky
|
|
|
|
|
Why is the "return TRUE; " in the switch statement? It should look like this:
BOOL APIENTRY DllMain(
HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
gl_hModule = reinterpret_cast<HINSTANCE>(hModule);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Steve
|
|
|
|
|
You really went through that entire code section. How good..
You have an apple and me too. We exchange those and We have an apple each.
You have an idea and me too. We exchange those and We have two ideas each.
|
|
|
|
|
I only had a superficial look but that error jumped out at me.
Steve
|
|
|
|
|
Thx a lot Steve!
That solved my problem . Error code 6 is still there but i am getting procedure address. Now Its giving me error 1814 resource not fount .
what the!!!?
|
|
|
|
|
Can you attach the code where the error occurs?
Steve
|
|
|
|
|
thanks guys!
Thanks steve!
Problem is resolved now. The problem was with my .RC file.
Thx!
|
|
|
|
|
sach!! wrote: void getString(HINSTANCE hInst)
Has this function been exported?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Can we owner draw the scroll bar of a combobox?
how we can manage it?
SaRath.
"It is your attitude, not your aptitude, that determines your altitude - Zig Ziglar."
My Blog | Understanding State Pattern in C++
|
|
|
|
|
|
plz tell me
dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(1);
when i rty this to create modeless dialog box after one try it will create error as assertion failureplz
Ashish Dogra
MCA
Noida
-- modified at 1:33 Thursday 29th June, 2006
|
|
|
|
|
yes because you create your dialog and you dont need to create again
whitesky
|
|
|
|
|
sir i will try to create it again after cancelling it
but sir as with domaodal() we can try again after cancelling it it will not give any error
Ashish Dogra
MCA
Noida
|
|
|
|
|
|
even i use this i will still not solve the problem
CMy dlg;
dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(1);
please tell me some example
Ashish Dogra
MCA
Noida
|
|
|
|
|
ashish dogra wrote: CMy dlg;
dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(1);
Whats problem with this code
whitesky
|
|
|
|
|
sir
the problem is that when i run application the modeless dialog box open a screen after clicking on ok button of fiest dialog box
but when i cancel the modeless dialog and again click on ok button of first dialog box then it will give an assertion error and does not create modeless dialog box again
plz sovle this one
Ashish Dogra
MCA
Noida
|
|
|
|
|
Can you show how to use and you show your code that has error
whitesky
|
|
|
|