|
I experimented with that Friday night, and only the first byte copied over in strncpy. I think the 2nd byte bombed in the copy. The same thing happens when I pass the byte array to a function.
It must be the 2nd byte, so perhaps I need to cut off the header of the byte array, and then do the copy and pass.
|
|
|
|
|
You cannot use sizeof() in the function above, because the array size is not known at that point.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|
jkirkerx wrote: When I pass it to a function, the data is lost.
What does that mean exactly?
One possibility is that you are misusing the buffer. If so that has nothing to do with sockets nor with how you chose to process the data.
|
|
|
|
|
Only the first char in the byte array passed to the function. I suspect that the 2nd byte was the data size of the packet, and the 3 byte was used for some control purpose, or an extension of the 2nd byte or something.
So when I go the function I passed the data to, just the first byte is there 'T' or something. I think it was a 0x05.
I have it working now, so far so good, and it's not crashing yet. I ended up passing the data in a vector to the function.
|
|
|
|
|
Doesn't matter what the other data was.
What matters is that it was missing.
Some possible reasons
- You copied from one buffer to another incorrectly.
- You overwrote the original buffer
- You didn't have all the data in the buffer in the first place.
- You are indexing incorrectly in the processing stream.
|
|
|
|
|
I think it's just i no clear concept of c++, and I should buy one of those thick books on it.
|
|
|
|
|
Dear Friends
I have a mfc application which I already converted to a dll. now I want to launch that application from another win32 client application. So how I can achieve this. Any h elp would be highly appreciated.
check my code snippet.
//in App.h header
extern "C" __declspec(dllexport) void runAppli();
//in App.cpp
__declspec(dllexport) void runAppli(HWND hWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
}
//In the client console
int main(int argc, char **argv)
{
typedef void (*EntryPointfuncPtr)(int argc, const char * argv );
HINSTANCE LoadMe;
LoadMe = LoadLibrary(L"C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll");
if (LoadMe != 0)
printf("LoadMe library loaded!\n");
else
printf("LoadMe library failed to load!\n");
EntryPointfuncPtr LibMainEntryPoint;
LibMainEntryPoint = (EntryPointfuncPtr)GetProcAddress(LoadMe,"runAppli");
return 0;
}
I am not able to launch with this code. Please tell me whats going wrong... My application is appearing and disappearing from the screen.
Thanks a lot for any help. Sujan
|
|
|
|
|
sujandasmahapatra wrote: My application is appearing and disappearing from the screen.
when?
have you tried stepping through it in the debugger?
|
|
|
|
|
nothing is happening with debugger..its dll.....
appearing and disappearing....please give me some suggestion how can i launch the dll application from console client. Thanks a lot for comments. Thanks Sujan
|
|
|
|
|
|
That's hardly surprising since it's a console app trying to run a Windows DLL. you also seem to have a discrepancy between the definition of your runAppli() function and its implementation.
|
|
|
|
|
I am able to reduce the code to this much but still its crashing...
/////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
/* get handle to dll */
HINSTANCE hGetProcIDDLL = LoadLibrary(TEXT("C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll"));
/* get pointer to the function in the dll*/
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),"runAppli");
/*
Define the Function in the DLL for reuse. This is just prototyping the dll's function.
A mock of it. Use "stdcall" for maximum compatibility.
*/
typedef BOOL (* pICFUNC)(HINSTANCE, LPCSTR);
pICFUNC MyFunction=NULL;
///* The actual call to the function contained in the dll */
BOOL intMyReturnVal = MyFunction(HMODULE (hGetProcIDDLL), "runAppli");
/* Release the Dll */
FreeLibrary(hGetProcIDDLL);
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////
__declspec(dllexport) void runAppli()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
}
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
First point: please use <pre> tags around your code so that it is more readable.
Second point:
pICFUNC MyFunction=NULL;
BOOL intMyReturnVal = MyFunction(HMODULE (hGetProcIDDLL), "runAppli");
how do you expect a call to a NULL address not to crash?
|
|
|
|
|
Now I am writing like this.
int main(int argc, char **argv)
{
/* get handle to dll */
HINSTANCE hGetProcIDDLL = LoadLibrary(TEXT("C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll"));
typedef BOOL (* pICFUNC)(HINSTANCE, LPCSTR);
pICFUNC lpfnGetProcessID = (pICFUNC)GetProcAddress((HMODULE) hGetProcIDDLL,"runAppli");
///* The actual call to the function contained in the dll */
BOOL intMyReturnVal = lpfnGetProcessID((HMODULE) hGetProcIDDLL, "runAppli");
/* Release the Dll */
FreeLibrary(hGetProcIDDLL);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL __declspec(dllexport) runAppli(HWND hwnd, LPCSTR lpAppName)
{
// Only needed if resources are accessed
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
::ShowWindow(hwnd, SW_SHOW);
UNREFERENCED_PARAMETER(lpAppName);
return true;
}
Somebody suggested this piece of code. But nothing is appearing with this. My mainwindow of the dll application is not coming.
Can u tell me whats wrong still in this. Thanks a lot for your help. Sujan
|
|
|
|
|
LoadLibrary[^] returns a HMODULE , not HINSTANCE . Alter the DLL loading to look like this:
HMODULE hDll = LoadLibrary(_T("C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll"));
Secondly, lose the cast like this (since you're now using the correct type above):
typedef BOOL (*PFUNC)(HINSTANCE, LPCSTR);
PFUNC pProc = (PFUNC)GetProcAddress(hDll, "runAppli");
Note also that I've added a _T (same as TEXT ) which you left out.
Now a guess at the cause of your problems: GetProcAddress[^] is failing because you're using the wrong function name by ignoring name mangling[^]. Change the DLL like this:
extern "C" BOOL __declspec(dllexport) runAppli(HWND hwnd, LPCSTR lpAppName)
Steve
modified 23-Oct-11 6:01am.
|
|
|
|
|
With this even its not happening stephen...
_T is not compiling so I have put only the text. its compiling
Now the code looks like this..
int main(int argc, char **argv)
{
/* get handle to dll */
HMODULE hDll = LoadLibrary(TEXT("C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll"));
typedef BOOL (* ICFUNC)(HINSTANCE, LPCSTR);
ICFUNC lpfnGetProcessID = (ICFUNC)GetProcAddress(hDll, "runAppli");
///* The actual call to the function contained in the dll */
BOOL intMyReturnVal = lpfnGetProcessID(hDll, "runAppli");
/* Release the Dll */
FreeLibrary(hDll);
return 0;
}
extern "C" BOOL __declspec(dllexport) runAppli(HWND hwnd, LPCSTR lpAppName)
{
// Only needed if resources are accessed
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
::ShowWindow(hwnd, SW_SHOW);
UNREFERENCED_PARAMETER(lpAppName);
return true;
}
|
|
|
|
|
sujandasmahapatra wrote: With this even its not happening stephen...
_T is not compiling so I have put only the text. its compiling
Yeah, I was wrong on that point. You don't use _T on GetProcAddress . I have modified my post to reflect this.
So it works now?
Steve
|
|
|
|
|
Now the code is looking like this ....But still application is not launching.
int main(int argc, char **argv)
{
/* get handle to dll */
HMODULE hDll = LoadLibrary(TEXT("C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll"));
typedef BOOL (* ICFUNC)(HINSTANCE, LPCSTR);
ICFUNC lpfnGetProcessID = (ICFUNC)GetProcAddress(hDll, "runAppli");
///* The actual call to the function contained in the dll */
BOOL intMyReturnVal = lpfnGetProcessID(hDll, "runAppli");
/* Release the Dll */
FreeLibrary(hDll);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
extern "C" BOOL __declspec(dllexport) runAppli(HWND hwnd, LPCSTR lpAppName)
{
// Only needed if resources are accessed
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
::ShowWindow(hwnd, SW_SHOW);
UNREFERENCED_PARAMETER(lpAppName);
return true;
}
|
|
|
|
|
Why are you passing a HMODULE when a HWND is expected?
sujandasmahapatra wrote: BOOL intMyReturnVal = lpfnGetProcessID(hDll, "runAppli");
sujandasmahapatra wrote: extern "C" BOOL __declspec(dllexport) runAppli(HWND hwnd, LPCSTR lpAppName)
Steve
|
|
|
|
|
With this even its not launching the application. simply returning. dll application is not launching. some more things are missing it seems. Please let me know if you're able to figure it out. Thanks for your help sujan
|
|
|
|
|
typedef BOOL (* ICFUNC)(HINSTANCE, LPCSTR);
ICFUNC lpfnGetProcessID = (ICFUNC)GetProcAddress(hDll, "runAppli");
///* The actual call to the function contained in the dll */
BOOL intMyReturnVal = lpfnGetProcessID(hDll, "runAppli");
lpfnGetProcessID expects a HMODULE right...? Is it wrong. ??
|
|
|
|
|
How can I get the handle from the client console and pass it to the lpfnGetProcessID .... to runAppli....With the code below I am getting run-time error. that hwnd being used without being intialized.. Please tell me how can I initialize hwnd. Thanks Sujan
int main(int argc, char **argv)
{
HWND hwnd;
/* get handle to dll */
HMODULE hDll = LoadLibrary(TEXT("C:\\Users\\DasmahapatraS\\Projects\\Bhagavan_Cadem\\RevolutionProj\\debug\\RevolutionProj.dll"));
typedef BOOL (* ICFUNC)(HWND, LPCSTR);
ICFUNC lpfnGetProcessID = (ICFUNC)GetProcAddress(hDll, "runAppli");
///* The actual call to the function contained in the dll */
BOOL intMyReturnVal = lpfnGetProcessID(hwnd, "runAppli");
/* Release the Dll */
FreeLibrary(hDll);
return 0;
}
|
|
|
|
|
You're not explaining yourself very clearly but it sounds like you might be after the GetConsoleWindow function.
Steve
|
|
|
|
|
extern "C" BOOL __declspec(dllexport) runAppli(HWND hwnd, LPCSTR lpAppName)
{
// Only needed if resources are accessed
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
::ShowWindow(hwnd, SW_SHOW);
UNREFERENCED_PARAMETER(lpAppName);
return true;
}
So I need to pass hwnd to this function right..? Is it necessary to launch my dll application. I just want to launch the application.
|
|
|
|
|
Why don't you explain exactly what you are trying to do?
Steve
|
|
|
|