Fortran Coder

查看: 5501|回复: 4
打印 上一主题 下一主题

[绘图界面库] win32 api 界面转x64异常

[复制链接]

17

帖子

8

主题

0

精华

熟手

F 币
120 元
贡献
65 点
跳转到指定楼层
#
发表于 2018-6-11 15:04:33 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
小弟最近想把之前的一个程序代码从win32转到x64平台,但是出现了如下的问题,软件的源码太多了,贴出错误的部分,希望大佬能指点一下,万分感谢


1212121.png (7.3 KB, 下载次数: 252)

1212121.png

2121212.png (9.78 KB, 下载次数: 249)

2121212.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
地板
发表于 2018-6-12 15:48:30 | 只看该作者
你这段代码根本没有考虑 64 位的兼容性。
考虑了兼容性的代码大概形如:
[Fortran] 纯文本查看 复制代码
01function WinMain(hInstance,hPrevInstance,lpszCmdLine,nCmdShow )
02!DEC$ IF DEFINED(_X86_)
03!DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain
04!DEC$ ELSE
05!DEC$ ATTRIBUTES STDCALL, ALIAS : 'WinMain' :: WinMain
06!DEC$ ENDIF   
07    use user32
08    use kernel32
09    use dfwin
10    use dflogm       
11    implicit none
12    integer(SINT) :: WinMain
13    integer(HANDLE) hInstance
14    integer(HANDLE) hPrevInstance
15    integer(LPWSTR) lpszCmdLine
16    integer(SINT)   nCmdShow

其中,类似注释那部分告诉编译器,根据 X86 或 X64 分别指定WinMain的属性。

    integer(SINT) :: WinMain
    integer(HANDLE) hInstance
    integer(HANDLE) hPrevInstance
    integer(LPWSTR) lpszCmdLine
    integer(SINT)   nCmdShow
这些定义中,括号里的内容,比如 HANDLE,会自动在32位下选择为 4,而在64位下选择为8。

17

帖子

8

主题

0

精华

熟手

F 币
120 元
贡献
65 点
板凳
 楼主| 发表于 2018-6-12 14:51:55 | 只看该作者
kyra 发表于 2018-6-11 18:25
需要给出更多的代码,比如 hInstance 的定义。
你也可以简化你的代码,把绝大多数不必要的去掉,能重现问题 ...

您好,主要就是这段代码的91行wc%hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICONN)) ,126行ghMenu = LoadMenu(hInstance, LOC(lpszMenuName)),128行haccel = LoadAccelerators(hInstance, LOC(lpszAccelName))。就是会报There is no matching specific function for this generic function reference.   [LOADICON]这样的错误,就是这一类错误大概在这段代码还有好几个,我在win32环境下运行没问题,但是换到x64就出问题了,我查了一下这些好像都是Windows的API函数,但是我不知道怎么修改,希望您能指点一下,谢谢

17

帖子

8

主题

0

精华

熟手

F 币
120 元
贡献
65 点
沙发
 楼主| 发表于 2018-6-12 14:51:17 | 只看该作者
