我是在进行混合语言编程(Matlab 调用c的dll).下面就是在dll编程过程中
出现的问题:
如果我全部用WIN32来做该dll,用windows.h头文件,应该是没有问题的。有默认的命令行build.bat工具。Matlab带的。该工具对win32的程序编译没有问题。
但是我想使用CString class, 因此想以MFC为主,WIN32 API为辅,因此用
stdafx.h作用头文件,同时调用WIN32 API前用“::”符号。
简短程序如下:
DEVMODE devmode;
DWORD iMode;       
BOOL bRetVal;
CString sDevMode[256]; iMode = 0; do
{
bRetVal = ::EnumDisplaySettings(NULL, iMode, &devmode);
iMode++;
if (bRetVal)
{
sDevMode[iMode-1].Format("%d x %d, %d bits %dhz", devmode.dmPelsWidth,
devmode.dmPelsHeight, devmode.dmBitsPerPel, devmode.dmDisplayFrequency);
            
}
}
while (bRetVal);

AfxMessageBox("An error occurred!!!");
    这样通过了编译,但是没有通过link.可能原因是那个命令行build.bat工具是针对WIN32API写的,没有办法对付这样MFC为主的写法。因此出现如下错误:vdGetSupportedResList.bj user32.lib  
   Creating library _lib2890.x and object _lib2890.exp 
nafxcw.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype 
nafxcw.lib(filelist.obj) : error LNK2019: unresolved external symbol __mbctype referenced in function "void __stdcall _AfxAbbreviateName(char *,int,int)" (?_AfxAbbreviateName@@YGXPADHH@Z) 
nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv 
nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc 
vdGetSupportedResList.dll : fatal error LNK1120: 3 unresolved externals --------------------------------------------因此我想请教以下几点:
1。如果要在WIN32程序(比如new project wizard中新开的是个WIN32项目)中调用MFC的东东(非界面,比如CString),应该怎么设置编译呢?(主要是图个方便,好像CString挺顺手的。)
2。如果要在WIN32程序(比如new project wizard中新开的是个WIN32项目)中调用MFC的东东(界面,比如CDialog),应该怎么设置编译呢?(主要是图个方便,MFC设计界面好像挺容易。)上面的matlab给的build.bat工具就是能针对win32程序,但是似乎需要添加点库和命令才能用MFC还请大侠指点。

