请帮我把下面代码改写成 .dll文件 #include "stdio.h"
#include "windows.h"
extern unsigned int  smpp_init() ;
#pragma pack(push, 1)typedef unsigned int uword32;
typedef unsigned char uword8;typedef struct 
{
    uword32 commandLength; /* 消息包长度,包括此字段 */
uword32 commandID; /* 消息类型  */
uword32 commandStatus; /* 命令成功或失败 */
uword32 sequenceNo; /* 消息序列号,它是消息和它的应答之间的对应标志 */
}MESSAGE_HEAD_T;typedef struct
{
uword8  sourAddrTon; /* 源地址编码类型 */
uword8  sourAddrNpi; /* 源地址编码方案 */
uword8  sourAddrLen; /* 源地址长度 */
uword8  sourAddr[21]; /* 源地址 */
uword8  destAddrTon; /* 目的地址编码类型 */
uword8  destAddrNpi; /* 目的地址编码方案 */
uword8  destAddrLen; /* 目的地址长度 */
uword8  destAddr[21]; /* 目的地址 */
uword8  esmClass; /* 短消息类型 */
uword8  protocolID; /* GSM协议类型 */
uword8  priflag; /* 优先级 */
uword8  registerflag; /* 注册短消息标志 */
uword8  dataCoding; /* 数据编码方案 */
uword8  sm_length; /* 短消息的长度 */
uword8  shortMsg[161]; /* 短消息数据内容 */
}MESSAGE_BODY_T;
typedef struct
{
MESSAGE_HEAD_T messageHead; /* 短消息头 */
MESSAGE_BODY_T messageBody; /* 为SUBMIT_BODY_T的结构类型 */
}SUBMIT_SM_REQ_T;typedef struct
{
MESSAGE_HEAD_T messageHead; /* 短消息头 */
uword32        messageID; /* 短消息ID */
} SUBMIT_SM_RSP_T;typedef struct
{
MESSAGE_HEAD_T messageHead; /* 短消息头 */
MESSAGE_BODY_T messageBody; /* 为SUBMIT_BODY_T的结构类型 */
}DELIVER_SM_REQ_T;typedef struct
{
MESSAGE_HEAD_T messageHead; /* 短消息头 */
uword8            messageID; /* 这里为NULL */
} DELIVER_SM_RSP_T;typedef struct
{
uword8  opCode; /* 1:提交短消息
                 2:下发短消息的响应 */
union
{
SUBMIT_SM_REQ_T   submitSmReq; /*提交短消息*/
DELIVER_SM_RSP_T   deliverSmRsp; /*下发短消息响应*/
}SendMessage;}SEND_MESSAGE_T;typedef struct
{
uword8  opCode; /* 1:接收提交短消息响应
                 2:接收SMC下发短消息 */
union
{
SUBMIT_SM_RSP_T   submitSmRsp; /*接收提交短消息响应*/
DELIVER_SM_REQ_T   deliverSmReq; /*接收SMC下发短消息*/
}ReceiveMessage;}RECEIVE_MESSAGE_T;#pragma pack(pop)extern uword8 SendMessageToSmc(SEND_MESSAGE_T  sendMessagePak);void test(uword8 opcode)
{
    SEND_MESSAGE_T  sendMessagePak;
    uword8          ret=0;
memset(&sendMessagePak,0,sizeof(SEND_MESSAGE_T)); switch(opcode)
{
case 1:
            /* 1:提交短消息*/
            sendMessagePak.opCode=1;
            //sendMessagePak.SendMessage.submitSmReq sendMessagePak.SendMessage.submitSmReq.messageBody.destAddrLen=10;
sendMessagePak.SendMessage.submitSmReq.messageBody.sourAddrLen=10;
sendMessagePak.SendMessage.submitSmReq.messageBody.sm_length=7;
sendMessagePak.SendMessage.submitSmReq.messageBody.sourAddrTon=2;
sendMessagePak.SendMessage.submitSmReq.messageBody.sourAddrNpi=1;
sendMessagePak.SendMessage.submitSmReq.messageBody.destAddrTon=2;
sendMessagePak.SendMessage.submitSmReq.messageBody.destAddrNpi=1;
sendMessagePak.SendMessage.submitSmReq.messageBody.esmClass=1;
sendMessagePak.SendMessage.submitSmReq.messageBody.protocolID=13;
sendMessagePak.SendMessage.submitSmReq.messageBody.priflag=1;
sendMessagePak.SendMessage.submitSmReq.messageBody.registerflag=1;
sendMessagePak.SendMessage.submitSmReq.messageBody.dataCoding=1; memcpy(&sendMessagePak.SendMessage.submitSmReq.messageBody.sourAddr, "0298379005", 10);
memcpy(&sendMessagePak.SendMessage.submitSmReq.messageBody.destAddr, "0298379008", 10);
memcpy(&sendMessagePak.SendMessage.submitSmReq.messageBody.shortMsg, "abcdefg", 7);
ret=SendMessageToSmc(sendMessagePak);
printf("***submit short message!***ret = %d\n", ret);
break;
default:
break;
}
}void test2(uword8 opcode,uword32 seqnum)
{
    SEND_MESSAGE_T  sendMessagePak;
    uword8          ret=0;
memset(&sendMessagePak,0,sizeof(SEND_MESSAGE_T)); switch(opcode)
{        case 2 :
            /*2:下发短消息的响应 */
            sendMessagePak.opCode=2;
sendMessagePak.SendMessage.deliverSmRsp.messageID=2;
sendMessagePak.SendMessage.deliverSmRsp.messageHead.sequenceNo=seqnum;
ret=SendMessageToSmc(sendMessagePak);
printf("***send delivered short message response!***ret = %d\n", ret);
printf("**************************************************\n");
break; default:
break;
}
}void RecvMessageFromSmc(RECEIVE_MESSAGE_T  receiveMessagePak)
{
switch(receiveMessagePak.opCode)
{
case 1:
            /* 1:接收提交短消息响应*/
            //receiveMessagePak.ReceiveMessage.submitSmRsp
printf("***receive submited short message response!***\n");
   break;        case 2 :
            /*2:接收SMC下发短消息 */
//receiveMessagePak.ReceiveMessage.deliverSmReq
printf("***receive delivered short message!***\n"); test2(2,receiveMessagePak.ReceiveMessage.deliverSmReq.messageHead.sequenceNo);
break; default:
break;
}
}void main() 
{    smpp_init(); while(1)
{
Sleep(10000);
test(1);
}// return 0;
}