[Fortran] 纯文本查看 复制代码
001integer*4 function WinMain(hInstance,hPrevInstance,lpszCmdLine,nCmdShow )
002    use user32
003    use kernel32
004    use dfwin
005    use ChiGlo
006    use dflogm 
007    implicit none
008    integer*4 hInstance
009    integer*4 hPrevInstance
010    integer*4 lpszCmdLine
011    integer*4 nCmdShow
012    include 'resource.fd'
013    include 'Chi.fi'  
014    ! Variables
015    type (T_WNDCLASS)       wc
016    type (T_MSG)            mesg
017    TYPE (T_RECT)           rects
018    integer*4               ret,mwidth
019    logical*4               lret
020    integer                 haccel
021    character(SIZEOFAPPNAME) lpszClassName
022    character(SIZEOFAPPNAME) lpszLeftClassName
023    character(SIZEOFAPPNAME) lpszRightClassName
024    character(SIZEOFAPPNAME) lpszInputClassName
025    character(SIZEOFAPPNAME) lpszDisClassName
026    character(SIZEOFAPPNAME) lpszIconName
027    character(SIZEOFAPPNAME) lpszAppName
028    character(SIZEOFAPPNAME) lpszMenuName
029    character(SIZEOFAPPNAME) lpszAccelName
030    character(SIZEOFAPPNAME) lpszMDIClassName
031    character(SIZEOFAPPNAME) lpszMDITextClassName
032    character(SIZEOFAPPNAME) lpszMDIMenuName
033    !
034    external LeftDlgProcSub
035    external ChangeTabSub
036    external ContourSub
037    external cntrSelSub
038    external PhaseSpaceSub
039    external PhasSelSub
040    external VectorSub
041    external VectSelSub
042    external RangeSub
043    external RangSelSub
044    external ObserverSub
045    external ObseSelSub
046    external DisplaySub
047    external DispSelSub
048    external ButtonRunSub
049    external ButtonNextSub
050    external ButtonTileSub
051    external ButtonPauSub
052    external ButtonDevSub
053    external ButtonTmPlotSub
054    external ButtonStopSub
055    external ButtonGridSub
056    external ButtonObsLocSub
057    external ButtonRefeSub
058  
059    external ObseComboSub
060    external CntrComboSub
061    external VectComboSub
062    external PhasComboSub
063    external RangComboSub
064    !
065    gBfcnt=0
066    gZoomRd=.FALSE.
067    gZoomIn=.FALSE.
068    ghInstance = hInstance
069    ghModule = GetModuleHandle(NULL)
070    ghwndMain = NULL
071    !
072    lpszClassName ="Chi"C
073    lpszLeftClassName ="ChiLeft"C
074    lpszRightClassName ="ChiRight"C
075    lpszInputClassName ="ChiInput"C
076    lpszDisClassName ="Chiis"C
077  !
078    lpszMDIClassName ="Chip"C
079    lpszMDITextClassName ="ChiText"C
080    lpszAppName ="CPic3dp"C
081    lpszIconName ="CP3DP"
082    lpszMenuName ="Chipic3d"C
083    lpszAccelName ="Chipic3d"C
084 
085    if (hPrevInstance .eq. 0) then
086        !  Main window
087         wc%lpszClassName = LOC(lpszClassName)
088         wc%lpfnWndProc = LOC(MainWndProc)
089         wc%style = CS_OWNDC
090         wc%hInstance = hInstance
091         wc%hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICONN)) !LoadIcon( hInstance, LOC(lpszIconName))
092         wc%hCursor = LoadCursor( NULL, IDC_ARROW )
093         wc%hbrBackground = ( COLOR_WINDOW+1 )
094         wc%lpszMenuName = NULL
095         wc%cbClsExtra = 0
096         wc%cbWndExtra = 4
097         if (RegisterClass(wc) == 0) goto 99999    
098        !  Open input dlg
099         wc%lpszClassName = LOC(lpszInputClassName)
100         wc%lpfnWndProc = LOC(InputDisOpen)
101        !  input dis text
102         wc%lpszClassName = LOC(lpszDisClassName)
103         wc%lpfnWndProc = LOC(InputDisText)   
104        !  right Child window
105         wc%lpszClassName = LOC(lpszRightClassName)
106         wc%lpfnWndProc = LOC(RightWndProc)
107         if (RegisterClass(wc) == 0) goto 99999
108        !  MDI Child window
109         wc%lpszClassName = LOC(lpszMDIClassName)
110         wc%lpfnWndProc = LOC(MDIWndProc)
111         if (RegisterClass(wc) == 0) goto 99999
112        !  Text window (child of MDI Child window)
113         wc%lpszClassName = LOC(lpszMDITextClassName)
114         wc%lpfnWndProc = LOC(TextWndProc)
115         wc%style = IOR(CS_OWNDC, IOR(CS_HREDRAW, CS_VREDRAW))
116         wc%hIcon = NULL
117         wc%hbrBackground = ( COLOR_BTNSHADOW )
118         if (RegisterClass(wc) == 0) goto 99999
119         !  Left Child window
120         wc%lpszClassName = LOC(lpszLeftClassName)
121         wc%lpfnWndProc = LOC(LeftWndProc)
122         if (RegisterClass(wc) == 0) goto 99999
123    end if
124    !
125    !Load the window's menu and accelerators and create the window
126    ghMenu = LoadMenu(hInstance, LOC(lpszMenuName))
127    if (ghMenu == 0) goto 99999
128    haccel = LoadAccelerators(hInstance, LOC(lpszAccelName))
129    if (haccel == 0) goto 99999
130    ! Load the child window's menu
131    !
132    lpszMDIMenuName = "ChiChild"C
133    ghChildMenu = LoadMenu(hInstance, LOC(lpszMDIMenuName))
134    if (ghMenu == 0) goto 99999
135    ghMenuWindow = GetSubMenu(ghMenu, 1)
136    ghChildMenuWindow = GetSubMenu(ghChildMenu, 2)
137  ghwndMain = CreateWindowEx(  0, lpszClassName,lpszAppName,IOR(WS_OVERLAPPED, IOR(WS_CAPTION, IOR(WS_BORDER,     &
138       IOR(WS_THICKFRAME, IOR(WS_MAXIMIZEBOX, IOR(WS_MINIMIZEBOX,IOR(WS_CLIPCHILDREN,                             &
139       IOR(WS_VISIBLE, WS_SYSMENU)))))))),50,50,800,600,NULL,ghMenu,hInstance,NULL)
140    if (ghwndMain == 0) goto 99999
141    lret = ShowWindow( ghwndMain, SW_SHOWMAXIMIZED )
142  Lret = GetClientRect (ghwndMain, rects)
143  glleftpos=rects%left
144  gltoppos=rects%top
145  mwidth=rects%right-rects%left
146  glwidth=mwidth*0.155
147  glhight=abs(rects%top-rects%bottom)
148  !
149    ghwndLeft = CreateWindowEx(  0, lpszLeftClassName,lpszAppName,IOR(WS_CHILD, IOR(WS_BORDER,WS_VISIBLE)),       &
150                                 glleftpos,gltoppos,glwidth,glhight,ghwndMain,NULL,hInstance,NULL)
151    if (ghwndLeft == 0) goto 99999
152   
153  lret = DlgInit(IDD_LEFT_DLG, gdlg)
154  lret = DlgSetSub(gdlg, IDD_LEFT_DLG, LeftDlgProcSub)
155  lret = DlgSetSub(gdlg, IDC_TAB, ChangeTabSub)
156  ! lret = DlgSetSub(gdlg, IDC_BUTRUN, ButtonRunSub)
157  ! lret = DlgSetSub(gdlg, IDC_BUTSTOP, ButtonStopSub)
158  ! lret = DlgSetSub(gdlg, IDC_BUTGRID, ButtonGridSub)
159  ! lret = DlgSetSub(gdlg, IDC_BUTOBSLOC, ButtonObsLocSub)
160  lret = DlgSetSub(gdlg, IDC_BUTNEXT, ButtonNextSub)
161  lret = DlgSetSub(gdlg, IDC_BUTTONPPU, ButtonTileSub)
162  lret = DlgSetSub(gdlg, IDC_BUTTONREF, ButtonRefeSub)
163  !
164  !lret = DlgSetSub(gdlg, IDC_BUTPAUSE, ButtonPauSub)
165  lret = DlgSetSub(gdlg, IDC_BUTDEVICE, ButtonDevSub)
166  ! lret = DlgSetSub(gdlg, IDC_BUTTMPLOT, ButtonTmPlotSub)
167  !  Set initial tabs
168  lret = DlgSet(gdlg, IDC_TAB, 7)
169  lret = DlgSet(gdlg, IDC_TAB, "*****", 1)
170  lret = DlgSet(gdlg, IDC_TAB, "*****", 2)
171  lret = DlgSet(gdlg, IDC_TAB, "*****", 3)
172  lret = DlgSet(gdlg, IDC_TAB, "*****", 4)
173  lret = DlgSet(gdlg, IDC_TAB, "*****", 5)
174  lret = DlgSet(gdlg, IDC_TAB, "******", 6)
175       lret = DlgSet(gdlg, IDC_TAB, "******", 7)
176       !
177  lret = DlgSet(gdlg, IDC_TAB, IDD_OBSE_DLG, 1)
178  lret = DlgSet(gdlg, IDC_TAB, IDD_CNTR_DLG, 2)
179  lret = DlgSet(gdlg, IDC_TAB, IDD_PHAS_DLG, 3)
180  lret = DlgSet(gdlg, IDC_TAB, IDD_VECT_DLG, 4)
181  lret = DlgSet(gdlg, IDC_TAB, IDD_RANG_DLG, 5)
182  lret = DlgSet(gdlg, IDC_TAB, IDD_3DOB_DLG, 6)
183       lret = DlgSet(gdlg, IDC_TAB, IDD_DISP_DLG, 7)
184  !  Initialize the tab dialog boxes
185  lret = DlgInit(IDD_OBSE_DLG,  gdlg_tab1)
186  lret = DlgSetSub(gdlg_tab1, IDD_OBSE_DLG, ObserverSub)
187  lret = DlgSetSub(gdlg_tab1, IDC_OBSE_LIST, ObseSelSub)
188  lret = DlgInit(IDD_CNTR_DLG, gdlg_tab2)
189  lret = DlgSetSub(gdlg_tab2, IDD_CNTR_DLG, ContourSub)
190  lret = DlgSetSub(gdlg_tab2, IDC_CNTR_LIST, CntrSelSub)
191  lret = DlgInit(IDD_PHAS_DLG, gdlg_tab3)
192  lret = DlgSetSub(gdlg_tab3, IDD_PHAS_DLG, PhaseSpaceSub)
193  lret = DlgSetSub(gdlg_tab3, IDC_PHAS_LIST, PhasSelSub)
194  lret = DlgInit(IDD_VECT_DLG, gdlg_tab4)
195  lret = DlgSetSub(gdlg_tab4, IDD_VECT_DLG, VectorSub)
196  lret = DlgSetSub(gdlg_tab4, IDC_VECT_LIST, VectSelSub)
197  lret = DlgInit(IDD_RANG_DLG, gdlg_tab5)
198  lret = DlgSetSub(gdlg_tab5, IDD_RANG_DLG, RangeSub)
199  lret = DlgSetSub(gdlg_tab5, IDC_RANG_LIST, RangSelSub)
200  lret = DlgInit(IDD_3DOB_DLG, gdlg_tab6)
201       lret = DlgInit(IDD_DISP_DLG, gdlg_tab7)
202  lret = DlgSetSub(gdlg_tab7, IDD_DISP_DLG, DisplaySub)
203       lret = DlgSetSub(gdlg_tab7, IDC_DISP_LIST, DispSelSub)
204          
205       lret = DlgSetSub(gdlg_tab1, IDC_COMBO_OBSE, ObseComboSub)
206  lret = DlgSetSub(gdlg_tab2, IDC_COMBO_CNTR, CntrComboSub)
207  lret = DlgSetSub(gdlg_tab3, IDC_COMBO_PHAS, PhasComboSub)
208  lret = DlgSetSub(gdlg_tab4, IDC_COMBO_VECT, VectComboSub)
209  lret = DlgSetSub(gdlg_tab5, IDC_COMBO_RANG, RangComboSub)
210       !
211  lret = DlgModeless(gdlg, nCmdShow)
212  hWndDlg=gdlg%HWND
213  lret = SetParent(hWndDlg,ghwndLeft)
214    !
215  grleftpos=glleftpos+glwidth+5
216  grtoppos=gltoppos
217  grwidth=mwidth-grleftpos
218  grhight=rects%bottom
219    ghwndRight = CreateWindowEx(  0, lpszRightClassName,lpszAppName,IOR(WS_CHILD, IOR(WS_BORDER,WS_VISIBLE)),         &
220                                 grleftpos,grtoppos,grwidth,  grhight,ghwndMain,NULL,hInstance,NULL)
221    if (ghwndRight == 0) goto 99999
222    lret=ENABLEWindow(ghwndMain,TRUE)
223  ret=EnableMenuItem(ghMenu,IDM_SAVEAS,TRUE)
224    lret=ENABLEWindow(ghwndRight,TRUE)
225  lret=ENABLEWindow(ghwndLeft,TRUE)
226    CALL ActiveMainWnd( )
227   
228  CALL EnableLeftButton(4 )
229         
230  do while( GetMessage (mesg, NULL, 0, 0) )   
231      
232     if((mesg%message.eq.WM_KEYDOWN).and.(hCtrlDlg.eq.0))THEN   
233           call KeyBoardProc(mesg%wParam)
234       else if (( TranslateAccelerator (ghwndMain, haccel, mesg) == 0)                                              &
235            .AND. (TranslateMDISysAccel( ghwndClient, mesg) .EQV. .FALSE.)) then
236       lret = TranslateMessage( mesg )
237           ret  = DispatchMessage( mesg )
238       end if
239    end do
240  RET=DestroyIcon(  LOC(lpszIconName))
241    WinMain = mesg.wParam
242    return
24399999 &
244    ret = MessageBox(ghwndMain, "Error initializing application Chipic3d"C, "Error"C, MB_OK)
245    WinMain = 0
246end

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
楼主
发表于 2018-6-11 18:25:15 | 只看该作者
需要给出更多的代码,比如 hInstance 的定义。
你也可以简化你的代码,把绝大多数不必要的去掉,能重现问题,又尽量简短。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-11 11:06

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表