解决方案 »

  1.   

    看得不太明白呢,你建一个win32 dll的工程,指定需要MFC supported,不行吗?你只在内部代码里面使用mfc,到处的接口中不要有mfc的东西就行能说说build.bat都作了什么工作吗,如果它也是调用ms的编译器和连接器,我想应该没问题的
      

  2.   

    关键是程序是命令行编译的,没有工程。就一个.cpp的程序。
    我没法建立工程阿。对于win32程序,matlab的build.bat都已经包含了需要的库,
    所以我命令行编译那个只有一个.cpp的程序倒也没有问题。但是对于这种需要MFC支持的Win32程序,或者整个就是MFC的程序,
    需要往build.bat作些什么改动呢?Matlab的build.bat(又名MSVC70OPTS.BAT,是用于命令行生成matlab里用的dll的)如下:----------------------------------------------
    @echo off
    rem MSVC70OPTS.BAT
    rem
    rem    Compile and link options used for building MEX-files
    rem    using the Microsoft Visual C++ compiler version 7.0 
    rem
    rem    $Revision: 1.2.4.2 $  $Date: 2003/11/12 12:50:30 $
    rem
    rem ********************************************************************
    rem General parameters
    rem ********************************************************************set MATLAB=%MATLAB%
    set MSVCDir=%MSVCDir%
    set DevEnvDir=%MSVCDir%\..\Common7\Tools
    set PATH=%MSVCDir%\BIN;%DevEnvDir%;%DevEnvDir%\bin;%MSVCDir%\..\Common7\IDE;%MATLAB_BIN%;%PATH%;
    set INCLUDE=%MSVCDir%\ATLMFC\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\PlatformSDK\include;%INCLUDE%
    set LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;%MSVCDir%\PlatformSDK\lib;%MATLAB%\extern\lib\win32;%LIB%rem ********************************************************************
    rem Compiler parameters
    rem ********************************************************************
    set COMPILER=cl
    set COMPFLAGS=-c -Zp8 -G5 -W3 -DMATLAB_MEX_FILE -nologo
    set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
    set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"
    set NAME_OBJECT=/Forem ********************************************************************
    rem Linker parameters
    rem ********************************************************************
    set LIBLOC=%MATLAB%\extern\lib\win32\microsoft\msvc70
    set LINKER=link
    set LINKFLAGS=/dll /export:%ENTRYPOINT% /MAP /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /implib:%LIB_NAME%.x
    set LINKOPTIMFLAGS=
    set LINKDEBUGFLAGS=/debug
    set LINK_FILE=
    set LINK_LIB=
    set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%.dll"
    set RSP_FILE_INDICATOR=@rem ********************************************************************
    rem Resource compiler parameters
    rem ********************************************************************
    set RC_COMPILER=rc /fo "%OUTDIR%mexversion.res"
    set RC_LINKER=set POSTLINK_CMDS=del "%OUTDIR%%MEX_NAME%.map"
    set POSTLINK_CMDS1=del %LIB_NAME%.x
      

  3.   

    创建一个mfc的dll,然后把代码移过去
      

  4.   

    hi, 感谢各位的指点。
    我有一点没有说清楚,抱歉。
    这个build.bat是在matlab里调用mex命令调用的,实际上也就是命令行
    调用compiler和linker。显然我是可以建一个工程,来做dll。但是这样还是在MSVC工程里做的。
    不是命令行调用的。我现在需要请教的是命令行调用的。如何在命令行支持MFC编译呢?有大侠能够修改上面的build.bat里的编译选项吗?
      

  5.   

    在msvc工程中作,然后生成一个make俄文件,最后在build.bat中加入make xxx.mak
    :)
      

  6.   

    建议你是用WTL来做,接口和界面与MFC很像,有CString的类支持,编译结果和Win32相同,不过需要ATL支持
        
        如果仅是数据,可以使用STL的string类
      

  7.   

    我还是想在命令行搞定。不想进入MSVC Project Wizard。 any more ideas?
      

  8.   

    奇怪,只把编译选项从/MD改成了/MT,
    即由
    set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
    set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"变成了如下两行:
    set OPTIMFLAGS=/MT -O2 -Oy- -DNDEBUG
    set DEBUGFLAGS=/MTd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb" 就通过了连接。请大侠讲解一下,是什么缘故呀?但是有如下几个警告,是什么意思呀?
    LINK : warning LNK4089: all references to 'SHELL32.dll' discarded by /OPT:REF 
    LINK : warning LNK4089: all references to 'comdlg32.dll' discarded by /OPT:REF 
    LINK : warning LNK4089: all references to 'ole32.dll' discarded by /OPT:REF
      

  9.   

    上面哪个是连接到多线程的crt库吧,下面的意义是你开启了优化选项,于是一些没有用到dll的隐式链接被去掉了
      

  10.   

    /MD改成了/MT 究竟是什么意思呀?
      

  11.   

    /MT multithreaded 
    /MD Multithreaded dll
      

  12.   

    这就奇怪了。我要做的是DLL,
    但是我用MD就老出我前面报告的错误,把编译选项从/MD改成了/MT,(原件)
    rem ********************************************************************
    rem Compiler parameters
    rem ********************************************************************
    set COMPILER=cl
    set COMPFLAGS=-c -Zp8 -G5 -W3 -DMATLAB_MEX_FILE -nologo
    set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
    set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"
    set NAME_OBJECT=/Fo
    即把上面中的
    set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
    set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"变成了如下两行:
    set OPTIMFLAGS=/MT -O2 -Oy- -DNDEBUG
    set DEBUGFLAGS=/MTd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb" 就不出错了。
    但是最后生成的还是dll,奇怪。