解决方案 »

  1.   

    1.在每个函数前加上__declspec(dllexport)
    2.文件上面加上这句:
    #pragma comment(linker,"/dll")
    3.添加函数:
    BOOL __stdcall DllEntry(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:break;
    case DLL_THREAD_ATTACH:break;
    case DLL_THREAD_DETACH:break;
    case DLL_PROCESS_DETACH:break;
    }return TRUE;
    }
      

  2.   

    4.再加一句:
    #pragma comment(linker,"/entry:DllEntry")
      

  3.   

    Creating library Debug/test1.lib and object Debug/test1.exp
    test1.exp : warning LNK4070: /OUT:DYNAM.dll directive in .EXP differs from output filename "Debug/test1.dll"; ignoring directive
    test1.obj : error LNK2001: unresolved external symbol "unsigned char __cdecl SendMessageToSmc(struct SEND_MESSAGE_T)" (?SendMessageToSmc@@YAEUSEND_MESSAGE_T@@@Z)
    test1.obj : error LNK2001: unresolved external symbol "unsigned int __cdecl smpp_init(void)" (?smpp_init@@YAIXZ)
    Debug/test1.dll : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe
      

  4.   

    SendMessageToSmc
    smpp_init
    这两个函数你的程序里本身就说是:extern了。
    所以你还需要把它和你原来编译exe需要的库放在一起编译。
      

  5.   

    把lib文件添加到你的工程中,可以省很多事