Jump to content
The simFlight Network Forums

zea

new Members
  • Posts

    4
  • Joined

  • Last visited

Everything posted by zea

  1. Thank you so much, Pete. Then I will only compile 32-bit apps. zea
  2. Thank you Pete. I am sorry for my late reply, I've been away from my computer for several days. Yes, I am trying to compile in 64-bit mode, and the same code runs pretty good in 32-bit mode. I just tried 0xFFFFFFFFFFFFFFFF, and m_hMap gets 64, while in 32-bit mode it should be 96. And after several lines, the program goes wrong again . The error message is "Unhanled exception at 0x5168b3d9(msvcr100d.dll) in test.exe: 0xC0000005: Access violation writing location 0x0000000139800004." here are part of the codes, and I have added comments. // create the file-mapping object m_hMap = CreateFileMapping( (HANDLE)0xFFFFFFFFFFFFFFFF, // use system paging file NULL, // security PAGE_READWRITE, // protection 0, MAX_SIZE+256, // size szName); // name //============m_hMap get 64, diffrent from 96 in 32-bit mode.============ if ((m_hMap == 0) || (GetLastError() == ERROR_ALREADY_EXISTS)) { *pdwResult = FSUIPC_ERR_MAP; FSUIPC_Close(); return FALSE; } // get a view of the file-mapping object m_pView = (BYTE*)MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0); // m_pView is different every time I run it. an example value is 1638400 if (m_pView == NULL) { *pdwResult = FSUIPC_ERR_VIEW; FSUIPC_Close(); return FALSE; } // Okay, now determine FSUIPC version AND FS type m_pNext = m_pView; // Try up to 5 times with a 100mSec rest between each // Note that WideClient returns zeroes initially, whilst waiting // for the Server to get the data while ((i++ < 5) && ((FSUIPC_Version == 0) || (FSUIPC_FS_Version == 0))) { // Read FSUIPC version if (!FSUIPC_Read(0x3304, 4, &FSUIPC_Version, pdwResult)) { FSUIPC_Close(); return FALSE; } // and FS version and validity check pattern if (!FSUIPC_Read(0x3308, 4, &FSUIPC_FS_Version, pdwResult)) { FSUIPC_Close(); return FALSE; } // Write our Library version number to a special read-only offset // This is to assist diagnosis from FSUIPC logging // But only do this on first try if ((i < 2) && !FSUIPC_Write(0x330a, 2, &FSUIPC_Lib_Version, pdwResult)) { FSUIPC_Close(); return FALSE; } //========================= the code goes wrong below ====================== // Actually send the requests and get the responses ("process") if (!FSUIPC_Process(pdwResult)) { FSUIPC_Close(); return FALSE; } // Maybe running on WideClient, and need another try Sleep(100); // Give it a chance } The error is in the function BOOL FSUIPC_Process(DWORD *pdwResult). part of the code are below. BOOL FSUIPC_Process(DWORD *pdwResult) { DWORD dwError; DWORD *pdw; FS6IPC_READSTATEDATA_HDR *pHdrR; FS6IPC_WRITESTATEDATA_HDR *pHdrW; int i = 0; if (!m_pView) { *pdwResult = FSUIPC_ERR_NOTOPEN; return FALSE; } if (m_pView == m_pNext) { *pdwResult = FSUIPC_ERR_NODATA; return FALSE; } ZeroMemory(m_pNext, 4); // Terminator m_pNext = m_pView; // send the request (allow up to 9 tries) while ((++i < 10) && !SendMessageTimeout( m_hWnd, // FS6 window handle m_msg, // our registered message id m_atom, // wParam: name of file-mapping object 0, // lParam: offset of request into file-mapping obj SMTO_BLOCK, // halt this thread until we get a response 2000, // time out interval &dwError)) // return value { Sleep(100); // Allow for things to happen } if (i >= 10) // Failed all tries? { *pdwResult = GetLastError() == 0 ? FSUIPC_ERR_TIMEOUT : FSUIPC_ERR_SENDMSG; return FALSE; } if (dwError != FS6IPC_MESSAGE_SUCCESS) { *pdwResult = FSUIPC_ERR_DATA; // FSUIPC didn't like something in the data! return FALSE; } // Decode and store results of Read requests pdw = (DWORD *) m_pView; while (*pdw) { switch (*pdw) { case FS6IPC_READSTATEDATA_ID: pHdrR = (FS6IPC_READSTATEDATA_HDR *) pdw; m_pNext += sizeof(FS6IPC_READSTATEDATA_HDR); if (pHdrR->pDest && pHdrR->nBytes) CopyMemory(pHdrR->pDest, m_pNext, pHdrR->nBytes); //=========== Visual Studio breaks in the next line.==================== m_pNext += pHdrR->nBytes; break; case FS6IPC_WRITESTATEDATA_ID: // This is a write, so there's no returned data to store pHdrW = (FS6IPC_WRITESTATEDATA_HDR *) pdw; m_pNext += sizeof(FS6IPC_WRITESTATEDATA_HDR) + pHdrW->nBytes; break; default: // Error! So terminate the scan *pdw = 0; break; } ... Thanks! zea
  3. Thank you for your reply. I use printf() to display the value of szName and GetLastError(). szName is "FsasmLib:IPC:1AC0:1" . Note that "1AC0" changes every time I run the plugin. GetLastError() returns 6. I am not sure whether related code is helpful because it is just part of the FSUIPC demo. I put it below and I have added comment where my program failed. BOOL FSUIPC_Open(DWORD dwFSReq, DWORD *pdwResult) { char szName[MAX_PATH]; static int nTry = 0; BOOL fWideFS = FALSE; int i = 0; // abort if already started if (m_pView) { *pdwResult = FSUIPC_ERR_OPEN; return FALSE; } // Clear version information, so know when connected FSUIPC_Version = FSUIPC_FS_Version = 0; // Connect via FSUIPC, which is known to be FSUIPC's own // and isn't subject to user modificiation m_hWnd = FindWindowEx(NULL, NULL, "UIPCMAIN", NULL); if (!m_hWnd) { // If there's no UIPCMAIN, we may be using WideClient // which only simulates FS98 m_hWnd = FindWindowEx(NULL, NULL, "FS98MAIN", NULL); fWideFS = TRUE; if (!m_hWnd) { *pdwResult = FSUIPC_ERR_NOFS; return FALSE; } } // register the window message m_msg = RegisterWindowMessage(FS6IPC_MSGNAME1); if (m_msg == 0) { *pdwResult = FSUIPC_ERR_REGMSG; return FALSE; } // create the name of our file-mapping object nTry++; // Ensures a unique string is used in case user closes and reopens wsprintf(szName, FS6IPC_MSGNAME1 ":%X:%X", GetCurrentProcessId(), nTry); // stuff the name into a global atom m_atom = GlobalAddAtom(szName); if (m_atom == 0) { *pdwResult = FSUIPC_ERR_ATOM; FSUIPC_Close(); return FALSE; } // create the file-mapping object m_hMap = CreateFileMapping( (HANDLE)0xFFFFFFFF, // use system paging file NULL, // security PAGE_READWRITE, // protection 0, MAX_SIZE+256, // size szName); // name //=====================The function above returns 0, as a result the connection fail.=============== if ((m_hMap == 0) || (GetLastError() == ERROR_ALREADY_EXISTS)) { *pdwResult = FSUIPC_ERR_MAP; FSUIPC_Close(); return FALSE; } ... } Best regards, zea
  4. Dear Pete, I am now on a project that automantically switch channel in TeamSpeak3(TS3) according to the COM1 frequncy in FS2004. TS3 offers a SDK that can easily build a plugin(DLL file) for it. Based on the TS3 SDK demo, I added FSUIPC related files , but I failed to connect to the FSUIPC: FSUIPC_Open() returned False. I debuged it, and found that in FSUIPC_Open(), m_hMap = CreateFileMapping( (HANDLE)0xFFFFFFFF, // use system paging file NULL, // security PAGE_READWRITE, // protection 0, MAX_SIZE+256, // size szName); m_hMap got 0. But in FSUIPC demo, it should be 96. I am wondering what kind of modificatiosn should be done to my code so it can connect to FSUIPC . kind regards, zea
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use. Guidelines Privacy Policy We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.